首页 文章

Akka - 你应该创建多少个演员实例?

提问于
浏览
61

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

到目前为止,我的想法是为每种类型的请求创建一个actor . 例如 . 我会有一个POST到/ my-resource的actor和另一个GET到/ my-resource的actor .

我很困惑的是我应该如何创作演员?我是不是该:

  • 为每个请求创建一个新的actor(我的意思是我应该为每个请求做一个相应actor的TypedActor.newInstance())?创建新演员有多贵?

  • 在服务器启动时创建每个actor的一个实例,并为每个请求使用该actor实例?我读过一个演员一次只能处理一条消息,所以这不是瓶颈吗?

  • 做点别的吗?

感谢您的任何反馈 .

5 回答

  • 4

    好吧,您为要管理的每个可变状态实例创建一个Actor .

    在您的情况下,如果 my-resource 是单个对象并且您希望按顺序处理每个请求,那么这可能只是一个参与者 - 这很容易确保您只在修改之间返回一致的状态 .

    如果(更有可能)您管理多个资源,每个资源实例一个actor通常是理想的,除非您遇到数千个资源 . 虽然您也可以运行每个请求的actor,但如果您不考虑这些请求正在访问的状态,您最终会得到一个奇怪的设计 - 例如如果你只是为每个POST请求创建一个Actor,你会发现自己担心如何防止它们同时修改同一个资源,这清楚地表明你已经错误地定义了你的actor .

    我通常有相当琐碎的请求/回复演员,其主要目的是抽象与外部系统的通信 . 然后,它们与“实例”参与者的通信通常限于一个请求/响应对来执行实际操作 .

  • 24

    如果您使用的是Akka,则可以根据请求创建一个actor . Akka在资源方面非常渺茫,你可以在一个非常普通的JVM堆上创建数百万个演员 . 此外,他们只会在实际执行某些操作时使用cpu / stack / threads .

    一年前,我在基于线程和基于事件的标准actor的资源消耗之间做了一个comparison . Akka甚至比活动基地更好 .

    在我看来,Akka的一个重点是它允许你将系统设计为"one actor per usage",其中早期的actor系统经常因为资源开销而迫使你做"use only actors for shared services" .

    我建议你去选项1 .

  • 31

    选项1)或2)都有它们的缺点 . 那么,让我们使用选项 3) Routing (Akka 2.0+)

    路由器是一个充当 load balancer, routing the requests to other Actors which will perform the task needed. 的元素

    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");
    

    该程序在this blog中有详细解释 .

  • 23

    要扩展串行请求处理,请添加一个主actor(Supervisor),然后将其委托给worker actors(Children)(round-robin fashion) .

  • 8
    • 这是一个非常合理的选择,但它是否合适取决于您的请求处理的具体情况 .

    • 是的,当然可以 .

    • 对于许多情况,最好的办法是让一个演员响应每个请求(或者每个请求类型一个演员),但这个演员唯一能做的就是将任务转发给另一个演员(或者产生一个 Future )实际上会完成这项工作 .

相关问题