ReactiveMongo 是如何实现的,使其被认为是非阻塞的?

2024-04-01

阅读有关 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等,将不胜感激。


是的,确实,您仍然需要使用线程来执行任何类型的工作,包括与数据库的通信。重要的是究竟如何这种沟通发生了。

ReactiveMongo“不使用线程”在某种意义上它不使用阻塞 I/O。常见的 Java I/O 设施,例如java.io.InputStream正在阻塞;这意味着从这样的InputStream或写信给OutputStream阻塞线程,直到“另一方”提供所需的数据或准备好接受它。对于网络通信,这意味着线程will被封锁。

然而,Java 提供了NIO API http://docs.oracle.com/javase/8/docs/api/java/nio/package-summary.html它支持非阻塞 and 异步输入/输出。我现在不想深入了解它的细节,但基本思想自然是非阻塞 I/O 允许不阻塞需要与外界交换某些数据的线程:例如,这些线程可以轮询数据源以检查是否有可用数据,如果没有,则返回到线程池并可用于其他任务。当然,这些设施是由底层操作系统提供的。

非阻塞 I/O 的确切实现细节通常隐藏在高级库中,例如Netty http://netty.io/因为它根本不好用。例如,Netty(这正是 ReactiveMongo 使用的库)提供了很好的类似异步回调的 API,它非常易于使用,而且功能强大且富有表现力,足以允许构建具有高吞吐量的复杂 I/O 密集型应用程序。

