Akka消息传递机制示例



我有相当数量的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线程)。

Akka中的路由器是一个参与者,它使用某种路由逻辑将消息路由到路由者列表。根据逻辑的不同,有许多类型的路由器:Broadcast, Balancing, RoundRobin…你可以在akka文档中找到所有这些。路由器的路由可以是池或组。路由器最流行的用例之一是垂直扩展你的应用程序,这意味着最大限度地利用系统中所有可用的CPU(同时使用多个线程)。

意味着路由是为给定类型按需创建的。例如,您可能希望RandomPoolMyFancyActor具有3个实例。Akka将创建MyFancyActor的三个参与者,第四个参与者将是实际的路由器。每次路由器参与者收到消息时,都会将消息转发给3个MyFancyActor参与者之一。池负责重新启动actor并监视它们的生命周期,以确保您有n个实例正在运行。

表示路由是在你定义路由器之前创建的。一旦你定义了你的路由器,你就需要传递一个你之前创建的路由参与者的列表。一个组不会监视你的角色的生命周期,你需要自己做这件事。

事件总线是可以通过参与者订阅特定类型消息的通道。如果存在这种特定类型的消息,您的actor将获得它。这用于一些Akka内部,例如当消息无法到达目的地或关于集群形成的事件(在Akka -cluster中)时订阅DeadLetter。您将使用它来了解ActorSystem中发生的事件。

最新更新