我有相当数量的Apache Camel(路由/中介/编排引擎;轻量级ESB)的经验,我绞尽脑汁试图理解Akka:
- Dispatchers (
Dispatcher
,PinnedDispatcher
,CallingThreadDispatcher
) 路由器 - 组
- 事件总线
根据文档:
调度程序:
…是什么让Akka演员"滴答",它是机器的引擎,可以这么说。
但这并没有真正解释调度程序是什么,或者它与actor的关系是什么。
路由器:
消息可以通过路由器发送,以有效地将它们路由到目标参与者,即它的路由者。Router可以在actor的内部或外部使用,你可以自己管理路由,也可以使用具有配置功能的自包含Router actor。但听起来很像调度员。
:
[一种]路由器[它]将路由创建为子角色,并在它们终止时从路由器中移除。
组:
[一种类型的]actor[其中路由]是在路由器外部创建的,路由器使用actor选择将消息发送到指定的路径,而不观察终止。
事件总线是:
…一种向参与者组发送消息的方法
这听起来就像调度程序和路由器。
所以我主要关心的是:
- 调度程序、路由器和事件总线之间的区别是什么?何时使用它们?
- 何时使用池vs组?
调度程序基本上是一个线程池。Akka使用dispatcher做很多事情(比如在正确的邮箱中对消息进行排队,或者从actor邮箱中提取消息并进行处理)。每次需要执行其中一个操作时,都会从线程池中选择一个线程并将其用于该操作。Akka默认带有default-dispatcher
,您可以在reference.conf中搜索default-dispatcher
找到配置。您已经在使用default-dispatcher
,但是您可以定义一个不同的调度程序,以确保您有一个预留的线程池用于其他目的(例如,当使用akka-remote或akka-cluster时,用于netty线程)。
池意味着路由是为给定类型按需创建的。例如,您可能希望RandomPool
或MyFancyActor
具有3个实例。Akka将创建MyFancyActor
的三个参与者,第四个参与者将是实际的路由器。每次路由器参与者收到消息时,都会将消息转发给3个MyFancyActor
参与者之一。池负责重新启动actor并监视它们的生命周期,以确保您有n个实例正在运行。
组表示路由是在你定义路由器之前创建的。一旦你定义了你的路由器,你就需要传递一个你之前创建的路由参与者的列表。一个组不会监视你的角色的生命周期,你需要自己做这件事。
事件总线是可以通过参与者订阅特定类型消息的通道。如果存在这种特定类型的消息,您的actor将获得它。这用于一些Akka内部,例如当消息无法到达目的地或关于集群形成的事件(在Akka -cluster中)时订阅DeadLetter
。您将使用它来了解ActorSystem
中发生的事件。