因此,ReactiveMongo 使用 Netty 与 Mongo 数据库服务器进行通信,并且由于 Netty 是异步网络 I/O 的实现,因此 ReactiveMongo 确实不需要长时间阻塞线程。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ReactiveMongo 是如何实现的,使其被认为是非阻塞的? 的相关文章

  • 循环遍历服务器上的数据库,并更新数据

    我有一台带有多个数据库的服务器 我需要循环访问这些数据库并更改每个数据库中的一个记录 一个表中的值 如何才能做到这一点 EXEC sp MSForEachDB Use UPDATE dbo MyTable SET MyValue 999
  • 运行 JAR 时“JCE 无法验证提供者 BC”

    在我的 scala 项目中我使用 org bouncycastle bcprov jdk14 1 51 用于密码学 如果它在 Scala IDE 中测试我的项目 它工作得很好 但是一旦我制作了一个 JAR 并尝试通过以下方式运行它java
  • 使用 System.currentTimeMillis() 每秒运行一次代码

    我试图使用 System currentTimeMillis 每秒运行一行代码 代码 while true long var System currentTimeMillis 1000 double var2 var 2 if var2 1
  • Scala SBT 和 JNI 库

    我正在编写一个简单的应用程序Scala通过以下方式使用 leveldb 数据库leveldbjni图书馆 我的build sbt文件看起来像这样 name Whatever version 1 0 scalaVersion 2 10 2 l
  • Scala:获取 Map.head 元素的键(和值)

    让我们想象一下以下不可变的 Map val foo Map 10 ten 100 one hundred 我想获得第一个元素的密钥 foo head获取第一个元素 但接下来呢 我还想要这个元素的值 即 十 设置键 值对 val key va
  • 如何使用 Scala 在 Spark 中漂亮地打印 JSON 数据帧?

    我有一个数据帧 我想将其作为有效的 json 写入 json 文件 我当前的代码如下所示 val df DataFrame myFun df toJSON saveAsTextFile myFile json 输出的格式为 如何将文件内容组
  • 选项包装值是一个好的模式吗?

    我最近写了以下 Scala 代码 val f File pretend this file came from somewhere val foo toFoo io Source fromFile f mkString 我真的不喜欢这种方式
  • 什么是 Java 8“视图”?

    我正在观看 Paul Philips 的演讲 http www youtube com watch v TS1lpKBMkgg http www youtube com watch v TS1lpKBMkgg 在 12 48 比较 Scal
  • .java 和 .scala 类之间是否可能存在循环依赖?

    假设我在 java 文件中定义了类 A 在 scala 文件中定义了类 B A 类使用 B 类 B 类使用 A 类 如果我使用 java 编译器 则会出现编译错误 因为 B 类尚未编译 如果我使用scala编译器A类将找不到 有没有可以同时
  • Spark - scala - 如何检查配置单元中是否存在表

    我必须使用 Spark 1 6 2 scala 检查配置单元中是否存在表 如果没有 我必须创建一个空数据框并将其保存为配置单元表 如果存在 则覆盖现有表 我需要一个返回布尔值的函数 基于该函数我可以做出上述决定 是否创建新表或覆盖现有表 1
  • 迭代 div 内的输入

    我试图通过 jQuery 迭代放置在特定 div 上的所有输入 但没有响应 我无法使用警报查看输入的值 我究竟做错了什么
  • Joda Time 类没有任何构造函数...为什么?我做错了什么?

    显然 Eclipse 上的 Scala 试图让我相信DateTime Period DateMidnightJoda Time 中的许多其他类没有任何构造函数 考虑到它们的文档显示了构造函数和许多方法 这很奇怪 我唯一可以访问的是静态方法
  • Scala 中奇怪的类型不匹配

    我希望这个问题还没有在其他地方得到解答 在这里没有找到答案 在我的本地化系统中 我有一个名为 Language 的类 class Language val name String dict HashMap String String def
  • 在scala / play框架中构建Json文件

    我正在使用 Play 框架和 Scala 我需要提供一个如下所示的输入 id node37 name 3 7 data children 如何使用 json 获取该格式 以下是 Play 框架网站上的示例 val JsonObject Js
  • 如何从字符串列中提取数字?

    我的要求是从列中的评论列中检索订单号comment并且总是开始于R 订单号应作为新列添加到表中 输入数据 code id mode location status comment AS SD 101 Airways hyderabad D
  • 如何以最佳方式传递元组参数?

    如何以最佳方式传递元组参数 Example def foo Int Int def bar a Int b Int 现在我想传递的输出foo to bar 这可以通过以下方式实现 val fooResult foo bar fooResul
  • 以编程方式启动 Scala REPL?

    我想从命令行启动 Scala Swing 应用程序 然后在应用程序启动后 放入 Scala REPL 中以用作控制界面 理想情况下 我还想预先绑定一些变量名称 更好的是使用 REPL 的 Java2D 终端模拟器 但我找不到任何合适的东西
  • 在 Akka/Scala 中使用带有 future 的 mapTo

    我最近开始使用 Akka Scala 编码 遇到了以下问题 通过范围内的隐式转换 例如 implicit def convertTypeAtoTypeX a TypeA TypeX TypeX just some kinda convers
  • 过滤字符串上的 Spark DataFrame 包含

    我在用火花1 3 0 http spark apache org releases spark release 1 3 0 html and 火花阿夫罗1 0 0 https github com databricks spark avro
  • 如何在 Apache Spark 中通过 DStream 使用特征提取

    我有通过 DStream 从 Kafka 到达的数据 我想进行特征提取以获得一些关键词 我不想等待所有数据的到达 因为它是可能永远不会结束的连续流 所以我希望以块的形式执行提取 如果准确性会受到一点影响 对我来说并不重要 到目前为止 我整理

