分布式系统中如何分配任务?

How to allocate tasks in distributed system?

我有大量任务和多个工作服务器。我想把这些任务平均分配给这些工作人员,即使一个工作服务器宕机。

我的想法是,我把任务分成几个分片,每个分片发送给MQ。每个服务器读取一个 MessageQueue。我希望尽快处理任务。但是如果服务器宕机,其MessageQueue中的任务不能及时消费,如何处理呢?

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

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

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

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

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

小心无法处理的消息,因为它们可能导致队列被阻塞。您需要有一个重试计数和一个回退队列,如果错误消息超过重试计数,就会将它们发送到该队列。这些被称为 "poison" 消息,是 Whosebug 和其他地方的其他问题的主题。