2016-03-05 97 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是不是你的朋友,而不是建议。此外,如果您不复制队列,则最终可能只有单个节点上存在的消息,这些消息需要使用消费者服务才能连接到可能发送消息的每个节点。生产中非常混乱,难以管理。