JMS(Java Messaging System)に似た独自のSOAスタイルのメッセージングシステムを作成する方法が不思議です。データベースに格納されているが複数のサービスで処理されたメッセージを同期する方法
MOM(メッセージング指向ミドルウェア)は、メッセージを単一のデータベースに格納する必要がありますが、スケーラビリティとフェールオーバーのために複数のサービスによって処理される可能性があります。次のように
私は初歩的なメッセージテーブルを定義しています
- メッセージIdはint型
- CreateTimeStamp日時
- DeliveredTimeStamp日時
- ペイロードvarchar型(最大)
- 有効期限日時
- RetryCountのint型
- Co rrelationId INT
- 状態INT(1-待つ、2プロセッシング、3-送信され、5-失敗4リトライ)
- * ProcessIdLock int型 - これは、メッセージを処理しているメッセージングサービスのプロセス IDであります
問題は、1つのサービスが各メッセージを一度に処理することを保証する方法です。
私はこのような仕組みを考えていた:
はレコードロックを実行します。UPDATEメッセージはProcessIdLock = MessageProcessorId、SETステート= 2を設定する - WHERE メッセージId IN( SELECT TOP 10のMessageIdからの処理メッセージ 期限< GETTIME()+ CreateTimeStamp と状態= 1 - OR状態= 3待機 - リトライ)
上記ステップをあろうG時間
で単一 サービスによって処理するための10件のメッセージまでらは、ロックされたレコードを取得します。 状態= 2のメッセージの中から選択ペイロード - のための処理やProcessIdLock = MessageProcessorId
の更新状況を処理された各メッセージ:UPDATEメッセージ
SET状態=(合格、不合格、または再試行)、SET DeliveredTimeStamp = GETDATE() - パスのみWHEREのMessageId = ProcessedMessageId
注:私が持っているもう一つの問題は、idによってグループ化されたいくつかのクライアントにブロードキャストされるメッセージがあることです(つまり、100のクライアントが存在するかもしれませんが、各クライアントグループは10以下です)。
たとえば、グループに5つのクライアントが存在し、現在2つのクライアントが切断されている場合はどうなりますか?彼らが戻ってきたときにそのメッセージを送ってみたいと思います。
1人のクライアントが再接続することがあります(メッセージを受け取る必要があります)。もう1人のクライアントは再接続しない可能性があります(メッセージがメッセージの有効期限後に削除されます)。
ありがとうございます。私にとって典型的な企業の問題のようです。 MSMQが最適なソリューションになるでしょうか?私はMSMQを初めて使用していますか?MSMQメッセージはストレージに保存されているのか、メモリに保存されていますか?
おそらくMSMQを含むNServiceBusや他のものについては分かりませんが、複数のサービスで特定のメッセージを処理できるシステムが必要です。アタッチされたすべてのリスニング・サービスがメッセージを処理すると、そのメッセージをデータベースから削除できます。 私が行ったことは、Messages、Services、およびServiceMessagesテーブルを作成することでした。次に、LEFT OUTER JOIN ...を使用します。WHERE ServiceMessagesは処理を確認するためにNULLです。 メッセージが読み込まれて処理されると、処理されたことを示す項目がServiceMessagesテーブルに追加されます。 – NickV