为什么 Spray 中每个请求的 Actor 比每个请求的线程 better/worse(如 Tomcat)?

Why Actor per request in Spray is better/worse than Thread per request (like in Tomcat)?

为什么 Spray 中每个请求的 actor 比每个请求的线程更好或更差(如 Tomcat)。什么策略提供更好的性能?

如果你使用 HTTP,你就有了一个无状态协议。因此它非常适合演员。

我想在写下每个方面之前。我将您重定向到这个很好的答案,它将我的陈述提升到更一般的水平。 How does Actors work compared to threads?

编辑:

Actor 基本上不共享状态,消息中的数据是不可变的。如果您正在使用线程,您可以轻松地在它们之间交换数据,并且还需要处理诸如生命周期和启动的线程数量之类的事情。共享状态(如果不是不可变的)可能会导致死锁和其他并发情况,这是一个基本事实。我不会遗漏一个事实,即您可以使用预实现的线程池,它会为您处理很多事情,包括 ExecutionContext。许多人都错误地使用了线程,包括我自己——我不是线程主题和所有并发问题的专家。 https://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html

Actor 应该是小而精的 "one" thing/topic/use-case。它们以分层方式构建,这意味着您有一个 ActorSystem,一个可以有许多不同类型的孩子的 RootActor,等等。它是通过发送 Asynchronous-Messages 进行通信(您也可以使用阻塞方式)。如果您启动一个 Actor,它会在一个线程中 运行ning。这意味着如果您发送 10 条需要 1 秒处理的消息,所有消息将在 ~10 秒后处理。这不是很并发,因此您可以生成更多的 Actors,但现在如果您正确使用它们,它们 运行 数量为 x 的共享线程。这可以防止线程被杀死并产生新线程。这一切都在后台处理,您可以通过 TypesafeConfig 对其进行配置。作为一个不切实际的例子,您可能会生成 20 个 Actors,但它们 运行 正在 4 个线程中运行 -- 而不是 20 个。所有这些东西都由 akka-actors 处理,您只需要考虑哪个 Dispatcher、Router、Mailbox你正在为你的目的使用。这就是喷雾的作用。

返回 HTTP:它是无状态的,这意味着在 TCP-Con 建立后,您发送 HTTP-Request 并且您将获得 HTTP 响应。之后,此对话已过时,并且 non-relevant 用于 HTTP。会话将通过 HTTP-Headers 识别,但协议本身不会对此做任何事情,会话内容是您的应用程序的工作。因此,为了处理 requests-repsonse spray 将有一个线程池和一些 Actors,它们将处理请求并将其重定向到您的路由。

您应该注意的一件事:Spray 是一个 REST/HTTP 框架。 REST 意味着如果您看到它非常严格并且 straight-forward.

,则每个消息都应包含相应响应所需的所有信息

我希望这会让事情变得更清楚一些。如果您想更深入地了解 Spray 使用的 ActorModel,您应该查看他们的网站(抱歉,我没有 link)或浏览可以提供很多帮助的代码。我知道我说的是非常基础的内容,但是所有这些主题都有很好的博客条目,我认为这不是写整部小说的正确背景。