如何以编程方式将 Play 2.4 模块的执行限制为单个主机?
Posted
技术标签:
【中文标题】如何以编程方式将 Play 2.4 模块的执行限制为单个主机?【英文标题】:How can I programmatically limit the execution of a Play 2.4 module to a single host? 【发布时间】:2018-06-21 04:27:12 【问题描述】:只是提供一些背景知识,我有一个使用 Scala 2.11.8 的 Play 2.4 应用程序。 我使用具有 2 个可用实例的 OpsWorks 将其部署到 AWS 堆栈。在应用程序中有一个模块,它使用 ActorSystem 调度程序定期执行一个方法来做一些清理操作。在本地运行应用程序的一个实例时,清理工作正常,但是一旦部署应用程序,清理就不必要地在每个实例上运行。 我的问题不是针对我正在使用的堆栈,而是在部署应用程序后以编程方式将操作限制为单个实例的高级方法。出于这个问题的目的,假设我无权访问堆栈配置。 我在 S.O. 上搜索过类似的问题。但似乎找不到这个特定的问题。我也不想硬编码主机名,因为这不是一个可靠的解决方案。
【问题讨论】:
你能建立一个主/从架构吗?我的意思是您可以检查 Elastic Load Balancer 以使一个实例始终处于活动状态,而另一个实例作为备用实例? 不幸的是,由于对应用程序的其余部分有影响,我没有更改堆栈设置的选项。目标是尝试以编程方式而不是通过更改配置来完成此任务。我想我应该在问题中澄清这一点。 您能否通过发送 HTTP 请求来完成清理工作?这样,您可以确保请求仅到达服务器的一个实例 进行清理的模块是在服务器上运行的应用程序的一部分。我不想硬编码任何主机名以确保它只在一个实例上运行。应用程序只需要知道自己的主机名就应该能够执行一次清理——即使集合中还有 n 个其他实例正在运行。 你在 Heroku 中运行吗?当我只希望其中一个执行作业时,我遇到了同样的问题并使用 Redis 在演员之间同步解决了这个问题。如果你愿意,我可以分享代码。只是想了解我们是否有相同的用例。 【参考方案1】:这是一个你可以做的建议:
使用 Docker 容器化您的应用程序
使用 Kubernetes 或 Docker Swarm 等编排器
为您的应用服务器(在本例中为您的播放应用)设置服务发现
设置应用程序服务器前端的负载均衡器
通过向您的服务器(您的负载均衡器)发送 HTTP 请求,可以确保该请求仅到达您的应用程序服务器的一个实例,然后该实例将执行所需的清理工作。
【讨论】:
以上是关于如何以编程方式将 Play 2.4 模块的执行限制为单个主机?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Jenkins 在本地自动部署 Play Framework (2.4) 应用程序?
如何以编程方式将程序的 CPU 使用率限制在 70% 以下?