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

Java 如何在分布式系统中分配任务?,java,task,distributed-system,Java,Task,Distributed System,我有大量的任务和几个工作服务器。我希望将这些任务平均分配给这些工作人员,即使工作人员服务器出现故障 我的想法是将任务分割成几个碎片,并将每个碎片发送到MQ。每个服务器读取一个MessageQueue。我想尽快完成这项任务。但是,如果服务器宕机,其消息队列中的任务无法及时使用,如何处理这种情况呢 顺便问一下,有没有JAVA框架可以帮助解决这种情况?您所描述的是一个具有共享消息队列的集群。正如Thomas Timbul所说,所有服务器都应该从同一个消息队列中读取。如果您使用的是IBM MQ,理想情况

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

我的想法是将任务分割成几个碎片,并将每个碎片发送到MQ。每个服务器读取一个MessageQueue。我想尽快完成这项任务。但是,如果服务器宕机,其消息队列中的任务无法及时使用,如何处理这种情况呢


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

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

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

如果一台服务器在处理消息时出现故障,事务管理器应回滚该事务,该消息将返回到队列中,由另一台服务器读取

如果服务器以不同的速率处理消息,这并不重要,因为每个服务器只在需要消息时从队列中提取消息


小心那些无法处理的消息,因为它们会导致队列被阻塞。您需要有一个重试计数和一个退出队列,如果错误消息超过了重试计数,则会将其发送到该队列。这些被称为“有毒”消息,是Stackoverflow和其他方面的其他问题的主题。

使用共享分布式队列,以便任何其他工作人员都可以接管任何其他工作人员的任务。你不应该通过分配任务来管理高层员工。准备好后,每个工人都应该来取新的工作。对处理过程中工人死亡的情况做出设计决策——一个合适的队列系统将允许消息在一定时间内被标记为不可见。完成后,工作人员将删除消息/任务。如果没有,它会重新出现,让另一个人来处理。Thx,它帮了我很多。如果每个工作人员共享一个消息队列,并且工作人员在准备就绪时只提取任务,那么如何确保每个服务器以平均负载处理任务?我很高兴这很有帮助。如果你认为它回答了你的问题,请投票并接受它。我不确定我是否理解你的后续问题。每个MDB将在完成前一条消息后立即读取新消息,因此它将始终处于忙碌状态。除了确保配置了足够的MDB(会话)以将系统负载保持在所需的水平外,您无需执行任何操作。在单线程模式下,您的答案是确定的。例如,如果我使用threadpool处理任务,并且threadpool始终未满,则每个工作线程都必须在竞争条件下将任务从消息队列中拉出。在这种情况下,如何确保平均分配任务?线程池是什么意思。你是说ThreadPoolExecutor吗?我想这是一个独立的问题。但简单地说,如果使用J2EE服务器,则不需要ThreadPoolExecutor。您只需根据需要的线程数量配置MDB的数量。