ユーザーがキューからメッセージを再生できるようにする再生メカニズムを設計しようとしています。複数のキューと複数のコンシューマーを含むエクスチェンジについて私が思いついた最良の設計は次のとおりです。
次のようなレコーダーサービスを作成します。
サブスクライバーによる再生の要求。
質問:
1。それは理にかなっていますか?
2。私は車輪の再発明をしていますか?ウサギ固有の解決策はありますか?プラグイン?
3。複数の交換を作成することは良い習慣と見なされますか?
このソリューションでは、同じメッセージを公開するために、各キューの交換が作成されます。
別の解決策:
1。キューごとに追加のキュー「ReplayQueue」を作成します。 TTL(1か月としましょう)を設定します。
2。ユーザーがリプレイをリクエストするたびに、ユーザーは自分のReplayQueueから確認せずにリプレイできます。
この解決策は少し問題があります。
- それは理にかなっていますか?
はい
- 私は車輪の再発明をしていますか?ウサギ固有の解決策はありますか?プラグイン?
あなたは車輪の再発明をしているのではありません。 AFAIKには、ウサギのソリューションやすぐに使えるソリューションはありません。
あなたの最初の解決策は私の意見では良いです。 Another solution
は非常に問題があります。なぜなら、健康なウサギは空のウサギであり、ウサギはデータストアではないからです。
公開されたすべてのメッセージをルーティングするキュー(STORE
)があります。 STORE
をすべてのバインドキーでバインドする代わりに、トピック交換の使用を検討できます。その代償として、バインディングキーには. # *
が含まれていてはならず、メッセージがルーティングされるときにわずかなオーバーヘッドが発生します。 STORE
キューは、バインディングキー#
でバインドされます。
firehose をご覧ください。
なぜWebリクエストなのですか? RPC呼び出し でRabbitを使用できます:
reply-to
キュー名が含まれています。キューは、クライアントとリクエスト専用の場合があります。direct-reply-to パターンも確認できます。
- 複数の交換を作成することは良い習慣と見なされますか?
はい、必要に応じてすぐに。あなたの特定のケースでは、私の意見では、加入者ごとの交換は必要ありません。リクエストにはすでにキュー名が含まれています。デフォルトの交換amq.direct
を使用し、ルーティングキーをキュー名と同じにするだけで、このキューに公開できます。エクスチェンジが必要な場合は、一意のエクスチェンジ(「リプレイ」など)を作成し、各サブスクライバーにリプレイキューをこのエクスチェンジにバインドさせます。 「リプレイ」交換は、慣例である場合もあれば、リクエストとともに送信される場合もあります。
最初の解決策は実行可能です。ウサギMQにはtracing plugin
が付属しているため、メッセージをDBに保存するのは、amq.rabbitmq.trace
交換にバインドされたキューから消費するだけなのでさらに簡単になります。
この交換はvhost
に固有であり、すべての仮想ホストには独自のamq.rabbitmq.trace
交換があります。さらに、新しいトレースを作成するときに、トレースを有効にするキュー/交換を制限することができます。これにより、トレースが不要な場合にトレースを無効にする柔軟性が得られます。
トレースを構成するには、次のリンクを参照してください。
https://www.rabbitmq.com/firehose.html
https://www.rabbitmq.com/blog/2011/09/09/rabbitmq-tracing-a-ui-for-the-firehose/