多线程方法与Akka actor模型

时间:2016-01-21 20:47:48

标签: multithreading akka actor

我是akka演员的新手。我已经阅读了akka官方文档,但仍然不理解演员的工作方式与线程模型的比较。

我们来看一个像这样的简单例子。我有一个传统的HttpServer,它在线程池中有10个线程。当20个请求同时到来时,H​​ttpServer将委托线程池中的所有10个线程来处理前10个请求,其他线程将在网络接口中排队等待线程接收。

基于actor的HttpServer如何对同样的问题做出反应?是否所有请求都在委派的actor之前排队,以按顺序处理它们并将消息发送给其他actor?如果是这样,我不明白演员如何提供比线程模型更好的性能,因为只有1个actor按顺序处理20个请求并不比10个线程进程20请求同时快。

我想要了解的是,当多个请求同时聚集在一起时,actor会如何反应? ,不是演员在邮箱中如何处理和排队邮件,它已经在文档中出现了很多。有人可以模拟演员在这个例子中的工作方式吗?

2 个答案:

答案 0 :(得分:3)

这在很大程度上取决于你的演员(系统)配置,但很有可能你会有20个演员坐在公共router后面(例如RoundRobin路由器或{ {1}}路由器)和SmallestMailbox调度程序中的十个线程,在这种情况下,您的Akka服务器的行为与传统服务器类似 - 执行者的实现方式与{{1或者ThreadPoolExecutor将在传统服务器中实现,但在任何一种情况下,您都将拥有一个由10个线程池组成的20个工作池的池。

答案 1 :(得分:3)

让我试着给出一个一般性的答案,我希望能在高层为你澄清事情。

基于...

的HTTP服务中有10个线程和20个请求

典型线程模型

请求被分配给线程,直到满足请求为止。线程可能会阻塞,但不一定会释放以处理另一个请求。高性能的http服务器可以复制在actor模型中发现的行为类型(基于消息的流经多个线程),直到通常调用用户代码为止。

流/演员模型

请求的消化通过处理路由解析,处理请求和呈现响应的actor来进行(例如,结果可能会有所不同)。在该流程的各个点处,可以分配线程来处理不同的请求。理论上,所有20个请求都可以通过参与者模型进行移动,但在任何时候只有10个请求处于活动状态。

akka-http(基于akka-streams,基于akka-actors)等框架的好处是用户代码可以作为流元素参与整个流程,允许在线程模型中阻止的操作利用非阻塞I / O,允许线程被释放到另一个请求等待I / O解决。例如,http服务可以充当RESTful客户端并与其他(可能是多个,并行,通过actor)服务联系 - 该线程将被释放以处理其他请求等待对此类传出HTTP流量的响应。

摘要

演员模型正式化了一套(可以说是最好的)有效管理线程的实践。