[英]How do I send messages to idle akka actors?
我有一个叫做TaskRunner的演员。 这些任务最多可能需要1分钟才能运行。 由于我使用的库,每个jvm /节点只能有一个actor。 我在各种机器上有1000个这样的节点。
我想使用各种规则将任务分配给这些节点,但最重要的是:
我想这样做的方法是在另一个节点上有一个actor(让我们称之为Scheduler actor)从TaskRunner节点监听注册并保持已发送到哪里的内部状态。
据推测,如果我这样做,我只能有一个这个Scheduler actor的实例,因为如果有多个,他们不知道哪个TaskRunner节点当前正忙,所以我们会得到队列中的任务。
这是否意味着我应该使用Cluster Singleton作为Scheduler actor?
有没有更好的方法来实现我的目标?
我会说你需要:
调度员演员(集群单身人士)从空闲演员的游泳池向演员发送任务
你的TaskRunner
actor应该有两种状态:running和idle。 在空闲状态下,它应该定期向调度员演员注册(通知它是空闲的)。 通常,因为在节点关闭的情况下调度程序可能会丢失状态并将单例移动到另一个节点。
调度员本身保留闲置演员列表。 当需要完成新任务且列表不为空时,将从列表中取出工作人员并发送任务(工作人员可以立即从列表中删除,但可以安全地与Ack一起工作以确保执行任务以进行处理,或者重新执行 - 如果Ack超时则发送给另一名工人)
对于您对单身主人和多个工作人员的处理方式,可能存在这样的情况:您的主人员负担过多的任务来安排,这可能导致更多时间将任务安排给工人。
因此,您可以让多个主服务器分配给他们的工作人员子集,而不是将主服务器设置为集群单例 。 可以通过基于分片密钥的聚类分片来完成对不同主设备的工作分配。 Akka提供了群集分片 ,你可以参考。
为了使你的主要容错,你总是可以将持久的角色作为主人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.