2016-11-30 2 views
3

간헐적 인 RabbitMQ 연결 문제를 처리하기 위해 MassTransit을 내결함성으로 구성하거나 RabbitMQ가 완전히 중단되는 적절한 방법은 무엇입니까? 2 개의 다른 머신 사이에 RabbitMQ 클러스터를 설정하고 모든 것을 미러링하도록 HA를 구성했습니다. 또한 액티브/패시브 모드로 설정된 F5로드 밸런서를 사용하여 모든 트래픽을 기본 노드로 보내지 만 상태 검사가 실패하면 보조 노드로 장애 조치됩니다. 이러한 장애 조치 이후 클라이언트 연결이 계속 성공하기를 기대하지만 여기서 문제가 있습니다. 더 결국 등, Client.Request 게시 -MassTransit RabbitMQ 처리 방법

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

이러한 오류는 활동이 발생하지 않은 경우에도 발생하지 : 나는 기본 노드에 RabbitMQ를 중지하면, 클라이언트 응용 프로그램과 같이 MassTransit 오류의 무리를 기록 시작 오류는 MassTransit이 연결을 포기한 것으로 인해 중지되며 클라이언트 응용 프로그램이 충돌합니다. MassTransit 소스를 살펴보면 RabbitMqReceiveTransport라고 생각합니다. "RetryUntilCancelled"메소드에서 이러한 오류가 발생합니다. 내부 ConnectionRetryPolicy를 사용하고있는 것처럼 보이므로 여기에 구성 할 수있는 것이 있습니까?

저는 Global.asax에서 버스 인스턴스를 인스턴스화하고 있으며, IIS가 시작되는 한 메모리 인스턴스를 유지하면서이 인스턴스가 문제인지 여부를 알지 못합니다. 유니티 컨테이너를 사용하는 MassTransit의 문서를 보면 유니티가 TransientLifetimeManager를 사용하도록 기본 설정되어 컨테이너가 컨테이너를 해결할 때마다 버스 인스턴스가 찢어지고 다시 만들어 지도록하는 것이 좋습니다. 나는이 같은 Task.Wait()를 사용했기 때문에

+0

사용중인 MassTransit의 버전은 무엇입니까? – sagar

+0

MassTransit 3.4.1을 사용 중입니다. – Andy

+0

프로세스 수명 동안 버스를 활성 상태로 유지하는 것이 옳습니다. 그것은 일시적이어서는 안됩니다. 또한 브로커를 사용할 수있게되면 다시 연결해야합니다. –

답변

0

이 클라이언트 충돌이 발생했다 :

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

을 대신의 :

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

을 .Wait없이(), 클라이언트가 깨어 RabbitMQ가 다운 되더라도. 이제 문제는 RabbitMQ가 다운되었지만 F5가 보조 노드로 페일 오버되기 전에 전송 된 모든 메시지가 손실된다는 것입니다.

관련 문제