2017-01-06 5 views
0

Wir hatten kürzlich einen Ausfall, bei dem eine unserer APIs nicht mehr reagierte, da unser Kaninchen-Cluster künstlich stark belastet wurde. Wir hatten keine Threads mehr in Mono (.NET) und Anfragen an die API fehlgeschlagen. Auch wenn dies unwahrscheinlich ist, möchten wir etwas Schutz dagegen einlegen. Idealerweise würden wir Anrufe nach einer bestimmten Zeit an bus.Publish() senden, aber wir können nicht wie.Erkennen und Behandeln von nicht reagierenden RabbitMQ in .NET-Anwendung

Wir stießen dann auf die Funktion der gesperrten Verbindungen von RabbitMQ und dachten, dies könnte helfen. Wir können jedoch nicht herausfinden, wie wir das Verbindungsobjekt im IServiceBus erreichen können. So weit haben wir versucht

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

Aber wenn wir dies tun, erhalten wir eine BrokerUnreceivableException, die ich nicht verstehe.

Meine Fragen sind, ist dies der richtige Ansatz, Timeouts zu erkennen und scheitern (wir haben einen Backup-Mechanismus, um die Daten in der Nachricht zu sammeln und später erneut zu veröffentlichen) und wenn das richtig ist, wie können wir es machen?

+0

Wir haben einen Dienst, bei dem alle anderen Dienste eine Registrierungsnachricht senden und anschließend jede Minute mit einer Sage gepingt werden. Wenn es aus irgendeinem Grund keine Antwort gibt, setzen wir den Service-Status auf "down" und senden eine E-Mail an denjenigen, der es sich ansehen sollte. Dies löst viele Probleme, einschließlich der von Ihnen beschriebenen. –

Antwort

0

Ich glaube, Sie dies durch die Kombination von verwalten können System.Timer oder Observable.Timer Prüfungen zu planen, und die Prüfung, die Anfrage-Antwort verwenden. Der Konsument für die Anfrage sollte sich im selben Prozess befinden. Sie können ein Abbruch-Token mit einem angemessenen Timeout für den Request-Aufruf angeben, und Sie erhalten eine Zeitüberschreitung - Ihre Messaging-Infrastruktur ist ausgefallen oder zu beschäftigt, oder Ihr Endpunkt ist zu beschäftigt.

Verwandte Themen