バックグラウンド:
MassTransit に基づくメッセージング サブシステムがあります。それはうまく機能し、小さな問題だけで何千ものメッセージを送り出します. これまで、失敗したメッセージは自動的にxxx_error
キューにプッシュされていました。これもうまくいきます。
メッセージ キューを覗いて、失敗したメッセージを再送信するための独自の Web ベースの管理コンソールさえありました。このツールはBusDriverの例に基づいており、MSMQ で直接動作します。メッセージをコピーしてからxxx_error
再xxx
送信します。
現在の状況:
RabbitMQ への移行を検討しています。より高速でスケーラブルなようです。しかし、もちろん、MSMQ 管理コンソールは役に立たなくなります。RabbitMQ キューで動作する別のバージョンのコンソールを作成するのは好きではありません。むしろ、失敗したメッセージを MSMQ トランスポートに依存しない独自のリポジトリに入れる一般的なルートを使用したいと考えています。
簡単ですね。ここで、具体的な質問があります。
失敗したメッセージのリポジトリには、(他の属性とともに) メッセージ本文とメッセージ サブスクライバー名が含まれます。後で、リポジトリに移動し、メッセージをデシリアライズして、特定のサブスクライバーに再送信できます。
ただし、メッセージが以前に失敗したサブスクライバーではなく、すべてのbus.Publish( msg )
サブスクライバーに再度ヒットするため、これは望ましくありません。必要なのは、メッセージを正確に 1 人のサブスクライバーに再送信することです。
これは次の方法で可能と思われます:
senderbus.GetEndpoint( new Uri( "rabbitmq://servername/subscriber1" ) ).Send( msg );
また
senderbus.GetEndpoint( new Uri( "msmq://localhost/subscriber1" ) ).Send( msg );
(使用するトランスポートによって異なります)。このアプローチでは、メッセージは特定のサブスクライバーのみに配信されます。
質問は:
これは推奨されるアプローチでしょうか?どのような代替手段がありますか?
考えられる問題は、このアプローチではおそらく現在のサブスクリプションに関する情報が無視され、メッセージがサブスクライバー キューに直接配信されることです。ただし、サブスクライバーは、このタイプのメッセージをサブスクライブしなくなる可能性があります。したがって、コードはおそらく次のようになります。
if ( subscriber1 still subscribes to messages of msg.GetType() ) <- how do to this?
senderbus.GetEndpoint( new Uri( "rabbitmq://servername/subscriber1" ) ).Send( msg );
これについてコメントをお寄せいただきありがとうございます。