考虑这样一种情况,我正在使用 Akka 实现一个处理传入任务的系统。我有一个主要的 actor 接收任务并将它们分派给一些 worker actor 处理任务。
我的第一反应是通过调度程序为每个传入任务创建一个 actor。在 worker actor 处理任务后,actor 会被停止。
对我来说,这似乎是最干净的解决方案,因为它遵循 "一个任务,一个 actor" 的原则。另一个解决方案是重用 actors,但这涉及额外的清理复杂性和一些池管理。
我知道 Akka 中的 actors 很便宜。但我想知道反复创建和删除 actors 是否存在固有成本。Akka 用于 actors 簿记的数据结构是否存在任何隐藏成本?
负载应该是每秒数十或数百个任务 - 将其视为创建一个 actor 的生产 Web 服务器请求。
当然,正确的答案在于根据传入负载类型对系统进行分析和微调。
后附说明:
关于手头的任务,我应该提供更多细节:
我的第一反应是通过调度程序为每个传入任务创建一个 actor。在 worker actor 处理任务后,actor 会被停止。
对我来说,这似乎是最干净的解决方案,因为它遵循 "一个任务,一个 actor" 的原则。另一个解决方案是重用 actors,但这涉及额外的清理复杂性和一些池管理。
我知道 Akka 中的 actors 很便宜。但我想知道反复创建和删除 actors 是否存在固有成本。Akka 用于 actors 簿记的数据结构是否存在任何隐藏成本?
负载应该是每秒数十或数百个任务 - 将其视为创建一个 actor 的生产 Web 服务器请求。
当然,正确的答案在于根据传入负载类型对系统进行分析和微调。
后附说明:
关于手头的任务,我应该提供更多细节:
- 仅有 N 个活动任务可以同时运行。如 drexin 所指出的那样 - 这将很容易地通过路由程序来解决。然而,任务的执行不是一种简单的运行和完成的事情。
- 任务可能需要来自其他 actors 或服务的信息,因此可能必须等待并变为休眠状态。这样做会释放一个执行槽。该槽可以被另一个等待的 actor 占用,现在它有运行的机会。你可以将其类比于在一个 CPU 上安排进程的方式。
- 每个 worker actor 都需要保留一些关于任务执行的状态。