【发布时间】:2012-11-28 06:55:33
【问题描述】:
考虑一个场景,我正在实现一个使用 Akka 处理传入任务的系统。我有一个主要参与者,它接收任务并将它们分派给一些处理任务的工作参与者。
我的第一个直觉是通过让调度程序为每个传入任务创建一个演员来实现这一点。工作角色处理完任务后,它会停止。
这对我来说似乎是最干净的解决方案,因为它遵循“一个任务,一个演员”的原则。另一种解决方案是重用演员 - 但这涉及清理和一些池管理的额外复杂性。
我知道 Akka 的演员很便宜。但我想知道是否存在与重复创建和删除演员相关的固有成本。 Akka 用于记录参与者的数据结构是否存在任何隐藏成本?
负载应该是每秒数十或数百个任务的数量级 - 将其视为生产网络服务器,每个请求创建一个参与者。
当然,正确的答案在于根据传入负载的类型对系统进行分析和微调。 但我想知道是否有人可以根据自己的经验告诉我一些事情?
稍后编辑:
我应该提供有关手头任务的更多详细信息:
- 在某个时间点只能运行 N 个活动任务。正如@drexin 指出的那样 - 这可以使用路由器轻松解决。但是,任务的执行并不是简单的运行和完成类型的事情。
- 任务可能需要来自其他参与者或服务的信息,因此可能必须等待并进入睡眠状态。通过这样做,他们释放了一个执行槽。这个槽可以被另一个等待的actor占据,它现在有机会运行。您可以类比进程在一个 CPU 上的调度方式。
- 每个工作参与者都需要保持一些关于任务执行的状态。
注意:我很欣赏我的问题的替代解决方案,我一定会考虑它们。但是,我还想回答有关 Akka 中密集创建和删除演员的主要问题。
【问题讨论】:
-
您是否使用了任何建议的解决方案?我们有完全相同的问题...
-
嗨!你找到答案了吗?你是怎么解决这个问题的?
-
我的理解是演员的创作成本相对较低。您应该首先尝试设计一个允许您编写最简单和最易理解的代码的参与者系统。如果这意味着将一些临时任务与它自己的本地状态封装在一个短命的参与者中——那就去做吧。然后进行测量,如果性能不够好,请尝试调整系统并减少创建 Actor 的数量,这可能会导致 Actor 逻辑变得更加复杂。
标签: performance scala akka