首页 > 解决方案 > 分布式系统中如何分配任务?

问题描述

我有大量的任务和几个工作服务器。我想将这些任务平均分配给这些工作人员,即使工作服务器出现故障。

我的想法是我将任务分成几个分片并将每个分片发送到 MQ。每个服务器读取一个 MessageQueue。我希望尽快处理任务。但是如果服务器宕机了,它的MessageQueue中的任务不能被及时消费怎么处理呢?

顺便问一下,是否有任何 JAVA 框架可以帮助解决这种情况?

标签: javataskdistributed-system

解决方案


您所描述的是具有共享消息队列的集群。正如 Thomas Timbul 所说,所有服务器都应该从同一个消息队列中读取。如果您使用的是 IBM MQ,那么理想情况下,您应该将队列管理器安装在单独的系统上并让服务器连接起来,这样如果一个服务器出现故障,它不会影响其他服务器。

每个服务器将从队列中拉出一条消息并按需处理。使用 J2EE 服务器,您可以指定每台服务器上读取队列的线程数(MDB 数)。例如,在 WebSphere 中,它是maxSessions端口侦听器的设置。

如果一个服务器在处理消息时发生故障,事务管理器应该回滚事务,并且消息将返回队列以由另一台服务器读取。

如果服务器以不同的速率处理消息,则无关紧要,因为每个服务器只是在需要时将消息从队列中拉出。

请注意无法处理的消息,因为它们可能导致队列被阻塞。您需要有一个重试计数和一个回退队列,如果错误消息超过重试计数,则将它们发送到该队列。这些被称为“毒药”消息,是 Stackoverflow 和其他地方的其他问题的主题。


推荐阅读