1

8 台のサーバーで構成される分散アプリケーションがあり、すべてが .NET Windows サービスを実行しています。各サービスは、使用可能なワーク パッケージのデータベースをポーリングします。

ポーリング メカニズムは、別の理由からも重要です (現時点ではあまりにも退屈です)。

.NET サービスはすべてデータベースを定期的にポーリングし、負荷がかかっているときはデッドロックが発生しないようにするため、このポーリング メカニズムはキューに実装するのが最適であると考えています。

私は、各 .NET サービスでメッセージを入力キューに入れたいと考えています。データベース サーバーは、入力キューの各メッセージを一度に 1 つずつポップして処理し、応答メッセージを別のキューに書き込みます。

私が抱えている問題は、SQL Server Broker (SSB) のほとんどの例がデータベース サービス間であり、.NET クライアントから開始されていないことです。SQL Server Broker は、この仕事に適したツールではないのではないかと考えています。ブローカーの T-SQL DML は .NET から入手できるようですが、これが機能すると思われる方法は SSB には適合しないようです。

2 つのキュー (インとアウト) と 1 つのアクティベーション ストアド プロシージャを備えた単一の SSB サービスが必要になると思います。

これは SSB の動作とは異なるようです。何か不足していますか?

4

1 に答える 1

0

ほぼ正しい絵が完成しましたが、その絵には欠けているパズルのピースがいくつかあります。

  • SSB は主に通信テクノロジであり、完全にトランザクション方式で、完全に 1 回限りの順序でメッセージを配信するように設計されています。ネットワーク接続 (認証、トラフィックの機密性と整合性)、確認応答、および送信の再試行ロジックを処理します。
  • 内部アクティベーションは、常駐サービスがキューをポーリングする必要がないという点で独自のテクノロジです。ポーリングでは、負荷が軽い場合に低レイテンシー低リソース消費に必要な動的バランスを達成することはできません。ポーリングは、高レイテンシー (リソースを節約するために頻繁にポーリングしない) または高いリソース使用率 (低レイテンシーを提供するために頻繁にポーリングする必要がある) のいずれかを強制します。内部アクティベーションには、負荷のスパイクに対応するために、より多くのプロセッサーを起動する自己調整機能もあります (max_queue_readers)同時に、プロセッサを非アクティブ化することにより、低負荷での処理を調整することができます。内部アクティベーション メカニズムの見過ごされがちな利点の 1 つは、データベース内に完全に含まれているという事実です。クラスターまたはデータベース ミラーリングのフェールオーバーでフェールオーバーし、バックアップおよびコピー/アタッチ操作でデータベースと共に移動します。外部アクティベーションメカニズムもありますが、一般的に、内部コンテキストに適合するものについては、内部アクティベーションの方がはるかに好まれます (たとえば、エンジン プロセスの外部で処理する必要がある HTTP リクエストではありません...)
  • 会話グループのロックも一意であり、相関メッセージ処理への排他的アクセスを提供する手段です。アプリケーションは、 をビジネス ロジック キーとして使用することで利用できますconversation_group_id。これにより、負荷の高いマルチスレッドでも、デッドロックがほぼ完全に解消されます。

また、Service Broker について誤解した問題が 1 つあります。それは、応答を別のキューに入れる必要があることです。よく知られているほとんどのキュー製品とは異なり、SSB プリミティブはメッセージではなく「会話」です。会話は、完全二重の双方向通信チャネルであり、TCP ソケットのように考えることができます。SSB サービスは「応答をキューに入れる」必要はありませんが、代わりに、受信したメッセージの会話ハンドルで応答を送信するだけで済みます (同じソケットで asendを発行して TCP ソケット サーバーで応答するのと同じように)。新しいソケットを開いて応答を送信することによってではなく、から要求を取得しました)。さらに、SSB は固有のメッセージ相関を処理します。送信者は、応答が送信した要求に属していることを正確に知ることができます。応答は、要求が送信されたのと同じ会話ハンドルで返されるためです (TCP ソケットの場合と同様に、クライアントは、リクエストを送信したのと同じソケット)。この会話ハンドルは、関連する会話グループの相関ロックに関しても重要です。上記のリンクを参照してください。

SQLCLR を使用して、Service Broker の処理に .Net ロジックを埋め込むことができます。ほとんどすべての SSB アプリケーションは、直接的または間接的に (たとえば、トリガーを介して) 少なくとも一方の端に非 SSB サービスを持っています。完全にデータベースに含まれる分散アプリケーションはほとんど役に立ちません。

于 2012-10-16T11:28:04.240 に答える