大まかに言うと、次のようなことが起こっています。
- 2 つの SQL Server 2008 R2 SP1 システム (Windows NT 6.1 上の Standard Edition (Build 7601: Service Pack 1)) があり、問題なく動作しており、エラーや問題なく双方向通信を行っています。
- システム #2 が利用できない間に送信された Service Broker メッセージは、システム #2 が復旧するまで、システム #1 でキューに入れられることを期待して、システム #2 を再起動します。
- システム #2 が復旧し、そこにあるすべてのものがエラーなしで正常に開始されます。
- システム #2 のシステム #1 でキューに入れられたメッセージはキューに入れられたままになります。送信されることはありません。さらに、その会話の新しいメッセージもキューに入れられ、送信されません。
- 新しい会話で送信されたメッセージは問題なく送信されます。
送信されないメッセージの詳細:
A. システム #2 がダウンしている間、キュー内のメッセージの Transmission_status は、期待どおりシステム #2 と通信できないことを示すさまざまなエラーを示します。
B. システム #2 が復旧した直後に、これらのメッセージの Transmissions_status が空白になります。この時点以降、ブランクのステータスは変化しません。
C. メッセージが積み重なる会話が CONVERSING/CO 状態にある。システム ビューの列は、正常に動作している他のキューとの違いを示していません。(フラグが異なって設定されているのを見つけることができれば、不適切な会話を終了する必要があることがわかりますが、システムは手がかりを提供しません。これは、増え続けるキューの深さ以外にはありません。)
D. システム #2 でメッセージが受信されることはありません。つまり、アクティベーション ストアド プロシージャがこれらのメッセージに対して呼び出されることはありません。
E. Profiler (すべての Broker トレース タイプがオンになっている) では、適切な会話により、次のものがログに記録されていることが示されます。
Broker:Conversation CONVERSING 1 - SEND Message Initiator
Broker:Message Classify 2 - Remote Initiator
[SQL Batch complete; SQL that caused the SEND to occur]
Broker:Remote Message Acknowledgement 1 - Message with Acknowledgement Sent Initiator
Broker:Message Classify 1 - Local Initiator
Broker:Conversation CONVERSING 6 - Received Sequenced Message Target
Broker:Remote Message Acknowledgement 3 - Message with Acknowledgement Received Initiator
Broker:Activation Microsoft SQL Server Service Broker Activation 1 - Start
スタックする運命にある送信中のメッセージは、これらのイベントの最初の 2 つだけを示します。
Broker:Conversation CONVERSING 1 - SEND Message Initiator
Broker:Message Classify 2 - Remote Initiator
私が知る限り、これらのメッセージが到達するのはこれだけです。SQL Server がそれらを再度送信しようとする兆候はありません。システム #1 は会話がまだ良好であると考えていますが、システム #2 はそれを完全に忘れています。システム #1 はこれを理解していないようです。その後、システム #1 を再起動すると、すべてが正常に戻り、すべてのメッセージが意図したとおりに流れます。
これらのメッセージは実際に送信されたと考えていますが、確認応答がシステム #1 に返されていません。しかし、確認応答のキューがバックアップされているという証拠は見当たりません。
両側で多数の典型的な問題を確認しました。
ブローカーは両側で有効になっています。2. すべてのキューがオンで、すべての適切なもの (エンキュー、受信) が有効になっています。キューは汚染されません。3. 私たちが知っている権限の問題はありません。4. ファイア アンド フォーゲットを使用していません。5. さまざまな人が勧めているように、会話を再利用しています。(実際、会話の再利用がここでの問題です!) 6. SQL 例外をトラップし、指示どおりにトランザクションを使用します。 7. ssbdiagnose はエラーを返しません。
SQL Server ホストが再起動されると、キューに入れられたメッセージが最終的に送信されると予想されますが、そうではありません。ここで何が起こっているのですか??