gpt4 book ai didi

heroku - Play 2 Heroku startup with multiple dynos

转载 作者:行者123 更新时间:2023-12-04 00:45:19 25 4
gpt4 key购买 nike

我有一个 Play 2.x 应用程序在 Heroku 上启动并运行,只有一个 web dyno。

在启动时,会触发一个 Akka actor,它本身会安排 future 的工作(例如发送推送通知)。

object Global extends GlobalSettings {

override def onStart(app:Application) {
val actor = Akka.system.actorOf(Props[SomeActor])
Akka.system.scheduler.scheduleOnce(0 seconds, actor, None)
}
}

这适用于一个网络测功机,但我很想知道如果我调高网络测功机的数量会发生什么。onStart 会用两个 web dynos 执行两次吗?

如果 Global 真的在全局范围内工作并且 onStart 只执行一次,与网络测功机的数量无关,那就太好了。否则,多个测功机必须以某种方式就负责完成这项工作的一个测功机达成一致。

有人遇到过类似的问题吗?

最佳答案

如果你运行两个 web dynos,你的全局将被执行两次。全局对进程是全局的。当您扩展 Web 进程时,您正在运行两个进程。您有几个选择:

  • 使用不同的进程(又名单例进程)来运行您的全局。 Play 的好处在于您可以拥有多个 GlobalSettings 实现。当您开始您的流程时,您可以通过 -Dapplication.global=YourSecondGlobal 指定您想要使用的全局。然后,在您的 procfile 中,您将拥有 singleton: target/start -Dhttp.port=${PORT} ${JAVA_OPTS} -Dapplication.global=YourSecondGlobal。启动您的 Web 进程和 singleton 进程并确保 singleton 缩放到 1。
  • 使用分布式信号量获取锁。然后每个进程将竞相获得锁——获胜的进程将继续进行,其他进程将失败。如果您使用的是 Postgres(许多人使用 Heroku),一个 advisory lock是一个不错的选择。

关于heroku - Play 2 Heroku startup with multiple dynos,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15273516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com