如何限制akka actor一次只做一项工作
How to restrict the akka actor to do one job at a time
我有一个基于 Java-Akka 的应用程序,其中一个 Akka actor 告诉另一个 Akka actor 做某项工作,它开始在命令提示符下做这项工作,但如果我给他 10 个工作,它就会开始所有一次在 10 个命令提示符下执行作业。
如果我有 100 多个工作,我的系统就会被挂起。
那么我怎样才能让我的应用程序一次完成 1 个工作,而所有其他工作应该以 FIFO(先进先出)的方式获得 CPU。
问题不是很清楚,我尽量按照自己的理解来回答
因此,您似乎将 actor 用作作业调度程序,将作业消息转换为对某些 "job executor system" 的调用。每条传入消息都被转换为某个呼叫。
如果此调用是同步的(当然在与演员一起工作时会闻到这种味道,但只是为了理解)那么在您的情况下没问题,您的演员会等到调用完成,然后继续其邮箱中的下一条消息。
如果那个调用是异步的,我猜你有什么,那么所有的消息都将一个接一个地处理,而不用等待对方。
因此您需要限制消息处理,以便一次最多处理一条消息。这可以通过描述 here 的 "pull" 模式进行归档。
您基本上分配了一个具有传入消息(作业)队列的主角色和一个在没有作业时请求作业的工作角色。小心 master actor 中的队列 - 你可能不希望它增长太多,考虑监控和应用 back-pressure,这是 akka-stream.
涵盖的另一个大主题
我有一个基于 Java-Akka 的应用程序,其中一个 Akka actor 告诉另一个 Akka actor 做某项工作,它开始在命令提示符下做这项工作,但如果我给他 10 个工作,它就会开始所有一次在 10 个命令提示符下执行作业。 如果我有 100 多个工作,我的系统就会被挂起。
那么我怎样才能让我的应用程序一次完成 1 个工作,而所有其他工作应该以 FIFO(先进先出)的方式获得 CPU。
问题不是很清楚,我尽量按照自己的理解来回答
因此,您似乎将 actor 用作作业调度程序,将作业消息转换为对某些 "job executor system" 的调用。每条传入消息都被转换为某个呼叫。
如果此调用是同步的(当然在与演员一起工作时会闻到这种味道,但只是为了理解)那么在您的情况下没问题,您的演员会等到调用完成,然后继续其邮箱中的下一条消息。
如果那个调用是异步的,我猜你有什么,那么所有的消息都将一个接一个地处理,而不用等待对方。
因此您需要限制消息处理,以便一次最多处理一条消息。这可以通过描述 here 的 "pull" 模式进行归档。 您基本上分配了一个具有传入消息(作业)队列的主角色和一个在没有作业时请求作业的工作角色。小心 master actor 中的队列 - 你可能不希望它增长太多,考虑监控和应用 back-pressure,这是 akka-stream.
涵盖的另一个大主题