6

さまざまな通知のためにサーバーにメッセージを送信する必要があるクライアント アプリケーションがあります。クライアントが時々接続して実行できるようにするために、メッセージ キュー アプローチを使用します。キュー処理は、メッセージをキューから取り出し、別のキューに配置して最終的に処理する Web サービスを呼び出します。この質問はクライアント環境に関するものです。サーバー環境はすでに決まっています。

MSMQ を適切にインストール/構成し、セキュリティで保護するためにすべてのクライアント PC を制御できないため、MSMQ を使用したくありません。また、MSMQ キューの内容を調査するためのツールの品質のために、サポートがより困難になるためです。 . SQL Server 2005 Express はすべてのマシンにあり、アプリケーションのデータを格納するために使用されます。

私は現在、2つのオプションにそれを持っています:

  1. メッセージをシリアル化した後にテーブルに格納し、ThreadPool.QueueUserWorkItem各メッセージ タイプに対して構成されたハンドラーによってメッセージを処理するために使用する、かなり基本的な永続的なメッセージ キューを記述します。すべてが含まれているSystem.Transactions.TransactionScopeため、正常に処理された場合にのみ永続キューから削除されます。
  2. ローカル データベースを使用する Service Broker トランスポートを使用して、クライアントで NServiceBus (これはチームとして使用したサービス バスであるため、MassTransit などはオプションではありません) を使用します。

私はサービス バスの経験がほとんどないため (サービス バスの用語はまだよくわかりません)、必要な方法で要件を満たすはるかに単純なものを作成する場合と比較して、学習曲線が心配です (展開は大きな考慮)。

誰か考えがありますか?

4

3 に答える 3

2

MSMQ を提案するかどうかはわかりませんが、「自分で作成する」ために考えるべき多くのエッジ ケースがあることを提案します。

スレッド プール アプローチを使用しても、順序の問題が発生する可能性があることに注意してください。スレッド プールが作業項目を処理する方法が原因で、スレッド プールに連続してポストされた 2 つの項目が順番に実行されない場合があります。

また、メッセージの永続性、メッセージが存在する期間、「致命的な」配信不能ステータスを検出する方法、およびその場合の対処方法についても考慮する必要があります。

メッセージをキューに入れているのとほぼ同時にアプリがダウンするシナリオには、いくつかの潜在的なエッジ ケースもあります。はい、キューの承認を確認できますが、無限に確認サークルに入ることができます...

アプリが接続されたことを検出し、その時点ですべてのデータを送信しないのはなぜですか?

于 2009-12-23T23:48:45.567 に答える
2

独自のサービス バスを作成したので、それは簡単な作業ではなく、他のすべての実装者が既に遭遇したのと同じエッジ ケースに遭遇することになります。kyoryu は 2 つの非常に重要なものを取り上げます。

独自に展開するかどうかは、社内で持っているスキルと、将来的にソリューションを維持するために必要なスキルにも依存します。

もう 1 つの考慮事項は、システムの最終的な規模と、その信頼性の要件です。社内ソリューションは十分に拡張できますか?

ZeroMq (トランスポート)、Cassandra (ピア検出と永続化)、および Protobuf (シリアライゼーション) に基づくピアツーピア メッセージ バス、Zebus。

  1. クライアントは単なるライブラリであるため、クライアントの展開はありません
  2. Cassandra を使用してメッセージの永続性も提供され、さまざまなエッジ ケースを処理します (これは、本番環境で定期的にテストされています)。
  3. 優れたパフォーマンスを発揮し、ブローカーレス ソリューションであるため、単一のパフォーマンス ボトルネックはありません。
  4. Cassandra などの利用可能なデータ ストアでディレクトリを使用できるため、単一障害点はありません。

これはオープン ソースであり、本番環境でテスト済みですhttps://github.com/Abc-Arbitrage/Zebus

于 2016-05-13T08:31:46.043 に答える
0

最後に、イベントが発生し、別のスレッドがメッセージを処理するように通知される前に、メッセージがシリアル化されて SQL Server データベース テーブルに保存されるように、独自の SqlTransport で構成された基本的なメッセージバスを作成しました。

于 2009-10-13T11:10:46.370 に答える