我有大量任务和多个工作服务器。我想将这些任务平均分配给这些工作人员,即使工作人员服务器出现故障。
我的想法是,我将任务分成几个碎片,并将每个碎片发送给MQ。每个服务器读取一个MessageQueue。我希望尽快处理任务。但是,如果服务器发生故障,无法及时消耗其MessageQueue中的任务,该如何处理呢?
目前,是否有任何JAVA框架可以帮助解决这种情况?
答案 0 :(得分:0)
您所描述的是具有共享消息队列的群集。正如Thomas Timbul所说,所有服务器都应从同一消息队列中读取。如果您正在使用IBM MQ,则理想情况下应将队列管理器安装在单独的系统上,并使服务器连接,这样一台服务器宕机不会影响其他服务器。
每个服务器将从队列中拉出一条消息并按需处理。使用J2EE服务器,可以指定每台服务器上读取队列的线程数(MDB数)。例如,在WebSphere中,它是端口侦听器上的maxSessions
设置。
如果一台服务器在处理消息时发生故障,则事务管理器应回滚事务,消息将返回到队列中,以供另一台服务器读取。
如果服务器以不同的速率处理消息,则没关系,因为每台服务器只是在需要它们时才将消息从队列中拉出。
请谨慎对待那些无法处理的消息,因为它们会导致队列被阻塞。您需要有一个重试计数和一个返回队列,如果错误消息超过了重试计数,则向该队列发送错误消息。这些被称为“毒药”消息,是Stackoverflow和其他地方其他问题的主题。