【问题标题】:How to run batch job simultaneously with record updates?如何在记录更新的同时运行批处理作业?
【发布时间】:2017-02-23 18:11:07
【问题描述】:

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

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

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

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

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

这样做有哪些不同的策略?

【问题讨论】:

  • create_late_fee_for(invoice) unless invoice.paid?
  • 或者...让另一个进程在之后立即运行并查找在invoice.paid_at 日期之后创建的滞纳金...如果发生这种情况,则删除滞纳金。
  • 我们可以再看一点代码吗?

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


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2014-09-28
    • 2023-01-25
    • 2020-10-29
    • 1970-01-01
    相关资源
    最近更新 更多