9

Service Broker の会話グループについて誰か説明できますか?

現在、サービス ブローカーを使用して、ある SQL サーバーから別の SQL サーバーにメッセージを送信しています。送信側サーバーでは、受信側で順次処理されるようにメッセージを関連付けようとしています。ドキュメントに基づくと、会話グループはこれに最適なようですが、受信サーバーでは、メッセージの送信時に指定した会話グループとは別の会話グループにメッセージが割り当てられます。

Web を検索したところ、この動作が意図されているように見えることがわかりました ( http://social.msdn.microsoft.com/forums/en-US/sqlservicebroker/thread/baf48074-6804-43ab-844a-cb28a6dce02b/ ) 、しかし、( http://msdn.microsoft.com/en-us/library/ms178624.aspx)からの構文の有用性について混乱しています

WAITFOR( 
  GET CONVERSATION GROUP @conversation_group_id FROM [dbo].[ReceiveQueue]
)

会話グループが送信者からのメッセージに遭遇せず、同じ会話グループ ID で送信されたメッセージが受信側で同じ会話グループ ID を持っていない場合、上記のコードのポイントは何ですか?

4

1 に答える 1

25

会話グループは、ロックに使用されるローカル プリミティブです。会話グループ内のメッセージには順序の保証がなく、会話グループはネットワーク上を流れません。

メッセージの順序は、会話内で Service Broker によって保証されます。したがって、処理中の相関メッセージの順序を保持するには、それらを同じ会話で送信します。

会話グループは、互いに関連する一連の会話をグループ化するために必要です。GET CONVERSATION GROUP動詞と動詞の両方RECEIVEは、会話グループ全体をロックすることを保証するため、他のスレッドが関連するメッセージを処理するのを防ぎます。たとえば、旅行サイトを考えてみましょう。ホリデーパッケージの予約リクエストを含むメッセージを受け取ります。その結果、ホテル予約サービスとの会話を開始して部屋を予約するリクエストを送信し、航空会社予約サービスとの会話を開始して旅行の予約を依頼し、レンタカー代理店サービスとの会話を開始して予約を依頼します。車の予約。作成されたこれら 3 つの新しい会話はすべて、要求が受信された最初の会話と同じグループにあります (アプリケーションは、WITH RELATED_CONVERSATIONそれらの 3 つすべてのBEGIN DIALOGの句)。次にコミットし、キュー内のメッセージの処理に進みます。これら 3 つの相関するリクエストからのその後のレスポンスは、ほぼランダムなタイミングで受信され始めます。ホテルの応答が最初に来るとしましょう。メッセージはアプリケーションによって取得され、ホテルからの応答でリクエストのステータスを更新します。同時に、航空会社の応答が届きます。別のスレッドがそれを取得することを許可されている場合、同じスレッドのステータスを更新しようとしますその結果、ホテルの応答を処理しているスレッドがブロックされたり、デッドロックが発生したりすることさえあります。ホテルの応答が処理されると、スレッドがコミットされ、会話グループ全体のロックが解除され、任意のスレッド (それ自体を含む) が航空会社の応答を取得して処理できるようになります。

于 2009-08-21T20:43:13.143 に答える