Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何向空闲的akka演员发送消息?_Java_Akka - Fatal编程技术网

Java 如何向空闲的akka演员发送消息?

Java 如何向空闲的akka演员发送消息?,java,akka,Java,Akka,我有一个叫TaskRunner的演员。运行这些任务最多需要1分钟。由于我使用的库,每个jvm/节点只能有一个参与者。我在不同的机器上有1000个这样的节点 我希望使用各种规则将任务分配给这些节点,但最重要的规则是: 决不要在TaskRunner节点的邮箱中对任务进行排队,在向TaskRunner发送任务之前,请始终等待TaskRunner空闲 我考虑这样做的方式是让另一个节点上的一个参与者(让我们称之为调度程序参与者)侦听来自TaskRunner节点的注册,并保留已发送到何处的内容的内部状态

我有一个叫TaskRunner的演员。运行这些任务最多需要1分钟。由于我使用的库,每个jvm/节点只能有一个参与者。我在不同的机器上有1000个这样的节点

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

  • 决不要在TaskRunner节点的邮箱中对任务进行排队,在向TaskRunner发送任务之前,请始终等待TaskRunner空闲
我考虑这样做的方式是让另一个节点上的一个参与者(让我们称之为调度程序参与者)侦听来自TaskRunner节点的注册,并保留已发送到何处的内容的内部状态

假设我这样做了,我就只能有一个调度程序参与者的实例,因为如果有多个实例,它们就不知道哪个TaskRunner节点当前正忙,因此我们将在队列中获取任务

这是否意味着我应该为调度程序参与者使用集群单例

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

我想说你需要:

  • dispatcher actor(集群单例),从空闲参与者池向参与者发送任务

  • 您的
    TaskRunner
    actor应该有两种状态:running和idle。在空闲状态下,它应该定期向dispatcher actor注册自己(通知它空闲)。定期,因为在节点关闭的情况下,调度器可能会丢失状态,并将singleton移动到另一个节点

  • dispatcher本身保留空闲参与者的列表。当需要完成新任务且列表不为空时,将从列表中提取工作进程并发送任务(可以立即从列表中删除工作进程,但可以使用Ack安全地工作,以确保任务已被处理,或者在Ack超时时重新发送给另一个工作进程)


给出了您的需求,而不是从头开始构建所有的东西,您可能需要考虑使用“<代码>拉< /COD> >模型的适应光弯”。它主要由1)一个维护工作程序状态的主集群单例,和2)一个工作程序的参与者系统组成,该系统注册并从主单例参与者中提取工作


我在过去为一个研发项目修改了一个重新调整用途的模板版本,它提供了广告宣传的工作拉动功能。请注意,模板使用失效的
Activator
(可以很容易地从主代码中分离或替换为
sbt
)。它还提供分布式发布订阅和持久性日志,如果不需要,您可以选择将其排除在外。Its可在GitHub上获得。

参考您对单主机和多个工作线程的做法,可能会出现这样一种情况,即您的主机上要调度的任务过多,这可能会导致有更多的时间将任务调度给工作线程

因此,您可以让多个主控设备具有分配给它们的工作线程子集,而不是将主控设备设置为集群单例。 通过基于分片密钥的集群分片,可以将工作分配给不同的主机。 Akka提供了集群切分,您可以参考

为了让你的主人容错,你总是可以让坚持不懈的演员成为主人