2016-07-06 84 views
0

首先,我将解释这种情况。
我有两个WSO2 ESB节点(4.9.0)和两个Apache ActiveMQ节点,运行在四台不同的机器上。目前,ActiveMQ的每个ESB节点指向一个节点:WSO2 ESB JMS与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的同一节点,导致其中一个队列永远不会被读取。

有办法解决这个问题吗?

回答

1

解决方案是在主/从中配置ActiveMQ。我们的目标是使用相同的数据库有不同的ActiveMQ节点:您可以在共享文件系统共享kahadb或者您可以使用一个共享的数据库,看http://activemq.apache.org/masterslave.html

你所有的ESB节点将连接到相同的ActiveMQ实例,并在情况失败时,被动节点将变为活动状态,并且所有ESB节点都​​将连接到它。这个新的ActiveMQ节点将继续为相同的队列和主题提供相同的内容,因为这些数据存储在唯一的数据库中。

+0

感谢您的回答。在这种情况下,如果承载数据库的物理机发生故障,所有AMQ节点都将失败,或者数据库将在所有节点中复制? – elias

+0

SAN上的主机kahadb数据文件,使用Oracle RAC等主动/被动或群集中的数据库... –