1

別のアプリケーションから発行されたイベントをリッスンするために EasyNetQ を使用する .NET アプリケーションがあります。アプリケーションは SignalR を使用して、受信したイベントをダッシュ​​ボードに発行し​​ます。

octopus deploy を使用してアプリケーションをデプロイしていますが、問題は、アプリケーションの新しいバージョンがデプロイされるたびに、バスに投稿されたすべてのメッセージを受信しなくなることです (すべてではなく一部を取得しているようです)。同じ ID を持つ複数のサブスクライバーを持つことについて読んだことがありますが、これが問題であると推測しています。

メッセージを「失う」ことを避けるために、これをどのように処理すればよいですか?

また、同じアプリケーションの異なるインスタンス (たとえば、同じウサギの mq インスタンスに対して作業している複数の開発者) を実行し、すべてのクライアントがすべてのメッセージを受信するにはどうすればよいでしょうか?

4

1 に答える 1

2

複数のフロントエンド インスタンスがあり、EasyNetQ を SignalR の「バックプレーン」として使用する場合は、サブスクライバー ID (=キュー名) がインスタンスごとに一意であることを確認してください。

負荷分散された IIS サーバーの場合は、たとえばマシン名を含めることができます。または、最小限の量のメッセージを見落としたい場合は、プロセス ID を含めることができます。(IIS では、たとえばリサイクル中に、同じ AppPool に対して複数のプロセスがアクティブになる可能性があります)。

私は常にキューの TTL を 5 分程度に設定しているので、キューが孤立してしまうことはありません。

サブスクリプションで WithExpires を指定することで、キューの TTL を設定できます。たとえば、次のようになります。

    var subscriptionId = $"{Environment.MachineName}[{Process.GetCurrentProcess().Id}]-mymessage";
    Bus.Subscribe<MyMessage>
    (
        subscriptionId, 
        message => Console.WriteLine(message.ToString()), 
        subscriptionConfig => subscriptionConfig
          .WithExpires((int)5.Minutes().TotalMilliseconds)
    );

AutoSubscriber を使用すると、同様のオーバーロードがあります

于 2016-12-16T08:36:21.783 に答える