2016-09-27 4 views
1

は私がこれらのRabbitMQで複数のコンシューマを持つキューのタスクオーダー処理を保証するにはどうすればよいですか?

AとBの間の友情を終了したいと

AとBの間の友情を開始したいと言うが、私は、複数の消費者(労働者)を持つキューに送信する二つのタスクです。

私は保証処理注文をしたいので、最初の作業の前に2番目の作業を避けるにはどうしたらいいですか?

私のソリューション:make tasks sticky(Aに関するタスクは常に同じコンシューマに送信されます)。

実装:RabbitMQの交換番号を使用し、利用可能なコンシューマにタスクを割り当てます。

Aをコンシューマにマップするにはどうすればよいですか?私はnginxのip_hashについて考えている。私は似たものが必要だと思う。

関連性があるかどうかわかりませんが、AとBはuuid.v4() UUIDです。

マッピングを行うために必要なアルゴリズムを教えてください。

答えて

0

さて、2つのオプションがあります。

  1. は、すべてのイベントの1つの交換/キューを作成し、それらが適切な順序で挿入するつもりだことを保証します。それらのために1人のワーカーを作成します。これは、データを挿入する際のコストが高くなります(スケーラビリティのオプションはありません)。
  2. このような状況に備えてアプリを準備します。あなたがメッセージを得ると破壊する友情と友情は存在しない - 将来の友情の終わりを含むdbにメッセージを保存する。そうすれば、複数の労働者が友情を作り破壊することができ、適切な秩序を気にする必要はありません。単純にあなたの仕事をして、友人を作り、友情の終わりについての行がDBにあれば - それを破壊する(または単に作成しないでください)。もちろん、作成/破壊時間のタイムスタンプをチェックし、破壊時間が作成時間後であるかどうかをチェックする必要があります。

もちろん、A/Bのハッシュを何とか数えることができますが、IMOの方がコストがかかります。 excahnges/queuesを使ってアプリケーションをスケーリングするのは本当に良いことではありません - あなたはより多くのキューを作り、それはrabbitmqのあまりにも多くのキュー/エクスチェンジで終わります。

指定したソリューションを使用する必要がある場合は、たとえばAとBからcrc32を数え、キューのタスクを送信する値calcalateを使用できます。しかし、複数の消費者がいると、ここで間違っているかもしれません。消費者の一人が何とかブロックされ、他の人が友情を破壊してメッセージを受け取るとどうなりますか?このソリューションを使用すると、A/Bのグループごとに1人以上の作業者を持つことは危険であると言えます。

+0

ご返信ありがとうございます。私はAに関係する仕事が常に同じ労働者に送られることを確かめたい。だから私は5人の労働者がいる場合、私はちょうどAのために常に同じワーカーIDを返すマッピング関数が必要です。なぜこのアプローチはキュー/交換をあまりにも多くもたらすのですか? –

+0

スケーラビリティ。あるワーカーの仕事が多すぎる場合は、ワーカーとキュー/交換を追加する必要があります(1つのキューに1人のワーカーが必要です)。十分な労働者がいない場合は、追加のワーカーとキューを追加する必要があります。さらに追加して追加する...キューごとに複数のワーカーがある場合は、キューではなくワーカーだけを追加します。 – sokoli

+0

マッピング関数を使用する場合は、たとえば5を法とするcrc32を使用できます。結果はワーカーIDになります。追加の作業者は、追加のキューも意味します(それほど良くないほど)。 – sokoli

関連する問題