パーシステントメッセージング/サービスバス-自分で転がしたり、学習曲線を危険にさらしたりしませんか?
-
06-07-2019 - |
質問
さまざまな通知のためにサーバーにメッセージを送信する必要があるクライアントアプリケーションがあります。クライアントが時々接続して実行できるように、メッセージキューアプローチを使用します。キュー処理はメッセージをキューから取り出し、最終的に処理するために別のキューに配置するWebサービスを呼び出します。この質問はクライアント環境に関するものです。サーバー環境はすでに決定されています。
MSMQを適切にインストール/構成およびセキュリティ保護するためにすべてのクライアントPCを制御することはできず、コンテンツを調査するためのツールの品質のためにサポートがより難しいため、MSMQを使用したくないMSMQキューの。 SQL Server 2005 Expressはすべてのマシンにあり、アプリケーションのデータを保存するために使用されます。
現在、2つのオプションがあります:
- メッセージをシリアル化した後、テーブルにメッセージを保存する非常に基本的な永続メッセージキューを作成し、
ThreadPool.QueueUserWorkItem
を使用して、各メッセージタイプに対して設定されたハンドラーで処理します。これらはすべてSystem.Transactions.TransactionScope
内にあるため、正常に処理された場合にのみ永続キューから削除されます。 - ローカルデータベースを使用するService Brokerトランスポートで、NServiceBus(これはチームとして行ったサービスバスなので、MassTransitなどはオプションではありません)をクライアントで使用します。
私はサービスバスの経験がほとんどないので(まだサービスバスの用語はまだわかりません)、必要な方法で要件を満たすはるかに単純なものを書くことに比べて、学習曲線が心配です(展開は大きな考慮事項です)。
何か考えがありますか?
解決 3
最終的に、独自のSqlTransportで構成された基本的なメッセージバスを作成し、イベントが発生してメッセージを処理するための別のスレッドに信号が送られる前に、メッセージがシリアル化されてSQL Serverデータベーステーブルに保存されるようにしました。
他のヒント
まあ、私はMSMQを提案するつもりはありませんが、「独自のロール」について考える多くのエッジケースがあることを提案します。
スレッドプールアプローチを使用する場合でも、気になる場合は順序の問題があることに注意してください。スレッドプールの処理方法により、スレッドプールに順番に投稿される2つのアイテムが順番に実行されない場合があります 作業項目。
メッセージの持続性、メッセージの存続期間、「致命的な」未配信ステータスの検出方法、およびその場合の対処方法についても考慮する必要があります。
また、アプリがメッセージをキューイングするのとほぼ同時にダウンするシナリオには、潜在的なエッジケースがいくつかあります。たとえば、メッセージがキューイングされたとしても、メッセージがキューイングされたという確認を取得できない場合があります。はい、キューの確認応答を確認することはできますが、確認のサークルに入ることは無限にできます...
アプリが接続されたことを検出して、その時点ですべてのデータを送信するだけではどうですか?
独自のサービスバスを作成したので、それは簡単な作業ではなく、他のすべての実装者が既に遭遇したのと同じエッジケースに遭遇するでしょう。 kyoryuは2つの非常に重要なものを呼び出します。
自分でロールバックするかどうかは、社内にあり、将来ソリューションを維持するために必要なスキルにも依存します。
もう1つの考慮事項は、システムの最終的な規模とその信頼性の要件です。社内ソリューションは十分に拡張できますか?
ZeroMq(トランスポート)、Cassandra(ピアの検出と永続化)、およびProtobuf(シリアル化)に基づくピアツーピアメッセージバスZebus。
- クライアント上の単なるライブラリであるため、クライアントの展開はありません
- メッセージの永続性もCassandraを使用して提供され、さまざまなエッジケースを処理します。 (これは本番環境で定期的にテストされています)
- パフォーマンスが良く、ブローカーレスソリューションであるため、パフォーマンスのボトルネックは1つもありません
- Cassandraなどの利用可能なデータストアでディレクトリを使用できるため、単一障害点はありません
オープンソースであり、実稼働テスト済みです https://github.com/Abc-Arbitrage/Zebus