Akka – 你应该创build多less个演员实例?

我是Akka框架的新手,我正在Netty + Akka之上构build一个HTTP服务器应用程序。

我的想法到目前为止是为每种types的请求创build一个actor。 例如,我将有一个演员为POST到/我的资源和另一个演员为GET到我的资源。

我困惑的地方是我应该如何去创造演员? 我是不是该:

  1. 为每个请求创build一个新的actor(我的意思是每个请求我应该做适当的actor的TypedActor.newInstance())? 创造一个新的演员有多昂贵?

  2. 在服务器上创build每个angular色的一个实例,并为每个请求使用该angular色实例? 我读过一个演员一次只能处理一个消息,所以这不是瓶颈吗?

  3. 做别的事吗?

感谢您的任何反馈。

那么,你为你想pipe理的每个可变状态实例创build一个Actor。

在你的情况下,如果my-resource是单个对象,并且你想要连续处理每个请求,那么这可能只是一个actor,这很容易确保你只能在修改之间返回一致的状态。

如果(更有可能)您pipe理多个资源,则每个资源实例一个angular色通常是理想的,除非遇到数千个资源。 虽然您也可以运行每个请求的演员,但如果您不考虑这些请求正在访问的状态,则最终会出现一个奇怪的devise – 例如,如果您只是为每个POST请求创build一个Actor,则会发现自己很担心如何防止他们同时修改相同的资源,这清楚地表明您已经错误地定义了您的angular色。

我通常有相当微不足道的请求/答复演员,其主要目的是抽象与外部系统的沟通。 他们与“实例”参与者的通信通常限于一个请求/响应对来执行实际行动。

如果您正在使用Akka,则可以为每个请求创build一个actor。 Akka的资源非常渺茫,你可以在一个非常普通的JVM堆上创build几百万个演员。 而且,他们只会在实际上做某些事情时才使用cpu / stack / threads。

一年前,我对基于线程和基于事件的标准参与者的资源消耗进行了比较 。 阿卡甚至比事件基础更好。

在我看来,Akka最重要的一点就是它允许你devise你的系统为“每个用户一个angular色”,早期的angular色系统通常会迫使你由于资源开销而“只使用angular色参与共享服务”。

我会build议你去select1。

选项1)或2)都有其缺点。 那么,让我们使用选项3) 路由 (Akka 2.0 +)

路由器是充当负载平衡器的元素,将请求路由到其他将执行所需任务的angular色。

Akka使用不同的逻辑提供不同的路由器实现来路由消息(例如SmallestMailboxPool或RoundRobinPool)。

每个路由器可能有几个孩子,其任务是监督他们的邮箱进一步决定在哪里路由收到的消息。

 //This will create 5 instances of the actor ExampleActor //managed and supervised by a RoundRobinRouter ActorRef roundRobinRouter = getContext().actorOf( Props.create(ExampleActor.class).withRouter(new RoundRobinRouter(5)),"router"); 

这个程序在这个博客中有很好的解释。

  1. 这是一个相当合理的select,但是否合适取决于您的请求处理的具体情况。

  2. 是的,当然可以。

  3. 对于很多情况来说,最好的办法是让一个参与者响应每个请求(或者每个请求types可能有一个参与者),但是这个参与者唯一做的就是将任务转发给另一个参与者(或者产生一个Future )这将实际上做这项工作。

为了扩大串行请求的处理,添加一个主angular色( Supervisor ),这个主angular色又将委派给工作者angular色( Children )( 循环方式 )。