【问题标题】:Scheduling a job after all jobs of a certain type are finished在完成特定类型的所有作业后安排作业
【发布时间】:2014-03-20 20:00:41
【问题描述】:

我有一个相当复杂的缓存和失效设置,如果特定数据集发生更改,我需要重新计算大量数据。

基本上,如果一个特定条目发生变化,这可能会创建多达 15 个重新计算内容的工作。 当这些作业正在运行时,可能会发生另一个主要条目发生变化。再次创造了几个工作岗位。 (这可能同时发生)

我需要实现的是在作业运行后汇总结果。并且只进行一次这种聚合可能是有意义的。

所以我需要做的是运行一个作业,在所有其他作业完成后只运行一次。

(顺便说一句:我正在取消 BCCResqueuBundle)

【问题讨论】:

  • 听起来不错,但您的问题是什么?
  • 如何实现这一点。如何在所有其他人都完成后安排工作。
  • 在我看来,您可以将引用计数器与锁结合使用。锁:有 1 个或多个异步工作者正在运行,或者聚合作业正在运行。参考计数器告诉异步工作人员的 nr。聚合器仅在 ref 计数器为零时才声明锁。
  • 好的,我想我明白了,但在异步作业上设置一个计数器可能就足够了,在一项作业完成后,我减少计数器,然后检查仍在运行的作业的数量,如果没有其他人在运行,我会安排聚合作业。我不确定我是否需要锁。
  • 听起来不错。如果聚合作业仍然忙时不存在启动工作线程的风险,则不需要锁定。顺便说一句,我没有将此作为答案发布,因为我不知道 100% 确定这是否是您所要求的。你的问题不是很详细。请稍后关闭问题和/或发布您自己的答案(您接受)。

标签: php symfony redis php-resque


【解决方案1】:

您可以使用引用计数器,如果需要,可以将其与锁结合使用。

引用计数器告诉异步工作者的 nr。启动时递增,完成或失败时递减。

锁:1 个或多个异步工作器正在运行,或者聚合作业正在运行。 如果您使用仔细的调度,则不需要锁定。

【讨论】:

  • 我刚遇到一个问题。我正在增加作业中的计数器,但可能是在作业完成后,没有其他作业正在运行,但可能有一些作业排队,我不知道如何找到特定的排队作业。我可以不是在作业执行期间增加计数器,而是在我将它们排入队列时。我只是害怕,万一作业失败,我的聚合作业将永远无法运行。
  • 是的,这就是为什么我在上面发布 decrement when finished 或 failed。如果作业失败,作业调度程序不会告诉您吗?应考虑异常流量,但需要不同的逻辑。您可以为此编写一个(预定的)看门狗进程。您还可以将所有内容放在一个工作中,首先进行异步工作(使用线程或greenlets),然后再进行聚合。我不知道您的解决方案必须有多分散。
  • 事后思考:你也可以在你的引用计数器上设置一个 TTL(如果在工作进程失败后没有清理工作)。
  • TTL 听起来是一个非常简单的解决方案,可能不是 100% 稳健,但听起来是一个很好的起点。如果我有时间,我还可以引入一个减少计数器的故障处理程序。
猜你喜欢
  • 2023-03-18
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 2019-10-01
  • 1970-01-01
  • 2017-01-20
相关资源
最近更新 更多