SQL Serverコードを変更してパフォーマンスを向上させるのは大好きですが、コードを調整した後でも、アプリケーションからのユーザータスクのインデックス作成と設計に、予想されるエンドユーザーエクスペリエンスよりも時間がかかる場合があります。これが発生した場合、ユーザーインターフェイスはプロセスが完了するのを待つか、タスクを処理する別の方法を考え出す必要があります。 Service Brokerが提供する非同期処理は、これらのシナリオの多くに最適であり、長時間実行されるタスクのバックグラウンド処理をユーザーインターフェイスとは別に実行できるため、ユーザーはタスクが実際に実行されるのを待たずにすぐに作業を続行できます。 。次のいくつかの記事では、実装の問題なしにService Brokerの機能を簡単に活用できるようにするために、適切な説明とコード例を使用してServiceBrokerを活用する方法に関するシリーズを作成したいと思います。
非同期処理の実行方法
長時間実行されているが、すでに調整されているプロセスに対処するには、いくつかの方法があります。アプリケーションコードは、BackgroundWorker、バックグラウンドThreadPool、または操作を非同期で実行する.NETで手動で記述されたスレッドベースのソリューションを使用するように書き直すこともできます。ただし、これにより、アクティブなプロセスの数を追跡および制限するために追加のコーディング作業が行われない限り、これらの長時間実行されるプロセスを無制限にアプリケーションから送信できます。これは、アプリケーションが潜在的なパフォーマンスに影響を与えるか、負荷がかかった状態で制限に達し、元々防止しようとしていた以前の待機に戻ることを意味します。
また、これらのタイプのプロセスが、処理する情報を格納するために使用されるテーブルに関連付けられたSQLエージェントジョブに変換されることも確認しました。次に、ジョブは定期的に実行されるようにスケジュールされるか、アプリケーションがsp_start_job
を使用して開始します。 変更が処理のために保存されたとき。ただし、SQLエージェントではジョブを同時に複数回実行することはできないため、これでは長時間実行されるプロセスのシリアル実行のみが可能になります。また、ジョブは、複数の行が処理テーブルに入るシナリオを処理するように設計する必要があります。これにより、正しい処理順序が発生し、後続の送信が個別に処理されます。
SQLServerの非同期処理にServiceBrokerを利用すると、非同期処理を処理するための前述の方法の制限に実際に対処できます。ブローカーの実装により、バックグラウンドで非同期処理のために新しいタスクをキューに入れることができ、構成された制限までキューに入れられたタスクの並列処理も可能になります。ただし、制限に達したときに待機する必要があるアプリケーション層とは異なり、ブローカーソリューションは、受信中の新しいメッセージをキューに入れ、現在の処理タスクの1つが完了したときにメッセージを処理できるようにします。これにより、アプリケーションは待機せずに続行できます。
単一データベースサービスブローカーの構成
Service Brokerの構成は複雑になる可能性がありますが、単純な非同期処理の場合は、単一のデータベース構成を構築するための基本的な概念を知っているだけで済みます。単一のデータベース構成に必要なのは次のとおりです。
- 2つのメッセージタイプの作成
- 非同期処理を要求するための1つ
- 処理が完了したときの返信メッセージ用に1つ
- メッセージタイプを使用した契約
- イニシエーターサービスによって送信されるメッセージタイプと、ターゲットサービスによって返されるメッセージタイプを定義します
- ターゲットのキュー、サービス、およびアクティベーション手順
- キューは、イニシエーターサービスによってターゲットサービスに送信されたメッセージのストレージを提供します
- アクティベーション手順により、キューからのメッセージの処理が自動化されます
- 要求されたタスクの処理が完了すると、完了したメッセージをイニシエーターサービスに返します
- http://schemas.microsoft.com/SQL/ServiceBroker/EndDialogおよびhttp://schemas.microsoft.com/SQL/ServiceBroker/Errorシステムメッセージタイプを処理します
- イニシエーターのキュー、サービス、およびアクティベーション手順
- キューは、サービスに送信されるメッセージのストレージを提供します
- アクティベーション手順はオプションですが、キューからのメッセージの処理を自動化します
- 完了したメッセージをターゲットサービスに処理し、会話を終了します
- http://schemas.microsoft.com/SQL/ServiceBroker/EndDialogおよびhttp://schemas.microsoft.com/SQL/ServiceBroker/Errorシステムメッセージタイプを処理します
これらの基本的なコンポーネントに加えて、会話を作成し、ブローカーサービス間でメッセージを送信するためにラッパーストアドプロシージャを使用してコードをクリーンに保ち、会話の再利用またはで説明されている150の会話トリックを実装することで必要に応じてスケーリングを容易にすることを好みます。 SQLCATチームのホワイトペーパー。単純な非同期処理構成の多くでは、これらのパフォーマンス調整手法を実装する必要がない場合があります。ただし、ラッパーストアドプロシージャを使用すると、将来必要になった場合にメッセージを送信するすべてのプロシージャを変更するのではなく、コード内の1つのポイントを変更する方がはるかに簡単になります。
Service Brokerを調べていない場合は、分離処理を非同期で実行して、考えられるいくつかのシナリオを解決する別の方法を提供している可能性があります。次の投稿では、実装例のソースコードを確認し、非同期処理にコードを活用するために特定の変更を加える必要がある場所について説明します。