【问题标题】:Sidekiq Active Job database rollback on errorSidekiq Active Job 数据库回滚错误
【发布时间】:2018-08-29 22:53:27
【问题描述】:

我注意到,当 Sidekiq / 活动作业由于抛出错误而失败时,作业期间发生的任何数据库更改都会回滚。这似乎是一个有意使工作具有幂等性的功能。

我的问题是作业运行的方法可以向用户发送电子邮件,并且它使用数据库修改来防止重新发送电子邮件。如果数据库更改回滚,则每当重试作业时都会重新发送电子邮件。

我的工作大致如下:

class ProcessPaymentsJob < ApplicationJob
  queue_as :default

  def perform(*args)
    begin
      # This can send emails to users.
      PaymentProcessor.perform
    rescue StandardError => error
      puts 'PaymentsJob failed, ignoring'
      puts error
    end
  end
end

作业计划使用sidekiq-scheduler 定期运行。我正在使用 rails-api v5。

我添加了一个rescue 来尝试防止作业回滚数据库更改,但它仍然会发生。

我突然想到,也许这根本不是 Sidekiq 问题,而是 Rails 的一个特性。

防止向用户发送垃圾邮件的最佳解决方案是什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-5 sidekiq rails-api


    【解决方案1】:

    听起来你的后台工作做得太多了。如果发送电子邮件与工作是否成功无关,您应该将工作分成两个工作:一个发送电子邮件,另一个做其他处理工作。

    或者,您可以使用 Sidekiq Batches 并使上述第一个作业依赖于第二个作业的成功执行。

    Sidekiqing 快乐!

    【讨论】:

      【解决方案2】:

      您可以将数据库更改包装在 PaymentProcessor 内的事务中,挽救数据库回滚,并且仅在事务成功时发送电子邮件。有点像这样:

      # ../payment_processor.rb
      
      def perform
        ActiveRecord::Base.transaction do
          # AllTheThings.save!
        end
      rescue ActiveRecord::RecordInvalid => exception
        # if things fail to save, handle the exception however you like
      else
        # if no exception is raised, send your email
      end
      

      【讨论】:

        猜你喜欢
        • 2017-04-03
        • 2019-01-24
        • 2016-09-30
        • 2020-02-02
        • 1970-01-01
        • 2015-07-07
        • 2017-04-02
        • 1970-01-01
        • 2010-10-09
        相关资源
        最近更新 更多