随机推荐

  • 如何使用 State Hook 在 React 中编写语义 UI 单选组?

    我正在尝试使用 React 中的 Semantic UI 编写一个单选按钮组 我可以在以下位置获取无线电组示例广播页面 https react semantic ui com addons radio 语义 UI 的工作 它是通过扩展来写的
  • Android,从文件计算 SHA-1 哈希,最快的算法

    我在 Android 上遇到 SHA 1 性能问题 在 C 中 我在大约 3 秒内计算出哈希值 在 Android 中进行相同的计算大约需要 75 秒 我认为问题出在从文件读取操作中 但我不确定如何提高性能 这是我的哈希生成方法 priva
  • 索引的最大大小/文档数量是多少 - 32 位操作系统上的 java lucene 3.0.2

    我正在使用 lucene 和 40GB 的数据 500M 的元组 2 个字段的行为类似于键值 我创建了一个 35 GB 的索引 但它不起作用 因此 我想创建一组较小的索引 但为此 我需要有关最大尺寸的信息 你使用什么文件系统 您绝对确定已创
  • 如何使用 XCTest 测试 staticTexts 是否包含字符串

    在 Xcode UI 测试中 如何测试 staticTexts 是否包含字符串 在调试器中 我可以运行类似的命令来打印出 staticTexts 的所有内容 po app staticTexts 但是如何测试所有内容中的任何位置是否存在字符
  • 创建一个简单的计时器来计算秒、分钟和小时

    我正在尝试创建一个非常简单的程序 基本上是一个计时器 我有三套标签 lbl seconds lbl minutes and lbl hours 这些标签的默认值为00 00我希望计时器为每个标签更改它 我已经用谷歌搜索过这个 但我似乎找不到
  • Cocoa 中的手动绑定

    我有一个 ImageView 显示一个锁 通知打开的文件是否被锁定 我有 2 张锁定和解锁案例的图像 我想将显示的图像与代表打开文件的对象的布尔值同步 为此 我希望 ViewController 根据对象的锁定状态更改 ImageView
  • 如何将 pyspark 数据框保存在单个 csv 文件中

    这是这个的延续如何将数据帧保存到 csv pyspark https stackoverflow com questions 60498321 how to save dataframe into csv pyspark thread 我正
  • 查询以选择两个日期之间的数据,格式为 m/d/yyyy

    当我尝试从两个日期之间的表中选择记录时 我遇到了问题 m 使用以下查询 select from xxx where dates between 10 10 2012 and 10 12 2012 这个查询对我有用 但是当日期的格式如 1 1
  • React 的 Webpack 错误

    我正在尝试根据此配置 webpacktutorial https robots thoughtbot com setting up webpack for react and hot module replacement并不断收到相同的错误
  • 如何在编码时阻止自己覆盖 Python 函数?

    在追踪 Python 代码中的错误时 经常令人头疼的一个问题是看似无害的代码片段 如下所示 list a b c c list set list 这失败了 因为我用变量列表覆盖了函数 list 显然是一个人为的例子 但重点是 Python
  • AWS 上的 Node JS“Hello world”服务器

    我尝试在 AWS t1 micro 实例上运行 Hello world 服务器 我做了什么 我在aws上安装了Node 写了这样的东西 require http createServer function request response
  • 在 html2pdf 中使用 css 浮动

    我使用 float 将 2 个 div 放置在彼此旁边 a href printbox php print a
  • Excel countif vba 代码,其中包含产生值的条件

    我不确定我想要实现的目标是否可能 所以这里是 我有 2 张工作簿 第一张表包含员工的原始数据以及他们参加或未参加的培训 他们无法参加培训 工作表包含几列 例如 姓名 特殊 ID 每个员工都不同 2 个空白列 存在 是 否 以及更多 第二张表
  • MongoDB:更新子数组的属性仅更新第一个元素

    匹配元素如下所示 id oid 519ebd1cef1fce06f90e3157 from Tester2 to Tester messages username Tester2 message heeey read false usern
  • 计算异或的算法

    我想计算 0 到 n 1 2 1 之间的数字与 0 到 n 1 2 1 之间的每个数字的异或 我想在 O n 时间内完成此操作 并且不能使用 XOR OR AND 运算 如果我知道X和Y的XOR 我可以在常数时间内计算X 1和Y的XOR吗
  • 从 ARC 静态库访问 @property 时,ARC 应用程序崩溃

    我有一个 ARC 自动引用计数 questions tagged automatic reference counting 构建静态库 也称为 ARC 的应用程序 该应用程序将正常启动 但当执行读取或写入静态库中的 property 的操作
  • 相对路径不适用于 css 中的图像

    我有以下文件结构 C wamp myproject admin webroot images 我有一个位于 admin 文件夹内的 index php 文件 它调用位于同一文件夹中的 header inc php 文件 header inc
  • 将 MySQL 连接到 Visual Studio C#

    我正在尝试编写数据访问代码以将 MySQL 连接到 Visual Studio 到目前为止我有这段代码 但我不知道它是否正确 我正在使用我的书 并注释掉了一些其他内容 但是当我包含注释掉的信息时 我收到了错误 public static M
  • python中最好/最容易使用的加密库是什么[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想使用 python 加密几个文件
  • ReactiveMongo 是如何实现的,使其被认为是非阻塞的?

    阅读有关 Play Framework 和 ReactiveMongo 的文档让我相信 ReactiveMongo 的工作方式是使用很少的线程并且从不阻塞 然而 从 Play 应用程序到 Mongo 服务器的通信似乎必须发生在某处的一些线程