最近、私たちのウサギクラスターに人為的に負荷がかかるため、私たちの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が発生します。
私の質問は、タイムアウトを検出して失敗する正しい方法です(メッセージにデータを収集して後で再ポストするバックアップメカニズムがあります)。これが正しい場合、どうすればそれを動作させることができますか?
私たちはサーガを使用して、他のすべてのサービスが登録メッセージを送信し、その後、毎分pingを受けるサービスを提供しています。応答がない場合は、何らかの理由でサービスのステータスを「停止」に設定し、見た目が必要なユーザーに電子メールを送信します。これは、あなたが記述したものを含む多くの問題を解決します。 –