2017-01-06 4 views
0

最近、私たちのウサギクラスターに人為的に負荷がかかるため、私たちのAPIの1つが応答しなくなったところで停止しました。モノラル(.NET)のスレッドが不足し、APIへのリクエストが失敗しました。これが再び起きることはまずありませんが、これに対して何らかの防御を施したいと考えています。理想的には、bus.Publish()の呼び出しには一定の時間が経過した後にタイムアウトすることがありますが、どのように練習することはできません。.NETアプリケーションで応答しないRabbitMQを検出して処理する

これで、RabbitMQのブロックされた接続通知機能が表示され、これが役立つと考えられました。しかし、IServiceBusにある接続オブジェクトを取得する方法を理解することはできません。これまでに試したことがあります

_serviceBus = serviceBus; 
     var connection = 
      ((MassTransit.Transports.RabbitMq.RabbitMqEndpointAddress) _serviceBus.Endpoint.Address) 
       .ConnectionFactory.CreateConnection(); 
     connection.ConnectionBlocked += Connection_ConnectionBlocked; 
     connection.ConnectionUnblocked += Connection_ConnectionUnblocked; 

しかし、これを実行するとわかりませんが、BrokerUnreachableExceptionが発生します。

私の質問は、タイムアウトを検出して失敗する正しい方法です(メッセージにデータを収集して後で再ポストするバックアップメカニズムがあります)。これが正しい場合、どうすればそれを動作させることができますか?

+0

私たちはサーガを使用して、他のすべてのサービスが登録メッセージを送信し、その後、毎分pingを受けるサービスを提供しています。応答がない場合は、何らかの理由でサービスのステータスを「停止」に設定し、見た目が必要なユーザーに電子メールを送信します。これは、あなたが記述したものを含む多くの問題を解決します。 –

答えて

0

System.TimerまたはObservable.Timerを組み合わせてチェックをスケジュールしたり、リクエスト - レスポンスを使用してチェックすることができます。リクエストのコンシューマは同じプロセス内にある必要があります。 Requestコールに合理的なタイムアウトを設定してキャンセルトークンを指定すると、メッセージングインフラストラクチャがダウンしているか、ビジー状態になっているか、エンドポイントがビジー状態になっています。

関連する問題