我遇到了一个问题,无法避免我的应用程序向延迟作业队列中添加重复的作业。我已经做了一些搜索,但都没有结果。如果您有任何实现解决方案的建议,将不胜感激。
以下是我发现的一些链接,但没有提供解决方案:
以下是我发现的一些链接,但没有提供解决方案:
我不会专注于避免重复工作。在我看来,任务队列应该是无状态的,不保存状态。将工作添加到队列中应尽可能快。任何提前检查都会减缓响应时间。
相反,工作本身应该足够聪明,能够判断是否适合运行。例如,工作可以首先检查模型上的状态、标志或时间戳,只有当前提条件仍然有效时才开始实际处理。
根据@spickermann所说,任何重复检查都应该在后台进行,而不是在转储时进行。
我解决这个问题的方法是在delayed_jobs表上创建了两个新字段:signature和args。Signature将是“Class#method”或“Object:id#method”。Args只是来自payload对象的args。通过添加这些字段,您现在可以查询作业表以查看是否有重复。
对于我们的应用程序,如果存在重复项,我们将取消当前作业,允许更近期的调用继续进行。但是,如果较新的重复作业不断添加到队列中,此方法可能会导致饥饿,因此您可能希望采用相反的方法,即如果存在重复项,则销毁除当前作业之外的所有未来调用。
以下是如何通过延迟作业插件实现此目标的要点:https://gist.github.com/synth/fba7baeffd083a931184