我是 akka Actor 的新手。我已经阅读了 akka 官方文档,但仍然不明白 actor 与线程模型相比是如何工作的。
让我们举一个这样的简单例子。我有一个传统的 HttpServer,它在线程池中有 10 个线程。当同时有 20 个请求到来时,HttpServer 将委托(delegate)线程池中的所有 10 个线程来处理前 10 个请求,其余的将在网络接口(interface)中排队等待线程拾取。
基于 actor 的 HttpServer 将如何应对同样的问题?是否所有请求都在委托(delegate)的参与者面前排队,以按顺序处理它们并将消息发送给其他参与者?如果是这样,这就是我不明白actor如何提供比线程模型更好的性能的一点,因为只有1个actor按顺序处理20个请求不能比10个线程同时处理20个请求快。
我想了解的是,当多个请求同时出现时, Actor 如何 react ? ,而不是actor如何处理和排队邮箱中的消息,它已经在文档中出现了很多。有人可以模拟此示例中 Actor 的工作步骤吗?
最佳答案
让我试着给出一个比较笼统的答案,我希望能在高层次上为你澄清一些事情。
HTTP 服务中有 10 个线程和 20 个请求,基于...
典型的线程模型
请求被分配给一个线程,直到请求得到满足。线程可能会阻塞,但不一定要释放以处理另一个请求。高性能的 http 服务器可以复制参与者模型中的行为类型(通过多个线程的基于消息的流),直到通常调用用户代码为止。
流/ Actor 模型
请求的消化通过参与者处理路由解析、处理请求和呈现响应来进行(例如,结果可能会有所不同)。在这个流程的各个点,可以分配一个线程来处理不同的请求。理论上,所有 20 个请求都可以通过 Actor 模型移动,尽管任何时候只有 10 个处于事件状态。
使用诸如 akka-http(基于 akka-streams,基于 akka-actors)之类的框架的一个好处是,用户代码可以作为流式元素参与整个流程,从而允许可能在线程模型中阻塞的操作利用非-阻塞 I/O,允许线程被释放到另一个请求等待解决的 I/O。例如,http 服务可以很好地充当 RESTful 客户端并与其他(可能是多个并行的,通过参与者)服务联系 - 线程将被释放以处理其他请求,等待对此类传出 HTTP 流量的响应。
概括
Actor 模型形式化了一组(可以说是最好的)围绕有效管理线程的实践。
关于multithreading - 多线程方法与 Akka Actor 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34933990/