2016-11-30 12 views
3

断続的なRabbitMQ接続の問題やRabbitMQの完全な停止を処理するために、MassTransitをフォールトトレラントに設定する適切な方法は何ですか? 2つの異なるマシン間にRabbitMQクラスタを設定し、すべてをミラー化するようにHAを設定しました。また、F5ロードバランサをアクティブ/パッシブモードに設定して、すべてのトラフィックがプライマリノードに送信されるようにしますが、ヘルスチェックが失敗した場合、セカンダリノードにフェールオーバーします。私は、このようなフェールオーバー後のクライアント接続が成功し続けることを期待していますが、ここで問題が発生しています。無結局など、Client.Requestを公開 -MassTransit RabbitMQの処理方法

RabbitMQ connection failed: Connect failed: myrabbithost.mycompany.com:5671/ 

これらのエラーは何の活動が起こっていない場合であっても発生しない:私はプライマリノード上のRabbitMQを停止すると、クライアントアプリケーションは次のようになりMassTransitエラーの束の記録を開始しますエラーはMassTransitが接続を断念して停止し、クライアントアプリケーションがクラッシュします。 MassTransitのソースを見ると、RabbitMqReceiveTransport.Receiveが「RetryUntilCancelled」メソッド内でこれらのエラーを生成していると思います。内部ConnectionRetryPolicyを使用しているようですので、そこに設定できるものがありますか?

私は、Global.asaxで私のバスインスタンスをインスタンス化しています。起動して、IISが稼動している限りメモリ内に保持しています。これが問題であるかどうかはわかりません。 Unityコンテナを使用したMassTransitのドキュメントを見ると、UnityがデフォルトでTransientLifetimeManagerを使用するようにして、コンテナがそれを解決するたびにバスインスタンスを分解して再作成することが推奨されているようです。

+0

使用しているMassTransitのバージョンは何ですか? – sagar

+0

私はMassTransit 3.4.1を使用しています。 – Andy

+0

プロセスの寿命の間、バスを生かしておくことは正しいです。一時的であってはなりません。また、ブローカが利用可能になると再接続する必要があります。 –

答えて

0

これらのクライアントがクラッシュし、私はこのようTask.Waitを()を使用したために起こった。これに代えて

Task.Run(() => bus.Publish(new TestMessage { Id = num })).Wait(); 

Task.Run(() => bus.Publish(new TestMessage { Id = num })); 

.WAIT(なし)、クライアントが起動したままRabbitMQがダウンしても。問題は、RabbitMQがダウンしていてもF5がセカンダリノードにフェールオーバーする前に送信されたメッセージが失われることです。

関連する問題