首先,我将解释一下这个场景 我有两个WSO2 ESB节点(4.9.0)和两个Apache ActiveMQ节点,在四台不同的机器上运行。目前,每个ESB节点都指向ActiveMQ的一个节点:
ESB1 -> AMQ1
ESB2 -> AMQ2
在这种情况下,如果一个AMQ节点发生故障,则只有一个ESB节点能够生成和使用消息。
考虑一种解决方法并实现高可用性的方法,我在ActiveMQ文档中找到了a section,它描述了配置故障转移的url语法。
因此,在每个ESB中,我已将消息处理器配置为连接到消息存储库,并将提供程序URL配置为文档说明:
failover:(tcp://soamsg01:61616,tcp://soamsg02:61616)
现在消息存储过程已“部分”解决。消息的插入始终在每个ESB中的同一AMQ节点中发生,但如果节点发生故障,则插入将转移到另一个节点。
主要问题在于消费。当消息处理器启动时,它会随机选择一个AMQ节点进行连接。因此,两个ESB节点可能连接到AMQ的同一节点,导致其中一个队列永远不会被读取。
有办法解决这个问题吗?
答案 0 :(得分:1)
解决方案是在主/从中配置ActiveMQ。目标是使用相同的数据库使不同的ActiveMQ节点:您可以在共享文件系统中共享kahadb,或者您可以使用共享数据库,请参阅http://activemq.apache.org/masterslave.html
所有ESB节点都将连接到同一个ActiveMQ实例,如果发生故障,被动节点将变为活动状态,并且所有ESB节点都将连接到该节点。这个新的ActiveMQ节点将继续使用相同的内容提供相同的队列和主题,因为这些数据存储在一个唯一的数据库中。