我正面临一个设计问题,我希望只有一个JMS生产者向两个消费者发送消息。只有两台服务器,生产者将开始为两个消费者生成将负载平衡(使用循环)的消息。
在一个服务器失败的假设情况下,我确实有一个机制,因此将在剩余的服务器中激活新的生产者。但是在服务器中处理的消息会发生什么变化呢?
它们会被重新分配给剩余的服务器,由剩余的消费者处理吗?或者他们会迷路?
如果最后一种情况属实,则会出现另一个问题。生产者根据NAS中的文件创建消息,因此当服务器出现故障时,新激活的生产者将开始根据NAS的内容创建消息,并且可以复制消息(但这种情况得到处理)问题是,如果关闭的服务器不是具有活动生产者的服务器,然后当服务器再次启动时,它将不会消耗消息,也没有消息将替换丢失的消息。
如何实现设计,以免丢失任何消息?
注意:当一台服务器关闭时,日志和绑定将丢失。
答案 0 :(得分:1)
一旦消息传输到特定节点,它就属于该节点。
如果节点出现故障,则必须使用其日志激活该节点,并且将从磁盘恢复消息状态。如果您没有更多的消费者(当然,这将取决于再分配配置),您最终可能会重新分发消息。
或者最好的方法是为每个节点建立一个备份节点。
我们一直在建议使用并置拓扑,其中一个VM具有活动实例,另一个服务器具有备份实例......这样每个活动服务器也将具有备份配置。当我们说你需要大量的手动配置时,这在2.4.0上得到了改进。
所以,总结一下: