【问题标题】:Is there support for compression in ReactiveMongo?ReactiveMongo 中是否支持压缩?
【发布时间】:2023-03-19 14:02:02
【问题描述】:

我使用ReactiveMongo 作为 Akka-Http、Akka-Streams 项目的连接器。我正在创建如下所示的 MongoConnection,但数据库中的数据是使用 Snappy 压缩的。无论我在哪里看,在 ReactiveMongo 文档中都找不到任何关于压缩支持的内容。当我尝试使用带有compressors=snappy 标志的URL 连接到Mongo 数据库时,它返回异常。

我查看了源代码,确实似乎根本没有提到压缩支持。在这一点上,我愿意接受一个黑客工作。

谁能帮帮我?

MongoConnection.fromString("mongodb://localhost:27017?compressors=snappy").flatMap(uri => driver.connect(uri))

例外:

23:09:15.311 [default-akka.actor.default-dispatcher-6] ERROR akka.actor.ActorSystemImpl - Error during processing of request: 'The connection URI contains unsupported options: compressors'. Completing with 500 Internal Server Error response. To change default exception handling behavior, provide a custom ExceptionHandler.
java.lang.IllegalArgumentException: The connection URI contains unsupported options: compressors
    at reactivemongo.api.AsyncDriver.connect(AsyncDriver.scala:227)
    at reactivemongo.api.AsyncDriver.connect(AsyncDriver.scala:203)
    at reactivemongo.api.AsyncDriver.connect(AsyncDriver.scala:252)

如果你需要一个可行的例子,你可以试试这个: (您实际上并不需要在本地运行 MongoDB 容器来引发错误)

object ReactiveMongoCompressorIssue extends App {
  import scala.concurrent.Await
  import scala.concurrent.duration._

  implicit val actorSystem = ActorSystem("ReactiveMongoCompressorIssue")
  implicit val dispatcher: ExecutionContextExecutor   = actorSystem.dispatcher

  final val driver = AsyncDriver()
  val url = "mongodb://localhost:27017/?compressors=snappy"

  val connection = Await.result(MongoConnection.fromString(url).flatMap(uri => driver.connect(uri)), 3.seconds)

  assert(connection.active)
}

【问题讨论】:

  • 不,没有这样的选项。压缩器选项不压缩数据库,而是通过网络压缩消息。 DB 压缩在 DB 选项中管理,而不是在驱动程序端。近期不计划支持网络压缩。
  • 您想要哪种压缩方式,在客户端和服务器之间的网络上或服务器存储的数据上?
  • 我需要 Snappy 压缩支持。
  • 数据是如何压缩的?

标签: mongodb scala akka akka-stream reactivemongo


【解决方案1】:

感谢@cchantep 所说的关于如何在服务器端处理 MongoDB 中的压缩(请参阅MongoDB docs here),我回顾了 ReactiveMongo 源代码,看看是否有办法绕过检查或删除自己从 URL 中标记并在没有它的情况下连接。

确实,我发现有一个名为strictMode 的布尔标志,它决定了ignoredOptions 例如compressors 标志是否应该引发异常。所以现在我的连接看起来像这样:

MongoConnection.fromString(url).flatMap(uri => driver.connect(uri, None, strictMode = false))

None 指的是连接池的名称,但我之前使用的另一个 connect 方法也没有使用,所以这很好用。

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 2012-08-04
    • 1970-01-01
    • 2017-10-24
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多