11

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

  • 调度员 ( Dispatcher, PinnedDispatcher, CallingThreadDispatcher)
  • 路由器
  • 游泳池
  • 团体
  • 事件总线

根据文档:

调度员是:

...是让 Akka Actors “滴答作响”的原因,可以说是机器的引擎。

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

路由器是:

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

是:

[一种] 路由器 [它] 创建路由作为子角色,并在它们终止时将它们从路由器中删除。

是:

[A type of] actor [where routees] 在路由器外部创建,路由器使用 actor 选择将消息发送到指定路径,而无需注意终止。

事件总线是:

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

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

所以我主要担心的是:

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

1 回答 1

21

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

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

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

意味着在定义路由器之前创建路由。一旦你定义了你的路由器,你需要传递一个你之前创建的路由演员列表。一个组不会监控你的演员的生命周期,你需要自己做这件事。

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

于 2015-06-04T04:33:38.970 回答