2014-01-07 37 views
2

檢索消息我們有一個問題,在我們的滷麪/ RabbitMQ的設置,其中滷麪突然停止檢索/從RabbitMQ的處理消息。這在上個月發生了兩次,我們不確定如何繼續。滷麪停止從RabbitMQ的

我們的RabbitMQ設置有不同的服務器上的兩個節點,以及滷麪端是一個Windows服務。

我們看到滷麪或在滷麪運行在服務器上的事件日誌中沒有錯誤。 我們在RabbitMQ服務器上也看不到錯誤。

Rebus(和windows服務)繼續運行,因爲我們會看到其他日誌消息,如DueTimeOutSchedular和timeoutreplies。但是,似乎工作線程停止運行,但沒有記錄任何錯誤。

它導致的是不斷增加:(,我們添加日誌監控,以使我們得到通知,如果它再次發生一個RabbitMQ的輸入隊列。

但是我正在尋找就如何繼續「調查」,並就如何防止這種想法,也許你們當中有些人已經在此之前經歷?

UPDATE 看來,我們實際上也有一個節點崩潰,至少最後一次發生。主的RabbitMQ節點崩潰(服務器崩潰),並從被晉升爲主。至於我可以從RabbitMQ的日誌中看到的節點都文噸按計劃。 RabbitMQ日誌中沒有其他錯誤。

在這件事發生滷麪被配置爲只連接到這是從(然後晉升爲大師)的節點如此滷麪沒有經歷過失敗的RabbitMQ,因此沒有滷麪連接錯誤的時間。但是,似乎Rebus在發生故障時停止處理消息。

實際上,我們在這似乎是一個幾隊列體驗這一點,他們中的一些,但不是所有的似乎不同步的狀態已經結束了。

UPDATE 2 我能夠很容易地重現問題,所以它可能是我們的設置中的配置問題。但這是我們重現它的方法

  1. 在集羣中啓動兩個節點,例如: rabbit1(主)和rabbit2(從)
  2. Rebus的連接到rabbit2,從屬
  3. 關閉rabbit1,主。 rabbit2被提升爲掌握

這些隊列被鏡像

我們有兩個小的測試應用程式來重現此,一個「發送」發送消息的每個第二和處理該消息的「消費者」 。

rabbit1已關閉時,「使用者」停止處理消息,但「發件人」不斷髮送消息並且隊列不斷增長。

  1. 開始rabbit1再次,它加入作爲從

這有沒有影響,「消費者」仍無法處理的消息。

  1. 重新啓動「消費者」應用

當「消費者」重新啓動它會檢索所有消息和處理它們。

我想我已經正確地遵循了安裝指南,但它可能是我們的配置問題。我似乎無法找到任何能夠表明我們做錯了什麼的事情。

滷麪仍連接到RabbitMQ的,我們看到,在管理網站的連接選項卡,將「消費者」發送/收到B/S下降至約2 B/S當它停止處理消息

更新3 好吧,所以我下載了Rebus源代碼,並附加到我們的過程中,以便在停止時可以看到「RabbitMqMessageQueue」類中發生了什麼。當「rabbit1 *關閉了 「BasicDeliverEventArgs」 爲空,這是代碼

BasicDeliverEventArgs ea; 
if (!threadBoundSubscription.Next((int)BackoffTime.TotalMilliseconds, out ea)) 
{ 
    return null; 
} 

// wtf?? 
if (ea == null) 
{ 
    return null; 
} 

參見:https://github.com/rebus-org/Rebus/blob/master/src/Rebus.RabbitMQ/RabbitMqMessageQueue.cs#L178

我喜歡 「WTF ??」 評論:)

回答

3

這聽起來很奇怪!

每當Rebus的RabbitMQ傳輸出現連接錯誤時,它將丟棄連接,等待幾秒鐘,並確保在連接重新建立時連接重新建立。

你可以看到相關的地方在源位置:https://github.com/rebus-org/Rebus/blob/master/src/Rebus.RabbitMQ/RabbitMqMessageQueue.cs#L205

所以我想這個問題是RabbitMQ的客戶端庫是否能以某種方式進入故障狀態,默默地,沒有拋出異常時滷麪attemps獲取下一個信息...?

當您遇到錯誤時,您是否檢查過RabbitMQ管理界面中的「連接」選項卡並查看客戶端是否仍連接?

更新:

感謝您嚴查:)

的 「跆拳道?」在那裏,因爲當ea顯然已經是空的,這在當時是意外的,因此我曾經經歷過一次呃逆,因此導致了後面的NullReferenceException以及在我的日誌中嘔吐異常。

the docsNext將返回true,並設置result到空當它達到「結束流」,這顯然是當底層模型被關閉會發生什麼。

在這種情況下,Rebus的正確行爲是拋出一個適當的異常,並讓連接重新建立 - 我馬上執行它!

請稍等,我會在幾分鐘內爲您準備好一個修復程序!

+0

非常感謝。我現在已經多次運行我的測試應用程序,無法重現錯誤,它能夠正確檢測到流結束並重新連接。但是,我們看到「回滾事務時發生錯誤!」錯誤,但在「正常」連接錯誤期間也會發生此錯誤。 Rebus現在繼續檢索郵件:) –

+0

感謝您幫助我改進Rebus - 這是對錯誤的非常有幫助的描述! :) – mookid8000