多线程方法vs Akka actor模型

我是新来的阿卡演员。 我已经阅读了AKK官方文档,但仍然不明白演员作品与线程模型相比如何。

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

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

我想要了解的是,当多个请求同时在一起时,参与者如何反应? ,而不是演员如何在邮箱中处理和排列邮件,这在文档中已经显示出很多。 有人可以模拟演员如何在这个例子中工作的步骤?


让我试着给出一个有点一般的答案,我希望能够在很高的层次上为你澄清事情。

在HTTP服务中有10个线程和20个请求,基于...

典型的线程模型

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

流/演员模型

请求的消解通过处理路由解析,处理请求以及呈现响应(参见示例,结果可能不尽相同)中的角色进展。 沿着这个流程的不同点可以分配一个线程来处理不同的请求。 从理论上讲,所有20个请求都可能在演员模型中移动,但只有10个请求会随时处于活动状态。

诸如akka-http之类的框架(基于akka流,基于akka-actors)的好处是用户代码可以作为整体流中的流式元素参与,从而允许可能阻塞在线索模型中的操作利用非 - 阻塞I / O,允许线程释放到另一个请求,等待I / O解析。 例如,http服务可以充当一个RESTful客户端,并与其他(可能是多个,并行,通过参与者)服务接触 - 线程将被释放以处理其他请求,以等待对这种传出HTTP通信的响应。

概要

行为者模型正式形成了一套围绕管理线程的(可以说是最好的)实践。


这很大程度上取决于您的演员(系统)配置,但很可能您将有二十个演员坐在一个普通路由器后面(例如RoundRobin路由器或SmallestMailbox路由器)以及ThreadPoolExecutor调度程序中的十个线程,在这种情况下,您的Akka服务器的行为与传统服务器类似 - 在传统服务器中实现actor的方式与实现RunnableCallable会有所不同,但无论哪种情况,您都将拥有一个20名工作人员在十个线程池中运行。

链接地址: http://www.djcxy.com/p/21515.html

上一篇: Multi thread approach vs Akka actor model

下一篇: Declaring Actor state variables as mutable ones