2

バックグラウンド:

MassTransit に基づくメッセージング サブシステムがあります。それはうまく機能し、小さな問題だけで何千ものメッセージを送り出します. これまで、失敗したメッセージは自動的にxxx_errorキューにプッシュされていました。これもうまくいきます。

メッセージ キューを覗いて、失敗したメッセージを再送信するための独自の Web ベースの管理コンソールさえありました。このツールはBusDriverの例に基づいており、MSMQ で直接動作します。メッセージをコピーしてからxxx_errorxxx送信します。

現在の状況:

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 );

これについてコメントをお寄せいただきありがとうございます。

4

1 に答える 1

0

私はしません。

管理コンソールがどれだけのことを行っているかはわかりませんが、RabbitMQ のコンソールはメッセージをキューからキューに移動する以外はすべて実行できます。私は自分でその機能を探しており、そのために特別に使用できるスクリプトがあることを願っています。

心に留めておくべき注意点の 1 つは、エンドポイント != コンシューマーであるという事実です。エンドポイントはそのバス上のすべてのコンシューマーにサービスを提供します。エンドポイント アドレスは簡単に保存して再発行できますが、個々のコンシューマーはそうではありません。

人々が提案するのは、冪等の消費者です: http://en.wikipedia.org/wiki/Idempotence#Computer_science_meaning

アップグレードを検討しているルーティング情報を確立するために静的型付けが採用されているため、消費者が特定のメッセージを購読していないことを心配する必要はありません。アップグレード プロセスの一環として、これらのメッセージに注意してください。

于 2013-02-27T20:16:15.860 に答える