最初,我有一个Rabbitmq节点可以正常工作,与请求/响应客户端交互。
我现在正在更改群集并尝试运行完全相同的请求/响应操作。它爆炸得很厉害。
我已将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 :(得分:4)
如果您正在使用群集,则通常会在出现节点故障时尝试确保消息队列的高可用性。在这种情况下,节点应该是不实际运行服务的独立计算机 - 因为这些服务可能会随着节点本身而下降。
还可以进行群集,以便可以跨可用节点复制队列 - 这是一种高可用性形式 - 可确保服务能够在该节点发生故障时从关闭节点恢复消息。
关于群集RabbitMQ的文章很多,包括官方的RabbitMQ网站和其他几个使用各种失败机制测试RabbitMQ群集稳定性的网站(Jespen想到这里)。
使用群集和分布式节点时,使用解析为群集中活动节点或主节点的群集DNS名称非常重要 - 确保将消息正确传递到网络上的群集和使用者。
最好的情况是在群集中有几个节点,故障转移负载平衡器使所有使用者连接到节点1直到它崩溃,然后将流量故障转移到节点2.如果节点1返回服务,它可以手动重新加入群集,流量会移回到节点2.您也可以有三个节点,但增加的节点数会增加复制时间,因此请记住这一点。
在大多数情况下,localhost
不是您的朋友而不推荐。此外,如果您不复制队列,则最终可能只在单个节点上存在消息,这些消息将需要存在连接到可能发送消息的每个节点的消费者服务。在生产中非常困惑和难以管理。