2016-07-11 2 views
0

クライアントがプログラムにデータを入力するシステムで作業しています。保存処理によって、より時間を要する処理のためにメッセージがactivemqに送信されます。プロセスレコードが一意であることを確認するActiveMQ

レコードがクライアントによって2回連続して更新され、そのactivemqキューのコンシューマが2つのレコードを同時に処理する場合があります。私は、同じアイデンティティを持つレコードを含むメッセージが順番に処理されることを保証する方法を探しています。 ID 1、1、2(その順番)のレコードがactivemqに送信された場合は、1が処理され、2(1がまだ処理中の場合)、最後に1になります。

もう1つの要件ボリュームのために)消費者はマルチスレッドでなければならないため、そのキューにアクセスするスレッドは16個あります。これを考慮する必要があります。

+0

http://activemq.apache.org/how-do-i-preserve-order-of-messages.htmlを見ましたか?私は生産でこれを使用していないので、どのように動作するのか分かりません。 – Lista

答えて

0

そのキューを読み取っているスレッドが複数あり、そのソリューションをActiveMQに近づけたい場合は、注文に関する懸念に関連してどのようにスケールするかについて考える必要があります。

複数の消費者がいる場合、それらは異なる速度で動作し、どの消費者が他の消費者の前に行くのかわからないことがあります。唯一の方法は、単一のコンシューマを用意することです(exclusive-consumersを使用して高可用性を達成することはできます)。

ただし、負荷を別の方法でセグメント化することはできます。あなたのアプリケーションにはどのように多くの依存がありますか?単一のユーザーからの要求が常に同じ「ワーカー・キュー」になることを保証しながら、16個の「ワーカー」キュー(または最大消費者数が何であれ)を作成してこれらのキューに負荷を分散できる場合は、ユーザー。

ユーザをグループに分ける良い方法がない場合は、簡単な解決策としてuserID mod MAX_CONSUMER_THREADSを利用してください。

この問題をコンシューマロジック自体で処理する方が良いかもしれません。順序番号を追跡して、順序のずれた更新を延期するようにしてください(scheduled delayはそのために使用できます)。

関連する問題