我有相当多的Apache Camel(路由/调解/编排引擎;轻量级ESB)经验,现在我正在努力理解Akka之间的区别:
- 调度程序(
Dispatcher ,
PinnedDispatcher ,
CallingThreadDispatcher )
- 路由器
- 池
- 组
- 事件总线
根据文档:
调度程序是:
...是使Akka Actors“工作”的原因,可以说它是机器的引擎。
但这并没有真正解释调度程序是什么或者它与Actor的关系是什么。
路由器是:
消息可以通过路由器发送,以有效地将它们路由到目标Actor,称为其路由。路由器可以在Actor内部或外部使用,您可以自行管理路由或使用具有配置功能的独立路由Actor。但它听起来非常像调度程序。
池是:
[一种]路由器[创建作为子Actor的路由],并在它们终止时从路由器中删除它们。
组是:
[一种]Actor[其中routees]在路由器外部创建,路由器使用Actor选择发送消息到指定路径,而不监视终止。
事件总线是:
...是向Actor组发送消息的方法
这听起来就像调度程序和路由器。
所以我的主要问题是:
- 调度程序,路由器和事件总线之间的区别是什么,每个何时使用?
- 何时使用池与组?
Dispatcher
就像是一个路由器,但是在 Akka 中用于消息传递和其他低级别的线程处理,因此,我永远不会直接向Dispatcher
发送消息,是吗?(2) 听起来事件总线实际上就像是一个系统范围的邮箱。 但是如果我已订阅从总线接收特定类型的消息,那么是否会阻止其他类型的 actors 也接收相同的消息呢?再次感谢! - smeebDispatcher
对你来说是透明的。它们会调度线程执行操作。你不能向dispatcher
发送消息。需要注意的是,dispatcher
不是 actor,而router
是。关于事件总线,你对系统范围邮箱的定义可能是正确的。然而,我不知道内部情况,但我真的怀疑 Akka 的开发人员会制作一些阻塞的东西。我认为它不会阻塞。可能实现为一个Router
,每种类型的消息的路由列表(订阅者)随时间变化。 - hveiga