Akka消息传递机制的例子

sme*_*eeb 11 routing dispatcher akka event-bus

我有相当数量的Apache Camel(路由/调解/编排引擎;轻量级ESB)经验,并试图了解Akka之间的区别:

  • 调度员(Dispatcher,PinnedDispatcher,CallingThreadDispatcher)
  • 路由器
  • 活动巴士

根据文件:

调度员是:

...是让Akka演员"打勾"的原因,它可以说是机器的引擎.

但这并没有真正解释调度员是什么或与演员的关系是什么.

路由器是:

消息可以通过路由器发送,以有效地将它们路由到目标参与者,称为路由器.路由器可以在actor的内部或外部使用,您可以自己管理路由或使用具有配置功能的自包含路由器actor.但这听起来很像调度员.

游泳池是:

[一种]路由器[that]创建路由器作为子actor,如果它们终止则将它们从路由器中删除.

团体是:

[类型] actor [路由]在路由器外部创建,路由器使用actor选择将消息发送到指定路径,而不监视终止.

活动巴士是:

...向演员组发送消息的方法

这听起来就像调度员和路由器.

所以我的主要关注点是:

  • 调度员,路由器和事件总线之间有什么区别,以及何时使用它们?
  • 何时使用池vs组?

hve*_*iga 21

一个调度程序基本上是一个线程池.Akka使用调度程序进行多项操作(例如在正确的邮箱中排队邮件或从actor邮箱中获取邮件并对其进行处理).每次需要执行其中一个操作时,都会选择一个来自线程池的线程并将其用于该线程.阿卡自带默认了default-dispatcher你可以在这里找到在配置reference.conf搜索default-dispatcher.您已经在使用,default-dispatcher但您可以定义一个不同的调度程序,以确保您有一个保留的线程池用于其他目的(例如,使用akka-remote或akka-cluster时的netty线程).

一个路由器在阿卡是使用某种路由逻辑将消息路由到routees名单的演员.根据逻辑,有许多类型的路由器:Broadcast,Balancing,RoundRobin ......你可以在akka文档中找到所有这些.路由器的路由可以是池或组.路由器最常用的用例之一是垂直扩展您的应用程序,这意味着最大限度地使用系统中可用的所有CPU(同时使用多个线程).

一个是指被点播给定类型创建的routees.例如,您可能想RandomPoolMyFancyActor有3个实例.Akka将创建三个演员MyFancyActor和第四个将成为实际路由器的演员.路由器演员每次收到消息时都会将消息转发给3个MyFancyActor演员之一.池负责重新启动actor并观察其生命周期,以确保您运行n个实例.

意味着你所定义的路由器之前,正在创建的routees.一旦定义了路由器,就需要传递先前创建的路由actor列表.一个小组不会监视你的演员的生命周期,你需要自己做.

事件总线是您可以与演员订阅特定类型的消息的频道.如果有特定类型的消息,那么你的演员就会得到它.这用于一些Akka内部,例如DeadLetter当消息无法到达其目的地时订阅s或者关于群集形成的事件(在akka-cluster中).您将使用它来了解您的事件ActorSystem.