如何向空闲的Akka actor发送消息?

3

我有一个名为TaskRunner的演员。 任务可能需要1分钟才能运行。 由于我使用的库只能在每个jvm /节点上拥有一个演员。 我有1000个这些节点分布在各种机器上。

我想使用各种规则将任务分配给这些节点,但最重要的一点是:

  • 永远不要在TaskRunner节点的邮箱中排队任务,在向其发送任务之前始终等待TaskRunner可用

我想到的方法是,在另一个节点上拥有一个演员(让我们称其为Scheduler actor),监听来自TaskRunner节点的注册,并保持已发送到何处的内部状态。

假设如果我这样做,我只能拥有此调度程序演员的一个实例,因为如果有多个实例,它们将不知道哪些TaskRunner节点当前正在忙碌,因此我们会得到任务在队列中的情况。

这是否意味着我应该使用Cluster Singleton作为调度程序演员?

是否有更好的方法来实现我的目标?

3个回答

2

我认为你需要:

  • 分发器演员(集群单例),从空闲演员池中向演员发送任务

  • 您的TaskRunner演员应具有两种状态:运行和空闲。在空闲状态下,它应定期向调度程序演员注册自己(通知其处于空闲状态)。定期进行注册是因为在节点关闭并将单例移动到另一个节点的情况下,调度程序可能会失去状态。

  • 调度程序本身保留空闲演员列表。当需要执行新任务且列表不为空时,工作人员将从列表中取出并发送任务(工作人员可以立即从列表中删除,但通过确认以确保任务已被处理或在超时时重新发送给另一个工作人员更加安全)


1
根据您的要求,与其从头开始构建,您可能希望考虑采用Lightbend的分布式工作模板,该模板使用了一个pull模型。它主要由以下两部分组成:1)维护工作者状态的主群集单例,以及2)工作者的演员系统,这些演员注册并从主单例演员拉取工作。
我曾经为研究项目改编过模板的版本,并且它如广告所述提供了工作拉取功能。请注意,该模板使用已停用的Activator(可以轻松从主代码中分离或替换为sbt)。它还执行分布式发布-订阅和持久性日志记录,如果不需要,可以选择排除。其源代码可在GitHub上获得。

1
参考您的单例主节点和多个工作节点的方法,可能会出现主节点负载过重的情况,这可能导致将任务调度到工作节点的时间更长。
因此,您可以拥有多个主节点,每个主节点都分配了子集工作节点,而不是将主节点作为群集单例。可以基于分片键通过群集分片将工作分配给不同的主节点。Akka提供了群集分片功能,您可以参考一下。
为了使主节点具有容错性,您始终可以将持久化actor作为主节点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接