特定のソースに関連するイベントを処理している状況があります。各ソースにはキーまたはIDがあり、これをハッシュとして使用できます。各ソースからのイベントを順番に処理する必要がありますが、異なるソースからのイベントを並列化して水平スケーラビリティを実現できます。何百ものソースキーがあります。一貫性のあるハッシュ交換でバインドされた期限切れキューのデッドレターメッセージ
メッセージをRabbitMQに送信するときに、ルーティングキーの一部としてキーを設定してから、consistent-hash-exchange
を使用して、同じソースのイベントが同じキューにルーティングされるようにする予定です。私は、消費者からプライベートキューを動的にバインドすることを考えていました。これは、TTLを使用することで(コンシューマがダウンした場合に正常に削除されるように)考えていました。最初は冗長性のために2〜3人の消費者しかいませんが、メッセージの数が増えたためにスケールアップしたい場合は、別のコンシューマーを始めることができます。
私の質問は、コンシューマがダウンしてキューにメッセージがあるとどうなりますか?理想的には、キュー内のメッセージをconsistent-hash-exchange
(別のキューにルーティングする)(元のキューはもう存在しないため)に交換し直す必要があります。
RabbitMQのドキュメントdead letteringでは、コンシューマキューのTTLのシナリオ、またはキューが削除されたときの動作については明記されていません。
私のアプローチは意味がありますか?特定のルーティングキーによる注文を維持しながら、私が探しているコンシューマーフォールトトレランスを実現するにはどうすればよいですか?
注:デッドレターメッセージをExchangeにルーティングする過程で、もともと期限切れのキューにルーティングされていた新しいメッセージが、別のコンシューマにルーティングされる場合は、したがって、特定のインスタンスで順序が崩れます。
ご返信ありがとうございます。頻度に関しては、ピーク時にかなりの数のメッセージです。私はこれを少し工夫しているかもしれません。私が探しているのは、消費者が消えたら、メッセージの自動再ルーティングの一種です。キューTTLよりも短いメッセージTTLを持つことができると思います。そのため、コンシューマが切断されると、メッセージがDLXされてからキューTTLの有効期限が切れて削除されます。はい、同じソースキーからの新しいメッセージでDLXされたメッセージと競合状態を注文する問題はまだあります。 – jbx
ようこそ。私が言ったように、私は消費者のためのウォッチドッグでこれを "消費側で"解決するだろう。あなたは、順番に処理を続けるために消費者が欲しいと思っているだけでなく、あなたはそれを実行したい:) – cantSleepNow
私の心配は、消費者を実行しているマシンが死んで、数分以上回復する必要がある場合はどうなるでしょう。公平であるように、キューが比較的短いTTL(例えば30秒)を有し、消費者が再接続しない場合、30秒分の新しいメッセージが潜在的に存在する。キューのTTLが切れる前にメッセージが最後に来る可能性があるので、私がDLXingで持っているhyphothesisは機能しません。あるいは、クライアントの切断直後にキューを削除して、少数のメッセージしか失われないようにすることもできます。メッセージを失うことは理想的ではありません。 – jbx