【问题标题】:Debug missing messages in akka调试akka中丢失的消息
【发布时间】:2013-09-11 13:40:01
【问题描述】:

我目前有以下架构:

Load(Play app with basic interface for load testing) -> Gateway(Spray application with REST interface for incoming messages) -> Processor(akka app that works with MongoDB) -> MongoDB

只要我推送的消息数量很少,一切正常。但是,当我尝试推送 10000 个事件时,最终会在 MongoDB 作为文档结束,它会在随机位置停止,例如在 742 消息或 982 消息上,之后什么也不做。

调试这种情况的最佳方法是什么?在负载方面,我只是在努力推动 REST 服务:

for (i ← 0 until users) workerRouter ! Load(server, i)

然后在workerRouter中

WS.url(server + "/track/message").post(Json.toJson(newUser)).map { response =>
  println(response.body)
  true
}

在喷雾方面:

pathPrefix("track") {
  path("message") {
    post {
      entity(as[TrackObj]) { msg =>
        processors ! msg
        complete("")
      }
    }
  }
}

在处理器方面,它基本上只是插入到集合中。关于从哪里开始有什么建议吗?

更新: 我试图将创建消息的逻辑移到 Gatewat,循环 1 到 10000,它工作得很好。但是,如果在管道中涉及喷涂和播放,则会中断和随机放置。在这种情况下如何调试有什么建议吗?

【问题讨论】:

  • 您尝试过 Typesafe 控制台吗?
  • 不,我还没有尝试过。我发现问题出在 Play Spray 通信中,因为如果我只在 Spray 端进行 100000 条记录(意味着没有 HTTP 通信),它可以正常工作。
  • 啊,好的。你问过喷雾用户毫升吗?
  • 当它被卡住时,你能检查你的线程在做什么(jstack <pid>)吗?这些天来,我们几乎每天都会遇到由线程饥饿引起的问题。如果您发现可疑内容,请将其发布在 Spray-user ML 上。
  • 我解决了这个问题,请阅读下文。

标签: mongodb scala playframework-2.0 akka spray


【解决方案1】:

在分布式和并行环境中,几乎不可能创建一个可靠工作的系统。无论您使用哪种调试方法,它都只会让您发现在调试会话期间会发生的一些错误。

有一次我们的团队花了 3 个月(!)调整应用程序以实现 24/7 全天候工作。仍然有错误。然后我们应用了Model checkingSpin)的方法。在几周内,我们实现了一个模型,使我们能够获得一个强大的应用程序。但是,模型检查需要一些不同的思维方式,而且可能很难开始。

【讨论】:

  • 我同意,但是在我的情况下,所有 3 层都在本地运行。换句话说,不应该有丢失的包裹。我承认存在内存限制和超时,但至少知道导致消息丢失的原因会对我有所帮助。我做了额外的测试,发现它是 SprayPlay 通信,因为如果一切都在 Spray 端完成而不使用 HTTP 管道(意味着不使用喷雾网关),它可以正常处理 100K+ 记录而没有一个错误。
【解决方案2】:

我将负载测试应用程序移至 Spray 框架,现在它就像一个魅力。所以我想问题出在我在 Play 框架中使用 WS API 的方式上:

WS.url(server + "/track/message").post(Json.toJson(newUser)).map { response =>
  println(response.body)
  true
}

问题已解决但未解决,不适用于基于 Play 的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    相关资源
    最近更新 更多