高效地重新安排ActiveJob(resque/sidekiq)

5
我正在使用基于 Rails 4.2 的应用程序,该应用程序使用 resque/sidekiq 支持的 ActiveJob 进行电子邮件计划。当用户创建 newsletter campaign 时,将创建并安排在特定日期上运行的新作业。这非常好,但是如果用户更改了交付日期会发生什么呢?
在这种情况下,每个作业都可以检查它是否应该被执行,从而无效的作业将被忽略,只有最后一个作业将被执行。这可能有效,但如果用户进行了 1000 次编辑,则会将 1000-1 个无效作业推入队列 - 这不好。我认为应当更新或替换现有的作业。据我所知,在 Redis 队列中搜索 job_id 是很慢的。
那么,重定期 Rails 中的 ActiveJobs 的正确方法是什么(使用 resque/sidekiq)?

你有没有考虑过转移到 Que,它建立在 PostgreSQL 之上并与 AJ 集成?至少在大规模搜索更新方面它很快,但我不确定是否可以在其中进行重新调度。 - D-side
谢谢@D-side。我会检查一下它是否适合我的平台。 - xpepermint
@D-side 很有趣,我从未使用过Que宝石。 Que的主要目标是可靠性,看起来它也很快 - 完美适用于企业服务。 - xpepermint
我实际上使用它是为了减少依赖关系。我并没有期望有很多工作,所以把工作存储交给我已经在使用的数据库似乎很不错。可惜那个项目从未完成 :( - D-side
1个回答

5

没有,工作不应该被重新安排。你自己已经回答了这个问题:

在这种情况下,每个工作可以检查它是否应该被交付,因此无效的工作将被忽略,只有最后一个工作将被执行。

另一种选择是重新设计如何发送广告活动:在数据库中存储交付日期,并让cron每分钟检查需要立即投放的广告活动,然后创建Sidekiq工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接