2016-03-05 53 views
1

本來我有一個單一的RabbitMQ節點的工作就好了請求/響應客戶端的交互。MassTransit請求和響應在集羣

我現在改變爲一個集羣,並試圖運行同樣的請求/響應操作。它壯觀地爆炸。

我設置2臺主機作爲RabbitMQ的集羣的一部分。 我有這麼多麻煩,我回到使用masstransit sample code

這似乎也有麻煩。我最終得到我的請求服務的重複異常:

--- End of stack trace from previous location where exception was thrown -- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(...) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNot 
ification(...) 
    at System.Runtime.CompilerServices.ConfiguredTaskAwaitable.ConfiguredTaskAwai 
ter.GetResult() 
    at MassTransit.Pipeline.Filters.RescueReceiveContextFilter`1.<MassTransit-Pip 
eline-IFilter<MassTransit-ReceiveContext>-Send>d__5.MoveNext() 
Returning name for 45 
Rescuing exception 
MassTransit.EndpointNotFoundException: The endpoint address specified an unknown 
host: rabbitmq://erinome:5672/bus-ERINOME-Client.vshost-1pooyygnzw6bmox5bdjwjoy 
mnw?durable=false&autodelete=true&prefetch=4 
    at MassTransit.RabbitMqTransport.RabbitMqSendTransportProvider.GetSendTranspo 
rt(Uri address) 
    at MassTransit.RabbitMqTransport.RabbitMqSendEndpointProvider.<GetSendEndpoin 
t>d__5.MoveNext() 

我在最簡單的配置,我可以去觀察問題,從運行在同一臺主機客戶端和請求服務。

客戶端的一些示例配置:

key="RabbitMQHost" value="rabbitmq://erinome" 
key="ServiceAddress" value="rabbitmq://erinome/request_service" 

和請求服務的配置:

key="RabbitMQHost" value="rabbitmq://localhost" 
key="ServiceQueueName" value="request_service" 

我的問題可能與集羣缺乏知識和端點未發現異常點一些消息路由問題。任何幫助讚賞。

+0

所以服務使用本地RabbitMQ服務器(localhost)?好像你需要確保在這種情況下_erinome_主機名解析爲相同的本地主機。 –

+0

如果我更改所有內容以使用本地主機,那麼即使它們連接到羣集的不同主機,它也是很好的,客戶端和服務器之間的通信很好。 – bchap

+0

如果我更改爲使用主機名而不是localhost,那麼我會遇到通信問題。所有主機名都可以在主機文件中解析。 上下文看起來有一個包含「本地主機」的響應地址,即使它應該發送到遠程主機。響應於主機甘薯從主機木衛二十五的請求的 登錄 DEBUG [17](空) - SEND:RabbitMQ的:// **本地主機**:5672 /總線木衛二十五程序-1pooyygnzw6bmco7bdjwp4rcf7耐用=假自動刪除=真正 – bchap

回答

3

如果使用一個集羣,那麼典型地試圖確保在節點故障的存在消息隊列的高可用性。在這種情況下,節點應該是獨立的機器,它們實際上並不運行服務 - 因爲這些服務可能會隨節點本身而下降。

還可以進行羣集,以便可以在可用節點(高可用性的一種形式)上覆制隊列,以確保服務能夠在該節點出現故障時從故障節點恢復消息。

關於聚類RabbitMQ的文章很多,包括官方的RabbitMQ站點和其他幾個使用各種失敗機制測試RabbitMQ的集羣穩定性的站點(這裏介紹Jespen)。

使用羣集和分佈式節點時,使用羣集DNS名稱解析羣集中的主節點或主節點非常重要 - 確保將消息正確傳遞到網絡上的羣集和使用者。

最好的情況是有幾個節點是在羣集中,在故障轉移負載平衡器保持連接到節點1,直到它崩潰所有消費者,然後失敗交通轉移到節點2如果節點1點返回服務,則可以手動將其重新加入羣集,並將流量移回到節點2.您也可以有三個節點,但增加的節點數會增加複製時間,因此請記住這一點。

在大多數這些情況下,localhost是不是你的朋友,而不是建議。此外,如果您不復制隊列,則最終可能只有單個節點上存在的消息,這些消息需要使用消費者服務才能連接到可能發送消息的每個節點。生產中非常混亂,難以管理。