Akka 消息传递机制示例

Akka messaging mechanisms by example

我有相当多的 Apache Camel(routing/mediation/orchestation 引擎;轻量级 ESB)经验,并且正在绞尽脑汁试图理解 Akka 之间的区别:

根据文档:

调度员是:

...is what makes Akka Actors “tick”, it is the engine of the machine so to speak.

但这并不能真正解释什么是调度员或它与演员的关系。

路由器是:

Messages can be sent via a router to efficiently route them to destination actors, known as its routees. A Router can be used inside or outside of an actor, and you can manage the routees yourselves or use a self contained router actor with configuration capabilities. But it sounds an awful lot like a dispatcher.

是:

[A type of] router [that] creates routees as child actors and removes them from the router if they terminate.

群组 是:

[A type of] actor [where routees] are created externally to the router and the router sends messages to the specified path using actor selection, without watching for termination.

事件总线是:

...a way to send messages to groups of actors

这听起来就像调度程序和路由器。

所以我主要担心的是:

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

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

A pool 表示正在为给定类型按需创建路由。例如,您可能想要 RandomPool of MyFancyActor 和 3 个实例。 Akka 将创建 MyFancyActor 的三个 actor 和第四个将成为实际路由器的 actor。每次路由器 actor 收到消息时,都会将消息转发给 3 MyFancyActor actor 之一。池负责重新启动 actors 并观察它们的生命周期以确保您有 n 个实例 运行.

A group 表示在定义路由器之前创建路由。一旦你定义了你的路由器,你将需要传递一个你之前创建的 routees actor 的列表。一个组不会监控你的演员的生命周期,你需要自己做。

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

中发生的事件