Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Playframework Play框架:作业对无状态模型的影响_Playframework_Job Scheduling - Fatal编程技术网

Playframework Play框架:作业对无状态模型的影响

Playframework Play框架:作业对无状态模型的影响,playframework,job-scheduling,Playframework,Job Scheduling,Play框架的一大优点是它是完全无状态的,并且只面向请求/响应。这真的很好,因为它允许我将我的应用部署到云端,并在负载平衡器后面扩展播放实例的数量,而不必担心状态(会话)复制 然而,最近我需要在HTTP请求之外执行一些应用程序逻辑,并发现Play可以定义完全由框架管理的作业。听起来很不错,但它提出了一个问题:这些工作如何适应Play使用的无状态模型 假设我有一个需要每小时运行的维护任务,我为此定义了一个计划作业。如果我在一个负载平衡器后面部署多个Play实例,那么该作业会在每个实例上同时启动吗?

Play框架的一大优点是它是完全无状态的,并且只面向请求/响应。这真的很好,因为它允许我将我的应用部署到云端,并在负载平衡器后面扩展播放实例的数量,而不必担心状态(会话)复制

然而,最近我需要在HTTP请求之外执行一些应用程序逻辑,并发现Play可以定义完全由框架管理的作业。听起来很不错,但它提出了一个问题:这些工作如何适应Play使用的无状态模型

假设我有一个需要每小时运行的维护任务,我为此定义了一个计划作业。如果我在一个负载平衡器后面部署多个Play实例,那么该作业会在每个实例上同时启动吗?如果是这样的话,处理需要“独占”运行的作业的好方法是什么


我正在考虑在非集群服务器上创建一个新的play实例,重新使用现有(集群)实例的JPA模型(从而连接到同一个数据库)。这个新实例将只包含维护作业,并且由于它托管在非集群服务器上,因此没有同时运行作业的风险。同时,这将允许我保持现有集群实例完全无状态,并且易于主机/负载平衡。这是一个好方法吗?

我也建议将作业集群化。您可以在数据库中设置一个信号量,以确保只有一个作业正在运行。
另一个想法是看看Akka框架,它将包含在Play 2.0中。我认为它有处理这个问题的内在机制,但我不确定。我没有使用akka的经验。

正如neils提到的,在DB中保留一个标志有助于发现作业是否已经在运行。我使用带有其他标志的db信号量来提供作业状态和额外信息

您可以做的另一件事是使用Play.id计算并定义应该运行作业的实例。 我们使用“播放开始--%prod”,“播放开始--%prod1”。。。要启动应用程序,请在my doJob()方法中执行以下操作:


在快速查看了Play框架的源代码(类
Job
JobsPlugin
)之后,我认为这些不适合在集群环境中使用,因为重要的是,作业只在某个时间间隔运行一次(没有引入难看的hacks)

我认为有三种可能的解决办法:

  • 使用支持群集的作业计划程序。显而易见的选择是。Play还使用Quartz的一部分(解析CRON表达式),但不使用执行调度的部分

  • 当使用Play 2时,可能会选择提供

  • 更改作业,使其在运行两次时不受影响(对于某些用例可能)


  • 谢谢我真的不喜欢为此锁定我的DB,但我喜欢你的建议,检查作业正在哪个实例上运行!开始悬赏,见下文。是的,我们目前正在考虑解决方案1
    
    doJob(){
       if ("prod".equalsIgnoreCase(Play.id)) {
       ...
       }
    }