2012-04-04 11 views
1

JMS(Java Messaging System)に似た独自のSOAスタイルのメッセージングシステムを作成する方法が不思議です。データベースに格納されているが複数のサービスで処理されたメッセージを同期する方法

MOM(メッセージング指向ミドルウェア)は、メッセージを単一のデータベースに格納する必要がありますが、スケーラビリティとフェールオーバーのために複数のサービスによって処理される可能性があります。次のように

私は初歩的なメッセージテーブルを定義しています

  1. メッセージIdはint型
  2. CreateTimeStamp日時
  3. DeliveredTimeStamp日時
  4. ペイロードvarchar型(最大)
  5. 有効期限日時
  6. RetryCountのint型
  7. Co rrelationId INT
  8. 状態INT(1-待つ、2プロセッシング、3-送信され、5-失敗4リトライ)
  9. * ProcessIdLock int型 - これは、メッセージを処理しているメッセージングサービスのプロセス IDであります

問題は、1つのサービスが各メッセージを一度に処理することを保証する方法です。

私はこのような仕組みを考えていた:

  1. はレコードロックを実行します。UPDATEメッセージはProcessIdLock = MessageProcessorId、SETステート= 2を設定する - WHERE メッセージId IN( SELECT TOP 10のMessageIdからの処理メッセージ 期限< GETTIME()+ CreateTimeStamp と状態= 1 - OR状態= 3待機 - リトライ)

    上記ステップをあろうG時間

  2. で単一 サービスによって処理するための10件のメッセージまでらは、ロックされたレコードを取得します。 状態= 2のメッセージの中から選択ペイロード - のための処理やProcessIdLock = MessageProcessorId

  3. の更新状況を処理された各メッセージ:UPDATEメッセージ
    SET状態=(合格、不合格、または再試行)、SET DeliveredTimeStamp = GETDATE() - パスのみWHEREのMessageId = ProcessedMessageId

注:私が持っているもう一つの問題は、idによってグループ化されたいくつかのクライアントにブロードキャストされるメッセージがあることです(つまり、100のクライアントが存在するかもしれませんが、各クライアントグループは10以下です)。

たとえば、グループに5つのクライアントが存在し、現在2つのクライアントが切断されている場合はどうなりますか?彼らが戻ってきたときにそのメッセージを送ってみたいと思います。

1人のクライアントが再接続することがあります(メッセージを受け取る必要があります)。もう1人のクライアントは再接続しない可能性があります(メッセージがメッセージの有効期限後に削除されます)。

ありがとうございます。私にとって典型的な企業の問題のようです。 MSMQが最適なソリューションになるでしょうか?私はMSMQを初めて使用していますか?MSMQメッセージはストレージに保存されているのか、メモリに保存されていますか?

答えて

2

私はそれがあなたの質問に直接答えないと知っていますが、私は非常に強くここに車輪を改革しないことをお勧めします。信頼性と耐久性がありスケーラブルなメッセージングシステムを作成することは、軽く行うべきことではありません。代わりに、既存のオープンソースの実装、例えばNServiceBusを調べることをお勧めします。

+0

おそらくMSMQを含むNServiceBusや他のものについては分かりませんが、複数のサービスで特定のメッセージを処理できるシステムが必要です。アタッチされたすべてのリスニング・サービスがメッセージを処理すると、そのメッセージをデータベースから削除できます。 私が行ったことは、Messages、Services、およびServiceMessagesテーブルを作成することでした。次に、LEFT OUTER JOIN ...を使用します。WHERE ServiceMessagesは処理を確認するためにNULLです。 メッセージが読み込まれて処理されると、処理されたことを示す項目がServiceMessagesテーブルに追加されます。 – NickV

0

私はDavid Nelsonに同意します。本当に良い理由がない限り、私は既存のソリューションを見ていきます。 NServiceBusに加えて、MassTransitをチェックアウトすることもできます。

関連する問題