Routing Akka消息传递机制示例

Routing Akka消息传递机制示例,routing,akka,dispatcher,event-bus,Routing,Akka,Dispatcher,Event Bus,我有相当多的Apache Camel(路由/中介/管弦引擎;轻量级ESB)经验,我绞尽脑汁试图理解Akka之间的区别: 调度员(Dispatcher,PinnedDispatcher,呼叫ReadDispatcher) 路由器 水池 团体 活动巴士 根据文件: 调度员是: …是什么使阿克卡演员“滴答滴答”,可以说是机器的引擎 但这并不能真正解释调度员是什么,或者它与参与者的关系是什么 路由器是: 消息可以通过路由器发送,以有效地将它们路由到目标参与者(称为其路由者)。路由器可以在参与者内部或

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

  • 调度员(
    Dispatcher
    PinnedDispatcher
    呼叫ReadDispatcher
  • 路由器
  • 水池
  • 团体
  • 活动巴士
根据文件:

调度员是:

…是什么使阿克卡演员“滴答滴答”,可以说是机器的引擎

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

路由器是:

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

池是:

[一种]路由器[它]将路由对象创建为子参与者,并在终止时将其从路由器中移除

组包括:

[一种]参与者[其中路由对象]是在路由器外部创建的,路由器使用参与者选择将消息发送到指定路径,而不监视终止

事件总线是:

…向一组参与者发送消息的方式

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

因此,我主要关注的是:

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

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

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

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

表示在定义路由器之前创建路由对象。定义路由器后,需要传递先前创建的路由器列表。团队不会监控参与者的生命周期,您需要自己进行监控


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

非常棒的答案,谢谢@hveiga(+1)-下面几点非常快:(1)听起来像
调度器
就像路由器,但在Akka内部用于消息传递和其他低级线程,因此,我不会直接给调度员发信息,是吗?(2) 听起来,事件总线实际上就像一个参与者系统范围的邮箱。但是,如果我订阅了从总线接收特定类型的消息,这会阻止其他参与者类型也接收相同的消息吗?再次感谢<代码>调度程序s对您来说是透明的。它们分派线程来执行操作。您不能向
调度程序发送消息。值得一提的是,
调度器
不是参与者,而
路由器
是参与者。关于事件总线,您对类似于系统范围邮箱的定义可能是正确的。然而,我不知道里面的东西,但我真的怀疑阿克卡的人会做出一些阻碍。我想它不会阻塞。可能被实现为一个
路由器
,其中每种消息类型的路由对象(订阅者)列表随时间而变化。为什么我们需要同一参与者的3个实例?我以为一直只有一个演员的例子?并且消息是由调度程序传递给参与者的?您可能需要同一参与者的多个实例。由于在给定的时间点,参与者只能处理一条消息,因此可能存在需要同时处理多条消息的场景。实现这一点的方法是拥有一个或多个参与者群体。