【问题标题】:Restart Akka Actor System after terminated终止后重启 Akka Actor System
【发布时间】:2018-05-06 05:52:43
【问题描述】:

我们有一个 Akka http 应用程序,大约。 100 多个 API 和 15 多个演员。在Http.bindAndHandle(routes, host, port) 之后,我已经终止了 ActorSystem。

Http().bindAndHandle(corsHandler(routes), "0.0.0.0", 9090/*, connectionContext = https*/)
sys.addShutdownHook(actorSystem.terminate())

所以,我不想停止我的申请。所以,我的问题是:

  1. actorsystem 是否需要强制终止?

  2. 我的应用程序在终止 actorsystem 后是否停止工作?

  3. 如果用户在 actorsystem 终止后点击 API 怎么办?是否会重新启动以处理 API 请求?

那么,如果我希望我的应用程序始终监听客户端请求,我需要做什么。

谢谢。

【问题讨论】:

  • 你的演员被终止的原因是什么?为什么不使用监督策略来恢复或重启你的演员
  • 感谢@Raman 的快速回复。是否需要终止系统?不知道什么时候结束。
  • 谢谢,我会检查监督策略以恢复或重新启动..如果您想让我高兴,请告诉我链接。
  • 所以当且仅当出现一些错误时它才会被终止!!然后使用监督策略,一旦你有一些错误传播给监督者,只需重新启动演员,这很简单,所以你的应用程序将监听你的请求

标签: scala akka akka-http shutdown-hook


【解决方案1】:

您正在寻找应用程序中的容错能力。由于演员系统将在出现某些错误或我们明确强制其终止时终止。您必须使用监督策略让您的应用程序具有容错性。请查看这些链接

https://doc.akka.io/docs/akka/2.5/fault-tolerance.html https://doc.akka.io/docs/akka/2.5/general/supervision.html

【讨论】:

  • 谢谢,我一定会调查的
【解决方案2】:

关闭钩子的目的是在 JVM 即将关闭时允许应用程序有序关闭。不一定在所有情况下都需要,但如果您的 ActorSystem 想要以有序的方式释放资源,或者向集群中的其他节点发出它正在关闭的信号,则有序关闭可能很有用。

当 Actor 系统终止时,将不再有 Actor 来处理 HTTP 请求,因为如果没有正在运行的 Actor 系统参与,Actor 就无法存在。所以不,如果您的用户在actor系统终止后点击API,actor系统将不会重新启动,因为请求将被简单地拒绝(连接被拒绝或其他东西)。

您无法避免这种情况发生在您的代码中,因为无法取消 JVM 关闭。

不过,好消息是,您可以在基础设施级别使用各种操作技术来避免它,例如带有 HTTP 负载平衡器的蓝绿部署可以支持无状态应用程序的无停机升级。

【讨论】:

  • 谢谢罗宾。我已经多次初始化了actoryatem。就像在我的服务中一样,我需要执行者和参与者系统的隐式 val。所以,我在我的课程中已经像这样初始化了 Actorsyatem 4 次: private implicit val actorSystem = ActorSystem() private implicit val executor: ExecutionContext = actorSystem.dispatcher private implicit val materializer: ActorMaterializer = ActorMaterializer() 这是否会影响我的应用程序性能。因为我的应用程序在运行 1 到 2 天后挂起。如上所述,我只终止了一个actorsystem。
  • 这些actor系统是否占用了服务器的所有资源??
  • 不应该。但这听起来像是一个完全不同的问题。我建议你在 Stackoverflow 上提出一个新问题“为什么我的 Akka 应用程序在 1 到 2 天后挂起?”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 2011-09-04
  • 1970-01-01
  • 2019-12-19
  • 2018-01-14
相关资源
最近更新 更多