我有大量的任务和几个工作服务器。我想将这些任务平均分配给这些工作人员,即使工作人员服务器出现故障也是如此。我的想法是将任务分成几个碎片,然后将每个碎片发送给MQ。每个服务器读取一个MessageQueue。我希望尽快处理任务。但是,如果服务器发生故障,无法及时消耗其MessageQueue中的任务,该如何处理呢?顺便说一句,是否有任何JAVA框架可以帮助解决这种情况?
1 回答
![?](http://img1.sycdn.imooc.com/54584dd900014f6c02200220-100-100.jpg)
DIEA
TA贡献1820条经验 获得超2个赞
您所描述的是具有共享消息队列的群集。正如Thomas Timbul所说,所有服务器都应从同一消息队列中读取。如果使用的是IBM MQ,则理想情况下应将队列管理器安装在单独的系统上,并使服务器连接,这样一台服务器宕机不会影响其他服务器。
每个服务器都会从队列中拉出一条消息,并按需对其进行处理。使用J2EE服务器,可以指定每台服务器上读取队列的线程数(MDB数)。例如,在WebSphere中,它是maxSessions
端口侦听器上的设置。
如果一台服务器在处理消息时发生故障,则事务管理器应回滚该事务,并且该消息将返回到队列中,以供另一台服务器读取。
如果服务器以不同的速率处理消息,则无所谓,因为每台服务器仅在需要时才将消息从队列中拉出。
小心无法处理的消息,因为它们可能导致队列被阻塞。您需要有一个重试计数和一个返回队列,如果错误消息超出了重试计数,则将错误消息发送到该队列。这些被称为“毒药”消息,并且是Stackoverflow和其他地方上其他问题的主题。
添加回答
举报
0/150
提交
取消