起動方法の選択

このトピックでは、Service Broker のアクティブ化方法について説明します。

Service Broker は、キューを使用した非同期メッセージングをサポートしています。メッセージ交換が数日、数か月、または数年に及ぶ場合があるので、多くのアプリケーションはアクティブ化を使用して動的に対応しています。ここでは、Service Broker を使用するアプリケーションを起動する一般的な方法について説明します。

起動方法

アプリケーションを起動する方法は、大きく次の 4 つに分類できます。

  • 内部アクティブ化

  • イベントベースのアクティブ化

  • 定期タスク

  • スタートアップ タスク

それぞれの方法には、異なる利点があります。1 つのアプリケーションで複数の方法を組み合わせることもできます。たとえば、アプリケーションで、ほとんどの時間は少数のキュー リーダーで内部アクティブ化を行います。ただし、1 日の特定の時間には、起動するキュー リーダーの数を増やす、といったことが可能です。

内部アクティブ化

Service Broker 内部アクティブ化によって、必要なときにストアド プロシージャを Service Broker キュー モニタから直接アクティブ化できます。多くの場合、この方法が最も簡単です。ストアド プロシージャを直接アクティブ化することにより、アクティブ化を管理するコードをアプリケーションに追加する必要はありません。ただし、内部アクティブ化を行うには、アプリケーションが SQL Server ストアド プロシージャとして記述されている必要があります。内部アクティブ化を使用する場合、処理するメッセージがなくなったときに終了するようなアプリケーションを記述してください。

イベントベースのアクティブ化

一部のアプリケーションは特定のイベントに応答して実行されます。たとえば、コンピュータの CPU 使用率が一定のレベルを下回ったときにアプリケーションを実行できます。また、新しいテーブルを作成するときにログを記録するアプリケーションを実行できます。

Service Broker の外部アクティブ化は、イベントベースのアクティブ化の特殊な例です。外部アクティブ化では、アプリケーションが QUEUE_ACTIVATION イベントに応答して起動されます。

イベントをイベント通知で起動できる場合、イベントベースのアクティブ化と Service Broker の内部アクティブ化を組み合わせることができます。その際、イベント通知を受信するキューに内部アクティブ化を使用します。アクティブ化ストアド プロシージャが通知メッセージを受信してアプリケーションを起動します。

その他のイベントでは SQL Server エージェントを使用して、SQL Server を実行しているコンピュータのジョブを起動できます。リモート コンピュータから Windows Management Instrumentation (WMI) のイベントを監視するアプリケーションを作成できます。アプリケーションでは、SQL Server を実行しているコンピュータで WMI イベントが発生したときにタスクを開始できます。

一般に、イベントベースのアクティブ化を行うときは、処理するメッセージがなくなったときにアプリケーションを終了します。

定期タスク

定期タスクを実行すると、設定したスケジュールに合わせてアプリケーションをアクティブ化できます。この方法は、バッチ処理アプリケーションに向いています。定期タスクとして実行されるアプリケーションは、処理するメッセージがなくなったとき、またはプログラムにより指定された任意の時点で終了できます。

たとえば、仕入れ業者への発注を処理するアプリケーションの場合、日中メッセージを保存しておき夜間に処理することで、仕入れ業者への発注を 1 つにまとめることができます。このようなアプリケーションでは、SQL Server エージェント ジョブにより、毎晩決められた時刻にアプリケーションを起動できます。

スタートアップ タスク

アプリケーションの中には、主にコンピュータまたは SQL Server の起動と同時に一度だけ起動するものがあります。たとえば、SQL Server のスタートアップ ストアド プロシージャ、Windows のスタートアップ グループに登録されたアプリケーション、または Windows サービスなどです。このようなアプリケーションは、実行を継続しながらメッセージが届いたときに処理します。継続的に実行するアプリケーションには、メッセージがキューに届いたときの起動時間が不要です。ただし、メッセージがない場合でもアプリケーションは終了しないので、プログラムで処理する作業がなくてもリソースが消費されます。

この方法は、一定のメッセージ ストリームを処理し、起動時のリソース消費が比較的多いアプリケーションに向いています。