2016-06-23 5 views
2

プロダクトの購入/キャンセルに関するメッセージを待ち行列に送り、それに基づいて製品の在庫状況をカウントします。EMSのコンシューマーとディストリビューターの実装方法

誤った順序で複数のコンシューマで処理された場合、在庫状況の計算が間違っています。

問題は、処理されている1つの製品に関連するすべてのメッセージを、どのコンシューマで処理されるかの順番に争いたいと思っていることです。

誰かが私にそれを行う方法を提案することができます。

現在私が使用しているツールは、TIBCO EMS、C#Windowsサービスです。

答えて

1

私はそれが競合する消費者やシーケンスを混合するために、すべて実現可能であることを確認していない...しかし、ここであなたを刺激かもしれない二つのオプションです:

オプション

はOK ...私はここでは多くのことを推測しています。

と仮定:

  • あなたは安全のために競合する消費者を必要とする(例:最初の1の故障)、共有をロードしません。 (:メッセージセレクタ、トピックなどEX)あなたは、プロセスの順序と競合する負荷分散が正常に互換性がないので、あなたは別のメカニズムを導入していない限り、私は、これらの仮説を作る必要があります順次

扱われたすべてのメッセージを必要とする

  • すべてのことは、キューを「排他的」に設定していると言いました。複数のクライアントが接続している場合は...本当に1つしかメッセージを受信しないため、処理の順序が間違っていることはありません。 「競合する」(待機中の)クライアントは、最初のクライアントが失敗した場合にのみ使用されます。

    オプションB

    OK ...私は上記の間違っていたとあなたは本当に同時に処理するために、複数のクライアントが必要であり、さらに特定の製品に関連したメッ​​セージのために主張すれば...これを試してください:

    送信アプリケーションで、各メッセージに製品番号のJMSヘッダーが設定されていることを確認してください。その後、非排他的キュー(デフォルト)で新しいヘッダー(例:productID = 1234)に結び付けられたメッセージセレクターで複数のクライアントを設定できます。その場合、クライアントは実際には競合していませんが、少なくとも負荷を共有しており、プロダクトIDに関するすべてのメッセージを順番に処理しています。欠点は?メッセージセレクタは、すべての製品IDをカバーしなければなりません。

    オプションC

    オプションCと同様に

    、あなたは複数のキュー(例:製品カテゴリ)に生成物を分離でき、順番にすべてのメッセージを処理し、各カテゴリのONEクライアントを持っています。その場合、クライアント上にメッセージセレクタは必要ありません。しかし、ソートメカニズム(トピック+メッセージセレクタとESBまたは送信者のソート自体)を導入する必要があります

  • 0

    問題の解決策のもう1つはシーケンシングキーを使用することです。あなたはJMSキューレシーバ

    Sequencing Key

    の[その他]タブでキーの値を指定することにより、シーケンスを使用することができます
    関連する問題