【问题标题】:How to debug actor timeout reactivemongo api cursor fails to send request logback hell如何调试actor超时reactivemongo api游标无法发送请求logback地狱
【发布时间】:2016-04-07 06:02:17
【问题描述】:

带有反应式 mongo akka 演员的 Scala Play 应用

sbt 运行:

我偶尔会在 sbt 控制台上收到此错误十次:

它通常发生在重新编译和播放重新加载之后,否则它发生的频率较低,它不会导致任何失败,有时页面会出错。

[error] r.api.Cursor - fails to send request
java.util.concurrent.TimeoutException: Futures timed out after [3000 milliseconds]
        at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:219) ~[scala-library-2.11.7.jar:na]
        at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:153) ~[scala-library-2.11.7.jar:na]
        at scala.concurrent.Await$$anonfun$ready$1.apply(package.scala:169) ~[scala-library-2.11.7.jar:na]
        at scala.concurrent.Await$$anonfun$ready$1.apply(package.scala:169) ~[scala-library-2.11.7.jar:na]
        at akka.dispatch.MonitorableThreadFactory$AkkaForkJoinWorkerThread$$anon$3.block(ThreadPoolBuilder.scala:169) ~[akka-actor_2.11-2.3.13.jar:na]
        at scala.concurrent.forkjoin.ForkJoinPool.managedBlock(ForkJoinPool.java:3640) [scala-library-2.11.7.jar:na]
        at akka.dispatch.MonitorableThreadFactory$AkkaForkJoinWorkerThread.blockOn(ThreadPoolBuilder.scala:167) ~[akka-actor_2.11-2.3.13.jar:na]
        at scala.concurrent.Await$.ready(package.scala:169) ~[scala-library-2.11.7.jar:na]
        at reactivemongo.api.DefaultCursor$Impl$$anonfun$awaitFailover$1.apply(cursor.scala:474) ~[reactivemongo_2.11-0.11.10.jar:0.11.10]
        at reactivemongo.api.DefaultCursor$Impl$$anonfun$awaitFailover$1.apply(cursor.scala:474) ~[reactivemongo_2.11-0.11.10.jar:0.11.10]

此外,当我启动应用程序(连接到响应式mongo 驱动程序 mongodb)时,我会得到以下输出:

[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The node set is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated
[info] r.c.actors.MongoDBSystem - The primary is now authenticated

为什么这么多? 我该如何调试这种东西。

编辑:

我连接到 mongolab.com mongodb,所以我尝试了这个:

val defaultStrategy = FailoverStrategy()

val customStrategy =
  FailoverStrategy(
    delayFactor = attempt => 10
  )

// database-wide strategy
val db = connection.db("dbname", customStrategy)

但我看到了 10500 的超时!网络很好,天哪,这个响应式mongo有什么问题?

我有这个:

val RM = "org.reactivemongo" %% "reactivemongo" % "0.11.10"
val PRM = "org.reactivemongo" %% "play2-reactivemongo" % "0.11.10"

这个错误是什么意思(它不会导致应用程序崩溃或任何原因),什么样的代码会导致这个错误?

【问题讨论】:

  • 我有同样的问题,我可以在测试中稳定地重现。 Reactivemongo 刚刚发布了 0.11.11,它不再发生在我身上,但它变得太慢了,所以我只是增加了重试次数和延迟并回到 0.11.10

标签: mongodb scala reactivemongo


【解决方案1】:

我有同样的问题,我可以在测试时稳定地重现。

我尝试切换到 Reactivemongo 新版本 0.11.11,但异常停止了,因此整个系统性能下降。

我的最终解决方案是 - 增加连接数,并更改故障转移策略

    val mongoDriver = new MongoDriver(Some(configuration.underlying))
    Runtime.getRuntime().addShutdownHook(new Thread() {
        override def run() = {
            mongoDriver.close()
        }
    })

    val connectionOptions = MongoConnectionOptions(
        nbChannelsPerNode = 40,
        connectTimeoutMS = 5000
    )
    val mongoConnection: MongoConnection = mongoDriver.connection(List(mongoHost), connectionOptions)
    val customStrategy = FailoverStrategy(
        retries = 8,
        delayFactor = n => n * 1.5
    )
    mongoConnection(mongoDB, customStrategy)

现在我看不到它们,或者它们更难复制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 2020-09-10
    相关资源
    最近更新 更多