Microsoft ON ― 出張ワークショップ ― [コース: B3] .NET Framework 2.0 分散アプリケーション開発 (参加者向け) 第1章 理想の分散アーキテクチャ “強いシステム” とはどのようなシステムか ソフトウェア品質の全体像 (ISO 9126) 非機能的要件 機能的要件 ソフトウェアでは、目に見えづらい非機能要件が多数潜在しています これら非機能要件のすべてを都度要件定義で決めることは事実上困難です 機能性 合目的性 正確性 相互運用性 セキュリティ 標準適合性 使用性 理解性 習得性 運用性 信頼性 成熟性 障害許容性 回復性 効率性 時間効率性 資源効率性 保守性 解析性 変更性 安定性 試験性 移植性 環境適応性 設置(配置)性 置換性 要件の定義 (都度実施) 方法の規定 アーキテクチャの規定 資源再配置 負荷分散 アプリケーション配布 二重化 非同期処理 トランザクション管理 認証 XX メッセージング • より見えづらい データ移行 セキュリティ • より定義しづらい • より実装が難しい 相互接続 • よりトラブルを起こしやすい 、、、、、、 運用と拡張性を考慮した ”強い” 実装の探求 Windows DNA (1997年~) アプリケーション同士が密接に連携し、変更・再配置などにも考慮した分散 Web アプリケーション構築のためのアーキテクチャを提唱 (その後のMicrosoftの分散 アプリケーションの考え方のベース) データなどの内部実装(例:ファイルからデータベースへの変更、など)に非依存 サービスのプラグイン、拡張が可能な、成長型のアーキテクチャ 運用と拡張性を考慮した ”強い” 実装の探求 より “接続性” を重視した .NET Framework 次世代システム Capabilities クライアント/サーバー VB、第 4 世代言語 分散システム レガシー システム連携 ダム端末 COBOL 集中管理 Web アプリケーション CGI, Java, ASP 3 階層分散システム システム間連携 PC CUI C スタンドアロン Time サービス間連携(商用 Web サービス、など) マルチ デバイス対応 運用と拡張性を考慮した ”強い” 実装の探求 分散アーキテクチャ(DNA思想) + .NET Framework スケーラブルな再利用シナリオ(例:全社規模の共有、社外サービスの接続、等) オープンで標準化された接続(SOAPなど)、さまざまなデバイスに対応、オフラインシナ リオへの対応、、、 など ユーザデバイス UIP Webファーム プレゼンテーション (第3章) Biz ロジック DB アクセス サービス Agent DB クラスタ 外部サービス アプリケーションファーム ビジネスロジック (第3章) データ (第2章) 第2章 データ層とデータアクセス実装 データアクセスの2つのモデル なぜ、非接続型なのか(その背景) 時代に適した新しいデータアクセスの必要性 ホスト/バッチ クライアント - サーバ Web 接続 接続 接続 接続 接続 接続/切断 データ取得後の柔軟な活用 (DBと切り離しポータブルに扱える) 抽出 コピー 挿入 変更 バインド データベース非依存コードと依存コードの明確な分離 (SQL 89/92/99, 独自関数, etc) 例: update test set col1 = nvl(val, ‘no item’); 接続/切断 ADO.NET の接続型と非接続型 方法の相違 接続型データアクセス 非接続型データアクセス データ操作 ( プロバイダに 依存しない 処理 読 み 込 み ) 追 加 変 更 削 除 デ ー タ 更 新 コピーされたインメモリデータベース (DataSet, DataTable) DataAdapter デ ー タ 更 新 データソース (SQL Server, Oracle, など) 切 断 接 続 デ ー タ 検 索 Update 読 み 込 み 追 加 変 更 削 除 Fill 接 続 デ ー タ 検 索 ) (SQL Server, Oracle, OLE DB, など) データ操作 ( プロバイダに 依存した 処理 切 断 データソース (SQL Server, Oracle, など) ADO.NET の接続型と非接続型 使用するクラスの相違 接続型データアクセス 非接続型データアクセス DataSet DataTable DataView プロバイダに 依存しない 処理 DataRelation DataRow, DataColumn ..... コピーされたインメモリデータベース (DataSet, DataTable) OLE DB 用 Oracle 用 サードベンダなどで 独自に拡張可能 プロバイダに SQL Server 用 SqlConnection 依存した 処理 (SQL Server, Oracle, OLE DB, など) SqlCommand ..... SqlDataReader SqlDataAdapter ..... データソース (SQL Server, Oracle, など) SqlCommandBuilder データソース (SQL Server, Oracle, など) ADO.NET 非接続型の実装概念 Fill メソッド DataAdapter/TableAdapter オブジェクトにSQLクエリ(または ストアドプロシージャ)の Command を設定 ① コマンド設定 ② Fill メソッド実行 SelectCommand InsertCommand DataSet Update メソッド UpdateCommand DataAdapter TableAdapter DeleteCommand DataBase ADO.NET 非接続型の実装概念 Update メソッド DataAdapter/TableAdapter オブジェクト の更新コマンドを設 定(更新コマンドの設定詳細は後述) Fill メソッド実行 DataSet ②Update メソッド SelectCommand InsertCommand UpdateCommand DataAdapter TableAdapter DeleteCommand ① コマンド設定 DataBase ADO.NET 非接続型の実装概念 RowState による状態管理 Fill 直後の DataTable RowState Column1 Column2 Unchanged 1 Dog Unchanged 2 Cat Unchanged 3 更新後の DataTable 更 新 Snake RowState Column1 Column2 Unchanged 1 Dog Modified 2 Lion Deleted 3 Snake Added 4 Cow 関連 Method • CancelEdit 直前の行の更新を キャンセル • RejectChange 一連の更新処理を 元に戻す • AcceptChange 一連の更新処理を 確定する ADO.NET その他の実装 パラメータの使用 Parameterオブジェクトを使用することで、単なる文字列置換でな い、意味的な引数管理をおこなう CommandText のSQL文中で、パラメタ位置を指定 SqlClient では @xxxx で指定、OleDb では ? で指定 Parameterオブジェクトを使ってパラメータをアタッチ Parameter object をAdd Value プロパティにパラメータの内容(入力引数)を設定 ‘SQL Server Client Dim cmd As New SqlCommand( “select * from authors where au_id = @au_id”, conn ) cmd.Parameters.Add(“@au_id”, SqlDbType.VarChar, 11) cmd.Parameters(“@au_id”).Value = “172-32-1176” : ‘ OLE DB Client Dim cmd As New OleDbCommand( “select * from authors where au_id = ?”, conn ) cmd.Parameters.Add(“au_id”, OleDbType.VarChar, 11 ) cmd.Parameters(0).Value = “172-32-1176” : ADO.NET その他の実装 ストアドプロシージャの使用 非接続型においても、コマンドに “ロジック” を実装 できるため有用 パラメータのない簡単なストアドプロシージャの実装方法 CommandText プロパティ、CommandType プロパティを設定 Dim cmd As New SqlCommand(conn) cmd.CommandText = “MyProcedure” cmd.CommandType = CommandType.StoredProcedure conn.Open() SqlDataReader dr = cmd.ExecuteReader() : パラメータを持つストアドプロシージャの実装方法 Direction プロパティ (Output / Input / ReturnValue) でさまざまな引数を指定 Dim cmd As New SqlCommand(conn) Dim param As New SqlClient.SqlParameter cmd.CommandText = “MyProcedure” cmd.CommandType = CommandType.StoredProcedure cmd.Parameters.Add(“@Param1”, SqlDbType.Int).Value = 3 param.Direction = ParameterDirection.ReturnValue param.ParameterName = “@ReturnValue” param.SqlDbType = SqlDbType.Int cmd.Parameters.Add(param) : 入力パラメータの場合 返り値の場合 マネージコードの SQL Server ストアド実装 SQL CLR の利用 優位点 ストアドプロシージャから、通常のマネージ実装同等のコード を実装可能 ADO.NET から都度接続する方法と比べ、DB接続などの オーバーヘッドを軽減 (また、 SQL Server と同一のプロセス内で実行) 留意点 但し、CLR上で実行されるため、極端にレスポンスにクリティカ ルな繰り返し処理などでは、T-SQL が優位 (CLR 上の型変 換などのオーバーヘッドが若干有) データアクセスにおける実装上の留意点 接続プールへの配慮 Connection オブジェクトの接続文字列ごとに接続プー ルがキャッシュされる 例:“Server=(local);DataBase=Pubs;…” Max値、Min値などを指定可能。ログインのトレースなどで最 適化する 接続プールの動きを理解することが重要 Connection String が完全に一致している場合のみ、 Connection がプールされる 但し、SQL Server の Windows 統合認証では、接続文字列 が同じでもユーザごとにプールが作成されるので注意する ADO.NET 2.0 では、接続プールの実行時の制御が 可能 (ClearAllPoolsメソッド、など) データアクセスにおける実装上の留意点 オプティミスティックな同時実行の制御 “非接続” モデル固有の設計上の課題 一般的解決策として、複数名での更新排他の制 御を更新コマンド(Insert/Update/Delete)として 実装 UpdateCommand の実装例 Update Seat Set State = “occupied” where Id = @ID 更新 (ID = 5) 更新 (ID = 5) 遅い者勝 ち! Update Seat Set State = “occupied” where (Id = @ID) and (State = “empty”) データアクセスにおける実装上の留意点 移植性への配慮(プロバイダ非依存な実装) 方法1: System.Data.Common 名前空間とDbProviderFactory を使用 (ADO.NET 2.0の新機能) ‘ プロバイダ依存な記載 Dim dataFactory As DbProviderFactory = DbProviderFactories.GetFactory("System.Data.SqlClient") ‘ 以降、プロバイダ非依存な記載 Dim cmd As DbCommand = conn.CreateCommand() cmd.CommandText = "SELECT Name FROM Sales.Store WHERE CustomerID = @CustomerID" Dim param As DbParameter = dataFactory.CreateParameter() param.ParameterName = "@CustomerID" param.Value = txtCustomerID.Text cmd.Parameters.Add(param) Dim customerName As String = cmd.ExecuteScalar() 方法2: インタフェースへのキャストを使用 ‘ プロバイダ依存な記載 IDbConnection con = new SqlConnection(“Server=(local);Integrated Security=SSPI;Database=northwind”); ‘ 以降、プロバイダ非依存な記載 string sqlStr = "SELECT id, name FROM TestTable"; IDbCommand cmd = con.CreateCommand(); cmd.CommandText = sqlStr; con.Open(); IDataReader dr = cmd.ExecuteReader(); メッセージキュー メッセージキューの役割 信頼性の確保 ネットワークや送信先のアプリケーションの状態にかかわらず、メッセージ配 信が保証される 応答性の確保 メッセージキューの非同期メッセージングを活用することで、複数のアプリ ケーションを非同期に動作可能。 またネットワークトラフィックなどを考慮し、転送時間などをアプリケーション側 で制御可能 (夜間のバッチ転送など) 処理A 処理A DB 注文処理 処理B 処理B このような場合、アプリケーションの再稼動時に メッセージを送信する必要がある DB メッセージキュー メッセージキューの利用手順 キューを作成する(静的 or 動的) パブリックキュー : ネットワーク全体に発行 プライベートキュー : ローカルコンピュータのみ キューへのプロパティ設定 メッセージを送信するアプリケーションと受信するアプリケーショ ンを作成する 特別な処理を必要とする場合はシステムキューを利用する 配信不能キュー、ジャーナルキュー等 トランザクションの管理 2.0 で追加された System.Transaction System.Transaction を使用すると、 TransactionScope を使用したプログラミングモデルを使用可能 SQL Server 2005 では、状況に応じ、LTM から DTC (OleTx) に自動 的に昇格 ネイティブ トランザクション System.EnterpriseServices (OleTx ,DTC) System.Transaction VS スケーラブルでない! 分散環境に未対応 オーバーヘッド大 (遅い!) マルチリソースに未対応 Using tx As New TransactionScope() Dim MyCon As SqlConnection = New SqlConnection("server=MyServer; " & _ "database=AdventureWorks;user id=MyUser; password=MyPassword") MyCon.Open() : Dim RecNum As Integer = MyCommand.ExecuteNonQuery() MyCon.Close() tx.Complete() End Using 第3章 ビジネスロジックの分離と XML Web サービスの活用 XML Web サービスの利用 型指定された DataSet を使用する “型指定された DataSet” とは? テーブル名等を事前に取り込んで作成されたDataSet DataSet クラスの派生クラスとして独自に生成したクラス WebMethod は標準的なDataSetを使用可能である が、“型指定されたDataSet” を使うと、、、 曖昧さを排除できる スキーマ定義を通し、他環境との相互運用が可能となる (型指定していない DataSet は Microsoft 独自) ソースの可読性が向上する 型指定されていない場合: 型指定されている場合: ds.Tables[“customer”].Rows[5][“name”] ds.customer[5].name その他: IntelliSense が利用可能、コンパイル時のチェッ クによるエラー発生率が低下、パフォーマンスの向上、な ど XML Web サービスの利用 XML Web サービスによる検索・更新の実装 WebMethod の返り値/引数の双方に、型付データセットを使 用可能 更新頻度によっては、通信データ量を考慮し、データセットの GetChanges メソッドなどを使用 (但し型付データセットへのキャスト が必要なので注意) Web サービスの実行OSユーザは、アプリケーションプールの アイデンティティユーザで実行 (Windows 統合認証によるDB 接続の際は、コネクションプール管理、権限等に注意する) 管理と安定性に配慮して、アプリケーションプールを構成 ワーカープロセスを分離 (個別のリソースプランを指定可) システム規模に応じ Web ガーデンを構成可 例外は、SoapException に変換され、XML にシリアル化され る(開発者は .NET Framework の通常の例外処理でハンドリ ングできる) セキュリティの実装 XML Web サービスにおける認証と暗号化(1) スケーラブルな実装シナリオ(例:社外からの接続、一般消費 者向けサービス、など)では特に配慮が必要 XML Web サービスでは、フォーム認証は使用不可 基本認証 ダイジェスト認証 統合 Windows 認証 クライアント証明書を利用した認証 認証機構の実装には、XML Web サービス側は構成を変更し (実装コードの変更は不要)、クライアント側はコードを記述 Dim ws As New localhost.Service() ws.Credentials = New System.Net.NetworkCredential(TextBox1.Text, TextBox2.Text) 認証をカスタムコードで構築することも可能 (但し、カスタム Http Module を作成する必要があり非常に面倒) セキュリティの実装 XML Web サービスにおける認証と暗号化(2) SSL (Secure Socket Layer) による暗号化機構の実装 セッション層で処理される公開鍵/秘密鍵方式による暗号化方式 (HTTPS プロトコルを使用) 暗号化で使用する公開鍵はブラウザ側で保持。 また、複合化で使用する秘密鍵はサーバ側で保持。 サーバ(IIS)側は必要事項を入力し、認証局(CA)に証明書を要求す る (Web サイトの [プロパティ] 画面の [ディレクトリセキュリティ] タブ) サーバ(IIS)側に、認証局(CA)から電子メールで発行されたサーバ証 明書をインストールする ブラウザに、認証局(CA)から取得したルート証明書をインストールす る (著名なものは、通常、ブラウザに組み込まれている) 第4章 プレゼンテーションの実装 .NET におけるプレゼンテーション実装の種類 用途に応じた .NET 実装 Office アプリケーション Windows フォーム PocketPC/デバイスアプリケーション Web フォーム (及び モバイルWebフォーム) ビジネスユーザ 向き コンシューマ向き Office アプリケーション リッチ (高機能なUI) Windows フォーム with “Atlas” Web フォーム リーチ(環境やアプリへの依存性が低い) DataSet のオフラインシナリオの実装 アプリケーションの形態ごとに準備された手段 デバイス Office アプリケーション アプリケーション 方法 XMLシリアル化 Cachedデータ DiffGram のサポート ○ ○ - ドキュメント(ブッ ク)のトップレベル でしかサポートしな いため、Sheetオブ ジェクトなどで使用 する場合は、トップ レベルでオブジェク トを宣言し参照する その他 留意事項 Web フォーム 基本的に、オフラインはサポートしない (但しサーバ側での Read/Write は可能) Windows フォーム Windows フォームの難読化 Windows フォーム配置の際の留意点 .NET アプリケーションであるか否かに関係なく、原則 として、クライアントアプリケーションに重要情報など は含めない 特に .NET アプリケーションでは逆アセンブリが容易 アプリケーション要件の理由で重要情報を含める必要 がある場合は、可能な限りクライアントの難読化と文 字列の暗号化をおこなう 難読化したアプリケーションの ClickOnce による配置 も可能 ステートレスなHTTPへの配慮 XML Web サービス/Web フォーム利用時の留意点 XML Web サービスにおいては、基本は、WebMethod 単位の ルートトランザクションとしてしか機能できないので注意 ルートトランザクションとして、DTC (EnterpriseServices) を使用可能 WebMethodAttribute の TransactionOption を設定する 可能な限り、1 メソッドは1 つの完結した操作として実装(デザイン) Web フォームにおいては、毎回、DataSet のメモリの内容は 破棄されるので注意 DataGrid などへの表示情報(及び内部のオリジナルデータなど)は、 すべて ViewState にストックされている このため、カスタムのデータメソッド(EditCommand、 UpdateCommandなど)の実装では、Session や ViewState に退避し たり、DataSet などを再度 Fill (データを再構築) したりする必要がある リソースやパフォーマンスに配慮したカスタムなバインド処理で は、ObjectDataSource の利用も効果的 Web フォームのセッション管理 ASP.NET で進化したセッションコントロール 従来のセッション管理 ② セッション作成 (タイムアウト時間設定) ① サーバ接続 セッション ③ セッションIDの書き込み Webサーバ (次回以降、このIDでセッション を識別) Webブラウザ この方式の問題点 Web ファーム構成でセッションを管理する場合は自前の作りこみが必要 プロセスに依存したセッションでスケーラビリティがない セッションID を Cookie へ書き込むため、Cookie の有効/無効などブラ ウザの設定状態に依存して動かなくなる など ASP.NET のセッション管理 コンフィグレーション(web.config)の設定で、これらをすべて解消 まとめ 便利さの裏に隠れているもの 知れば知るほど深い、、、 .NET .NET は、開発者に、煩わしい内部処理から開放された新しい 開発フレームワーク (ASP.NET、ADO.NET、etc) を提供 .NET のより深遠な技術を理解しコントロールすることで、分散 システムという領域まで拡張可能、 Business • フレームワークとしての便利さ • ビジネスロジックへの集中(煩わしさからの解放) •よりハイレベルなコントロール Technology リソースコントロール、セッションコントロール、 セキュリティ、チューニング、 など システムの規模・厳格性 Windows による 可用性(非ダウンタイム)実績の一部抜粋 クラスタ構成 シングルサーバ構成 Tarbus 99.999 % HotBot.com 99.99 % Morigaga Ramp 99.999 % Buy.com 99.98 % FreeMarkets.com 99.999 % Bames & Noble.com 99.98 % VirtualBank 99.999 % CBSMarketWatch.com 99.98 % 例えば、Bames&Noble など、計画停止を含めても 98.55 % (停止が年間 5 日程度) 技術情報リソース 「300 秒でズバリ !!」&「10 行でズバリ !!」シリーズ: http://www.microsoft.com/japan/msdn/thisweek/300x10/ Step 7 シリーズ 「分散アプリケーション開発編」: http://www.microsoft.com/japan/msdn/thisweek/step7/defa ult.aspx Microsoft patterns & practices: http://msdn.microsoft.com/practices/ マイクロソフトのコンサルタントが執筆! 『.NET エンタープライズWebアプリケーション 開発技術大全』(全5巻) © 2006 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.
© Copyright 2024 ExpyDoc