如何 运行 批处理作业与记录更新同时进行?
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 真的是一种享受!请注意,数据库连接可能会成为瓶颈。
我有一个 Rails 应用程序,我必须在到期的发票中添加数百万的滞纳金。
目前我有一个 Que 支持的作业,它每天运行一次并使用 .find_in_batches(batch_size: 100)
选择一批发票。我标记了其他常见的作业库,因为我确信同样的问题会继续存在。但是请注意,Que 是数据库支持的,而不是 Redis 支持的。
问题是,就在此时,客户可能会支付他们的发票,而滞纳金将添加到已付发票中。
我不确定如何以高效的方式调和这种差异(或者老实说,以任何方式)。
我将对数百万行执行此操作,因此该方法必须很快。
执行此操作有哪些不同的策略?
我想你已经概述了矛盾。您想以高效的方式做一些与查询相关的事情,并且您的队列是数据库支持的。
我做过类似的事情,并且在使用 Sidekiq 方面有很好的经验。我会让第一份工作做 .find_in_batches(...)
并用它来安排每个逾期发票作为一个单独的工作。
作业运行时,需要在添加费用之前重新检查发票是否已支付。
为此使用 sidekiq,每个 sidekiq 进程默认有 25 个 worker,这极大地提高了性能。您可以对此进行微调,并根据需要增加 sidekiq 进程的数量。 Scaling sidekiq 真的是一种享受!请注意,数据库连接可能会成为瓶颈。