我有一个叫做TaskRunner的演员。这些任务最多可能需要1分钟才能运行。由于我使用的库,每个jvm /节点只能有一个actor。我在各种机器上有1000个这样的节点。
我想使用各种规则将任务分配给这些节点,但最重要的是:
我想要这样做的方法是在另一个节点上有一个actor(让我们称之为Scheduler actor)从TaskRunner节点监听注册并保持已发送到哪里的内部状态。
据推测,如果我这样做,我只能拥有这个Scheduler actor的一个实例,因为如果有多个,他们就不知道哪个TaskRunner节点当前正忙,所以我们会在队列中获取任务。
这是否意味着我应该为Scheduler actor使用Cluster Singleton?
有没有更好的方法来实现我的目标?
答案 0 :(得分:2)
我会说你需要:
从空闲演员的游泳池向演员发送任务的调度员演员(集群单身人士)
你的TaskRunner
演员应该有两种状态:跑步和空闲。在空闲状态下,它应该定期向调度员演员注册(通知它是空闲的)。通常,因为在节点关闭的情况下调度程序可能会丢失状态并将单例移动到另一个节点。
调度员本身保留空闲演员列表。当需要完成新任务且列表不为空时,将从列表中取出工作人员并发送任务(工作人员可以立即从列表中删除,但可以安全地与Ack一起工作以确保执行任务以进行处理,或者重新执行 - 如果Ack超时,则发送给另一名工人)
答案 1 :(得分:1)
根据您的要求,您可能需要考虑采用采用pull
模型的Lightbend distributed-workers template,而不是从头开始构建所有内容。它主要包括:1)维护工人状态的主集群单身,以及2)从主单身人员中注册和拉取工作的工人的行动者系统。
我过去为R& D项目改编了模板的改版版本,它提供了宣传的工作拉动功能。请注意,该模板使用已退役的Activator
(可以从主代码中轻松分离或替换为sbt
)。它还提供分布式pub-sub和持久性日志,如果不需要,您可以选择排除日志。它的source code可以在GitHub上找到。
答案 2 :(得分:1)
对单身主人和多名工作人员的处理方式,可能会出现主人负担过多的任务安排,这可能会导致更多时间将任务安排给工人。
因此,您可以让多个主人分配给他们的工作人员子集,而不是将主人作为群集单身人士。 可以通过基于分片密钥的聚类分片来完成对不同主设备的工作分配。 Akka提供群集分片,您可以参考。
为了让你的主要容错,你总是可以把持久的演员当作主人。