java - 分布式系统中如何分配任务?
问题描述
我有大量的任务和几个工作服务器。我想将这些任务平均分配给这些工作人员,即使工作服务器出现故障。
我的想法是我将任务分成几个分片并将每个分片发送到 MQ。每个服务器读取一个 MessageQueue。我希望尽快处理任务。但是如果服务器宕机了,它的MessageQueue中的任务不能被及时消费怎么处理呢?
顺便问一下,是否有任何 JAVA 框架可以帮助解决这种情况?
解决方案
您所描述的是具有共享消息队列的集群。正如 Thomas Timbul 所说,所有服务器都应该从同一个消息队列中读取。如果您使用的是 IBM MQ,那么理想情况下,您应该将队列管理器安装在单独的系统上并让服务器连接起来,这样如果一个服务器出现故障,它不会影响其他服务器。
每个服务器将从队列中拉出一条消息并按需处理。使用 J2EE 服务器,您可以指定每台服务器上读取队列的线程数(MDB 数)。例如,在 WebSphere 中,它是maxSessions
端口侦听器的设置。
如果一个服务器在处理消息时发生故障,事务管理器应该回滚事务,并且消息将返回队列以由另一台服务器读取。
如果服务器以不同的速率处理消息,则无关紧要,因为每个服务器只是在需要时将消息从队列中拉出。
请注意无法处理的消息,因为它们可能导致队列被阻塞。您需要有一个重试计数和一个回退队列,如果错误消息超过重试计数,则将它们发送到该队列。这些被称为“毒药”消息,是 Stackoverflow 和其他地方的其他问题的主题。
推荐阅读
- python - 如何删除文本文件中的特定昵称和密码?
- go - 无法使用 mikepb 的 go-serial 打开串口
- c++ - 清除输入缓冲区后未提取字符串流
- java - 导入 de.codecentric.boot.admin.server.config.EnableAdminServer 无法解析
- php - 使用 selected 在 php 中获取多选下拉值
- delphi - 在 Delphi 中访问其他单位常量
- javascript - Chart JS Tooltip - 将其放置在画布外的固定位置
- c# - c# regex - 匹配一个单词或一个数字(int 或 float)
- vb.net - Visual Basic Else If 语句
- regex - 多线字符串底部修剪