【问题标题】:Play 2 Heroku startup with multiple dynos使用多个测功机玩 2 Heroku 启动
【发布时间】:2013-02-22 18:55:39
【问题描述】:

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

在启动时,会触发一个 Akka Actor,它自己会安排未来的作业(例如发送推送通知)。

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 会用两个网络测功机执行两次吗?

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

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

【问题讨论】:

  • 正在寻找解决方案。你的最后是什么?

标签: heroku playframework-2.0


【解决方案1】:

如果您运行两个网络测功机,您的全局将执行两次。全局对于流程来说是全局的。当您扩展您的 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 是一个不错的选择。

【讨论】:

  • 感谢 Naaman 的良好反馈!不知道 ProcFiles 中的 singleton。会试一试的。
  • @Naaman 你不会因为这个解决方案而失去一个网络测功机吗?由于单例无法处理 HTTP 请求(因为只有名称为 web 的 dynos)
  • @Mik378 不,单身人士充当工人。示例包含 -Dhttp.port 可能令人困惑,但可能不需要(尚未测试是否有必要)。
  • @Naaman 想象一下初始配置有两个购买的 web 测功机。当前的 Procfile 将是:web: target/start -Dhttp.port=${PORT} ${JAVA_OPTS}。现在,如果我将此行附加到我的 Procfile:singleton: target/start -Dhttp.port=${PORT} ${JAVA_OPTS} -Dapplication.global=YourSecondGlobal 并缩放过程以将 1 dyno max 与 heroku ps:scale singleton=1 绑定,我将以多少 web dynos 结束?还是 2 + 1 工人(单身人士)?或者一个会被作为 worker 的单例进程替换,从而导致 1 个 web 和 1 个 worker?
  • 您将有两个 Web 进程和一个单例进程。您可以在单独的应用程序上对其进行测试,并通过键入 heroku ps 查看过程。
【解决方案2】:

您还可以在运行时获取测功机名称:

String dyno = System.getenv("DYNO");

所以做这样的检查也可能有效:

if(dyno.equals("web.1")) {

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-07
    • 2014-12-27
    • 2012-06-15
    • 1970-01-01
    • 2014-06-16
    • 2013-01-23
    • 2016-07-08
    • 2016-10-24
    相关资源
    最近更新 更多