我在sql db中有一个列表拍卖项目在特定时间结束(到期)我正在寻找使用(Delayed :: Job.enqueue)在给定拍卖时触发方法的正确方法饰面。
1)在拍卖开始时加入内存的每次拍卖都使用工人
2)使用Web应用程序启动时加载的一个工作程序,定期查询数据库以查看是否有任何拍卖结束。
有没有比上面列出的2更好的方法?
答案 0 :(得分:2)
您可以使用run_at
并将每个项目分别排队,以便在它们添加到数据库时的结束时间唤醒。然后你只需要一个工人,在工作结束之前不会做任何工作。 (或者,更准确地说,你会想要N个工人,其中N是你期望或想要处理的同时关闭的数量。)
auction.delay(:run_at => auction.ending_at).post_end_work
如果您将拍卖添加到数据库时无法将拍卖排队(例如,如果它是通过无法访问您的DelayedJob
的内容添加的话)那么您将需要使用单个工作人员在最后X个时间内扫描数据库中的ending_at
值,其中X是工作人员的运行频率。 (以及ending_at
上的索引。)
我强烈建议不要为每次拍卖使用单独的工作人员。