1

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

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

它们会被重新分配给剩余的服务器,从而由剩余的消费者处理吗?否则他们会迷路吗?

如果最后一种情况属实,那将是另一个问题。生产者根据 NAS 中的文件创建消息,因此当服务器出现故障时,新激活的生产者将开始根据 NAS 的内容创建消息,并且可能会复制消息(但这种情况已得到处理)问题是,如果关闭的服务器不是具有活动生产者的服务器,然后当服务器再次启动时,它不会有消息要消耗,也不会有消息替换丢失的消息。

如何实现设计,以免消息丢失?

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

4

1 回答 1

1

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

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

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

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

因此,总而言之:

  • 重启节点
  • 配置备份节点
于 2013-10-16T19:22:28.073 回答