如何在记录更新的同时运行批处理作业?

时间:2017-02-23 02:34:40

标签: ruby-on-rails ruby asynchronous sidekiq delayed-job

我有一个Rails应用程序,我必须在到期的发票中添加数百万的滞纳金。

目前,我有一个Que支持的作业,每天运行一次,并使用.find_in_batches(batch_size: 100)选择批量发票。我标记了其他常见的作业库,因为我确信同样的问题仍然存在。但请注意,Que是由数据库支持的,不受Redis支持。

问题是,在这个时刻,客户可能会支付他们的发票,延迟的费用将被添加到付费发票中。

我不确定如何以高效的方式协调这种差异 (或任何方式,说实话)。

我将为数百万行执行此操作,因此该方法必须快速。

这样做有什么不同的策略?

1 个答案:

答案 0 :(得分:0)

我认为你已经概述了矛盾。您希望以高效的方式执行与que相关的操作,并且您的队列是数据库支持的。

我做过类似的事情,并且使用Sidekiq有很棒的经验。我会让第一份工作做.find_in_batches(...)并使用它来安排每个逾期发票作为一项单独的工作。

当作业运行时,需要在添加费用之前重新检查发票是否已付款。

使用sidekiq,默认情况下每个sidekiq进程有25个工作程序,这大大提高了性能。您可以根据需要对此进行微调并扩展sidekiq进程的数量。 缩放sidekiq真是一种乐趣!请注意,数据库连接可能会成为一个阻塞点。