Active MQ消息顺序处理

我们有2台服务器:server1和server2。两台服务器均以Wildfly 11的域模式配置运行。这是the documentation,说明了我们如何配置两台服务器。

在我们的案例中,我们考虑server1域节点。

问题:

如果具有相同组ID的2条消息同时到达server1和server2,则它们将不知道该消息应发送给哪个使用者。因此,该消息最终由不同的使用者处理,并且有时先到达的消息随后被处理,这是不希望的。 我们希望对系统进行配置,以使两个节点都彼此知道该消息应由哪个使用者处理。

我们尝试的解决方案:

为服务器1配置组LOCAL,为服务器2配置REMOTE。现在,每当消息到达时,本地组处理程序就会标识该特定组ID的使用者位于哪个节点上,并相应地选择消息。

该解决方案在server1运行正常之前一直有效。但是,如果server1发生故障,则不会处理消息。为了解决此问题,我们将server1的消息传递子系统active-mq的备份添加到server2,并且类似地对server2进行了备份。

/profile=abc/subsystem=messaging-activemq/server=backup:add

(由于server1是域节点,备份服务器将被添加到两个节点)

我们还向该备份服务器添加了相同的发现组,http连接器,广播组。我们为备份服务器和活动服务器建立了群集连接,使其与server1和server2在同一组中。

/profile=abc/subsystem=messaging-activemq/server=default/ha-policy=replication-master:add(cluster-name=my-cluster,group-name=${livegroup},check-for-live-server=true)
/profile=abc/subsystem=messaging-activemq/server=backup/ha-policy=replication-slave:add(cluster-name=my-cluster,group-name=${backupgroup})

server1配置为读取以下属性:

livegroup=group1
backupgroup=group2

server2配置为读取以下属性:

livegroup=group2
backupgroup=group1

但是,当具有本地组处理程序节点的活动节点关闭时,此解决方案似乎无法解决故障转移条件,并且未在其他节点上处理消息。当server1关闭时,我们在server2上收到以下错误:

[org.apache.activemq.artemis.core.server] (default I/O-3) AMQ222092: Connection to the backup node failed,removing replication now: activeMQRemoteDisconnectexception[errorType=REMOTE_DISCONNECT message=null]
        at org.apache.activemq.artemis.core.remoting.server.impl.RemotingServiceImpl.connectionDestroyed(RemotingServiceImpl.java:533)
        at org.apache.activemq.artemis.core.remoting.impl.netty.Nettyacceptor$Listener.connectionDestroyed(Nettyacceptor.java:682)
        at org.apache.activemq.artemis.core.remoting.impl.netty.activeMQChannelHandler.channelInactive(activeMQChannelHandler.java:79)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:224)
        at io.netty.handler.codec.ByteToMessageDecoder.channelInputClosed(ByteToMessageDecoder.java:360)
        at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:325)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelInactive(AbstractChannelHandlerContext.java:224)
        at io.netty.channel.DefaultChannelPipeline$HeadContext.channelInactive(DefaultChannelPipeline.java:1329)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:245)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelInactive(AbstractChannelHandlerContext.java:231)
        at io.netty.channel.DefaultChannelPipeline.fireChannelInactive(DefaultChannelPipeline.java:908)
        at io.netty.channel.AbstractChannel$AbstractUnsafe$7.run(AbstractChannel.java:744)
        at org.xnio.nio.WorkerThread.safeRun(WorkerThread.java:612)
        at org.xnio.nio.WorkerThread.run(WorkerThread.java:479)

请建议使用其他任何方法来解决该问题,或者如何配置带有LOCAL组处理程序的服务器关闭的方案。

shimin_3333 回答:Active MQ消息顺序处理

对于群集分组的推荐解决方案是您已配置的-使用LOCAL分组处理程序的节点的备份。最重要的是,如果集群中没有活动的节点具有LOCAL分组处理程序,那么根本就无法决定由哪个使用者处理哪个组。在我看来,您的备份代理根本无法按预期运行(这可能是另一个问题的主题)。

除了拥有备份之外,您还可以考虑完全消除群集,以便您只有1个代理,或者可能只有实时/备份对,而不是2个活动代理。群集是一种使用水平缩放来提高整体邮件吞吐量的方法。但是,消息分组自然会为每个组序列化消息消耗,从而降低总体消息吞吐量(可能严重取决于使用情况)。由于您正在对消息进行分组,因此可能不需要集群的性能可伸缩性。您是否进行过任何基准测试以确定性能瓶颈?如果是这样,是否将行之有效的解决方案聚集到这些瓶颈上?

本文链接:https://www.f2er.com/3104007.html

大家都在问