1

我有一个在特定时间结束(到期)的 sql 数据库中的拍卖项目列表,我正在寻找使用 (Delayed::Job.enqueue) 在给定拍卖完成时触发方法的正确方法。

1)在拍卖开始时加载到内存中的每个拍卖使用一个工作器

2) 使用一个在 Web 应用程序启动时加载的工作程序,它会定期查询数据库以查看是否有任何拍卖结束。

有比上面列出的 2 个更好的方法吗?

4

1 回答 1

2

您可以使用run_at并单独排队每个项目,以便在将其添加到数据库时在其结束时间唤醒。那么你只需要一名工人,直到某事结束,他才会有任何工作要做。(或者,更准确地说,您需要 N 个工作人员,其中 N 是您期望或想要处理的同时关闭的数量。)

auction.delay(:run_at => auction.ending_at).post_end_work

如果您在将拍卖添加到数据库时无法排队(例如,如果它是由无权访问您的东西添加的DelayedJob),那么您将需要使用单个工作人员ending_at在最后一次扫描数据库中的值X 时间量,其中 X 是工作人员的运行频率。(以及 . 上的索引ending_at。)

我强烈建议不要为每次拍卖使用单独的工作人员。

于 2012-08-07T23:31:12.840 回答