【发布时间】:2021-02-05 07:55:04
【问题描述】:
存在分布式计算节点,并且存在由数据库表中的行表示的一组计算任务(每个任务一行):
- 一个节点没有其他节点的信息:不能和其他节点通话,甚至不知道有多少其他节点
- 可以添加和删除节点,节点可能会死亡并重新启动
- 仅连接到数据库的节点
- 每个节点的任务数没有限制
- 任务池不是有限的,新任务总会到来
- 节点通过使用某个时间戳标记该行来获取任务,以便在该时间戳之后经过某个超时之前其他节点不会考虑它(以防节点死亡且任务未完成)
目标是在节点之间平均分配任务。为此,我需要定义一些常见的任务获取算法:一个节点启动时,要接多少个任务?
如果一个节点承担所有可用任务,当一个节点总是忙而其他节点空闲时。所以这不是一个选择。
一个好的方法是让每个节点一个接一个地执行任务,但会有一些延迟。所以 每个节点定期(有时一次)检查是否有空闲任务并且只接受 1 个任务。这样,在启动后不久,所有节点都会获得或多或少均匀分布的所有任务。但是缺点是由于延迟,处理最后一个任务需要一些时间(假设有 10000 个任务,10 个节点,延迟为 1 秒:需要 10000 个任务 * 1 秒 / 10 个节点= 从开始到完成所有任务需要 1000 秒)。此外,分布是不确定的,可能存在偏差。
问题:哪种/类别的算法可以解决此类问题,允许使用某个同步点(在本例中为数据库)快速均匀地分配任务,无需选举领导者?
例如:节点使用某个表来宣布他们想要执行的任务,然后经过一些协调步骤后达成共识并开始处理等。
【问题讨论】: