java - HornetQ集群队列和故障节点: are messages lost?

标签 java hornetq

我面临一个设计问题,我希望只有一个 JMS 生产者向两个消费者发送消息。只有两台服务器,生产者将开始生成消息,这些消息将对两个消费者进行负载平衡(通过循环)。

在假设一台服务器发生故障的情况下,我确实有一种机制,可以在剩余的服务器中激活新的生产者。但是,在发生故障的服务器中正在处理的消息会发生什么情况呢?

它们是否会被重新分配给剩余的服务器,从而由剩余的消费者处理?或者他们会丢失?

如果最后一种情况为真,则会出现另一个问题。生产者根据 NAS 中的文件创建消息,因此当服务器出现故障时,新激活的生产者将开始根据 NAS 的内容创建消息,并且可能会复制消息(但这种情况已处理),问题是,如果出现故障的服务器不是具有 Activity 生产者的服务器,那么当服务器再次启动时,它将没有消息可供消费,也没有消息可以替代丢失的消息。

如何实现不丢失消息的设计?

注意:当一台服务器出现故障时,日志和绑定(bind)都会丢失。

最佳答案

一旦消息传输到特定节点,它就属于该节点。

如果节点出现故障,您必须使用其日志激活该节点,并且消息状态将从磁盘恢复。如果您没有更多的使用者,您最终可能会重新分发消息(当然这取决于重新分发配置)。

或者最好的方法是为每个节点都有一个备份节点。

我们一直建议使用并置拓扑,其中一个虚拟机有一个 Activity 实例,另一台服务器有一个备份实例...这样,每个 Activity 服务器也将有一个备份配置。正如我们所说,这一点在 2.4.0 中得到了改进,因为您目前需要大量手动配置。

所以,总结一下:

  • 重启节点
  • 配置备份节点

关于java - HornetQ集群队列和故障节点: are messages lost?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19411001/

相关文章:

Java swing JButton 顺序和大小

ActiveMQ 到 HornetQ 导致异常

amazon-web-services - AWS 的最佳 JMS 实现

jboss7.x - 需要关于 HornetQ <address-setting> 的校准

Java.exe 在文件创建后将文件锁定一段时间

java - Mockito returnsFirstArg() 使用

java - 如何在 javaFX 中创建带有左、中、右部分的工具栏?

java - HornetQ java getMessagesAsJSON 功能

java - 使用 Spring Rest Template 处理超时和其他 IO 异常的常用方法