阅读有关 Play Framework 和 ReactiveMongo 的文档让我相信 ReactiveMongo 的工作方式是使用很少的线程并且从不阻塞。
然而,从 Play 应用程序到 Mongo 服务器的通信似乎必须发生在某处的一些线程。这是如何实施的? Play、ReactiveMongo、Akka 等源代码的链接也将非常感激。
Play 框架在此页面上包含一些有关此内容的文档关于线程池 https://www.playframework.com/documentation/2.4.x/ThreadPools。它开始于:
Play 框架从下到上是一个异步 Web 框架。使用迭代器异步处理流。 Play 中的线程池已调优使用比传统 Web 框架更少的线程,因为 play-core 中的 IO 永远不会阻塞。
然后它讨论了一些关于 ReactiveMongo 的内容:
典型的 Play 应用程序最常发生阻塞的地方是与数据库通信时。不幸的是,没有一个主要数据库为 JVM 提供异步数据库驱动程序,因此对于大多数数据库,唯一的选择是使用阻塞 IO。 A值得注意的例外是 ReactiveMongo,MongoDB 的驱动程序,使用 Play 的 Iteratee 库与 MongoDB 对话。
以下是有关使用 Future 的注意事项:
请注意,您可能会想将阻塞代码包装在 Futures 中。这并不意味着它是非阻塞的,它只是意味着阻塞将发生在不同的线程中。您仍然需要确保您使用的线程池有足够的线程来处理阻塞。
页面的Play文档中有类似的注释处理异步结果 https://www.playframework.com/documentation/2.4.x/ScalaAsync:
你不能通过将同步 IO 包装在 Future 中来神奇地将其转换为异步。如果您无法更改应用程序的架构以避免阻塞操作,在某个时刻,必须执行该操作,并且该线程将被阻塞。因此,除了将操作封装在 Future 中之外,还需要将其配置为在单独的执行上下文中运行,该执行上下文已配置了足够的线程来处理预期的并发性。
文档似乎说 ReactiveMongo 是非阻塞的,因此您不必担心它会占用线程池中的大量线程。但是ReactiveMongo必须与Mongo服务器通信某处.
如何实现这种通信,以便 Mongo 不会耗尽 Play 默认线程池中的线程?
再次,链接到特定文件Play https://github.com/playframework/playframework, 反应式Mongo https://github.com/ReactiveMongo/ReactiveMongo, Akka https://github.com/akka/akka等,将不胜感激。