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

How to run batch job simultaneously with record updates?

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

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

问题是,就在此时,客户可能会支付他们的发票,而滞纳金将添加到已付发票中。

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

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

执行此操作有哪些不同的策略?

我想你已经概述了矛盾。您想以高效的方式做一些与查询相关的事情,并且您的队列是数据库支持的。

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

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

为此使用 sidekiq,每个 sidekiq 进程默认有 25 个 worker,这极大地提高了性能。您可以对此进行微调,并根据需要增加 sidekiq 进程的数量。 Scaling sidekiq 真的是一种享受!请注意,数据库连接可能会成为瓶颈。