我有一个Rails应用程序,我必须在到期的发票中添加数百万的滞纳金。
目前,我有一个Que支持的作业,每天运行一次,并使用.find_in_batches(batch_size: 100)
选择批量发票。我标记了其他常见的作业库,因为我确信同样的问题仍然存在。但请注意,Que是由数据库支持的,不受Redis支持。
问题是,在这个时刻,客户可能会支付他们的发票,延迟的费用将被添加到付费发票中。
我不确定如何以高效的方式协调这种差异 (或任何方式,说实话)。
我将为数百万行执行此操作,因此该方法必须快速。
这样做有什么不同的策略?
答案 0 :(得分:0)
我认为你已经概述了矛盾。您希望以高效的方式执行与que相关的操作,并且您的队列是数据库支持的。
我做过类似的事情,并且使用Sidekiq有很棒的经验。我会让第一份工作做.find_in_batches(...)
并使用它来安排每个逾期发票作为一项单独的工作。
当作业运行时,需要在添加费用之前重新检查发票是否已付款。
使用sidekiq,默认情况下每个sidekiq进程有25个工作程序,这大大提高了性能。您可以根据需要对此进行微调并扩展sidekiq进程的数量。 缩放sidekiq真是一种乐趣!请注意,数据库连接可能会成为一个阻塞点。