我面临一个设计问题,我希望只有一个 JMS 生产者向两个消费者发送消息。只有两台服务器,生产者将开始生成消息,这些消息将对两个消费者进行负载平衡(通过循环)。
在假设一台服务器发生故障的情况下,我确实有一种机制,可以在剩余的服务器中激活新的生产者。但是,在发生故障的服务器中正在处理的消息会发生什么情况呢?
它们是否会被重新分配给剩余的服务器,从而由剩余的消费者处理?或者他们会丢失?
如果最后一种情况为真,则会出现另一个问题。生产者根据 NAS 中的文件创建消息,因此当服务器出现故障时,新激活的生产者将开始根据 NAS 的内容创建消息,并且可能会复制消息(但这种情况已处理),问题是,如果出现故障的服务器不是具有 Activity 生产者的服务器,那么当服务器再次启动时,它将没有消息可供消费,也没有消息可以替代丢失的消息。
如何实现不丢失消息的设计?
注意:当一台服务器出现故障时,日志和绑定(bind)都会丢失。
最佳答案
一旦消息传输到特定节点,它就属于该节点。
如果节点出现故障,您必须使用其日志激活该节点,并且消息状态将从磁盘恢复。如果您没有更多的使用者,您最终可能会重新分发消息(当然这取决于重新分发配置)。
或者最好的方法是为每个节点都有一个备份节点。
我们一直建议使用并置拓扑,其中一个虚拟机有一个 Activity 实例,另一台服务器有一个备份实例...这样,每个 Activity 服务器也将有一个备份配置。正如我们所说,这一点在 2.4.0 中得到了改进,因为您目前需要大量手动配置。
所以,总结一下:
- 重启节点
- 配置备份节点
关于java - HornetQ集群队列和故障节点: are messages lost?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19411001/