2016-11-30 43 views
3

將MassTransit配置爲容錯以正確處理間歇性RabbitMQ連接問題或RabbitMQ完全關閉的正確方法是什麼?我在兩臺不同的機器之間建立了一個RabbitMQ集羣,並配置了HA,以便鏡像所有內容。我還有一個F5負載均衡器設置爲主動/被動模式,以便所有流量都定向到主節點,但是如果運行狀況檢查失敗,它將故障轉移到次節點。我希望在這種故障恢復之後的任何客戶端連接都能繼續成功,但我在這裏遇到了麻煩。當我在主節點上停止RabbitMQ的,客戶端應用開始記錄一堆MassTransit的錯誤看起來像:MassTransit如何處理RabbitMQ關閉

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

出現這些錯誤,即使沒有活動正在發生的事情 - 沒有發佈,Client.Request等最終由於MassTransit顯然在連接上放棄了錯誤,並且客戶端應用程序崩潰。在查看MassTransit源代碼時,我認爲它是在「RetryUntilCancelled」方法內部產生這些錯誤的RabbitMqReceiveTransport.Receive。它看起來是使用內部的ConnectionRetryPolicy,那麼有什麼可以在那裏配置?

我正在Global.asax中實例化我的總線實例,啓動它並將其保留在內存中,只要IIS啓動,並且我不知道這是否是問題;在使用Unity容器查看MassTransit的文檔時,看起來建議的做法是允許Unity默認使用TransientLifetimeManager,以便每當容器解析它時總線實例將被拆除並重新創建。這

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

代替:

+0

您使用的是哪個版本的MassTransit? – sagar

+0

我正在使用MassTransit 3.4.1 – Andy

+0

在過程的整個過程中,保持公交車的存在是正確的。它不應該是短暫的。一旦經紀人變得可用,它也應該重新連接。 –

回答

0

這些客戶端崩潰正在發生,因爲我是用Task.Wait()這樣沒有.Wait

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

(),客戶端熬夜即使RabbitMQ發生故障。現在的問題是,當RabbitMQ發生故障時,但在F5故障轉移到輔助節點之前發送的任何消息都將丟失。