【问题标题】:Can Sidekiq be performed for more than 1 task?Sidekiq 可以执行一项以上的任务吗?
【发布时间】:2015-07-14 14:43:17
【问题描述】:

我们已经使用 sidekiq 将记录异步插入到我们的表中,并且我们经常检查生产 sidekiq 仪表板以监控否。已处理、排队、重试、忙于插入记录。

我们有一个新的要求,即异步删除记录(比如用户表:删除过期用户)。我们还需要监控 sidekiq 仪表板中的进程、排队、重试。

对于插入记录,我们使用:

在我的用户控制器中:

def create_user
   CreateUserWorker.perform_async(@client_info, @input_params)
end

在我的 lib/workers/createuser_worker.rb 中

class CreateUserWorker
  include Sidekiq::Worker

  def perform(client_info, input_params)
    begin
      @client_info = client_info
      @user = User.new(@client_info)
      @user.create(input_params)
    rescue
      raise
    end
  end
end

如果我对使用 sidekiq 异步删除用户执行相同操作,我如何区分插入的进程和已删除的进程而不会造成任何混乱?

【问题讨论】:

    标签: ruby-on-rails sinatra sidekiq


    【解决方案1】:

    首先,如果你想检查 begin-rescue 块中创建的错误,你应该使用 create!方法。不创建方法。

    创建方法不会引发错误。

    查看here

    销毁方法与创建方法相同。
    使用破坏方法! (destroy!)

    当然,您应该为销毁用户添加新的工作人员。
    因为 perform 方法应该只存在 1.
    如果您不想添加新的工人,请尝试下面的模式!

    UserWorker
      def perform(~, flag)
        #flag meaning is create or destroy
        is_success = false # result of creating or destroying
        # create or destroy
        # ..
        # ..
    
        LogModel.create({}) # user info with is_success and flag
      end
    ebd
    

    附言
    我认为 create() next new() 有点尴尬(?)。
    我推荐

    @user = User.create(client_info)
    

    @user = User.new(client_info)
    @user.save! (bang meaning is same to above)
    

    并且不需要开始救援块。只需使用带有 bang 的 Create, Destroy 方法。

    def perform(client_info, input_params)
      User.create!(client_info) # if failed raise Error 
    end
    

    ++为 cmets 添加

    我认为如果您删除或销毁了许多用户,请将 user_ids(或 user_infos)数组 传递给 Worker perform 方法并在 perform 方法中,循环创建或销毁(如果创建或销毁失败的记录) ,创建有关失败记录的日志文件或日志模型条目)。

    如果必须一次创建或销毁所有 user_id,请使用事务块。

    def perform(params)
      begin
        ActiveRecord::Base.transaction do 
          # loop create or destroy
        end
      rescue 
      end
    end 
    

    如果没有,就循环

    def perform(params)
      #loop
      if Create or destroy method (without bang)
        #success
      else
        #failed
      end  
    end 
    

    XWorker.perform_async() 方法可能是从管理页面调用的(?)。

    【讨论】:

    • 感谢您的建议,很高兴我学到了一些东西。我会遵循代码原则。 :) 我必须删除大约 10 万条记录才能从表中删除,并且我需要执行异步(sidekiq)。我需要遍历要删除的记录。在这种情况下,我需要在哪里调用“执行”方法?
    • @joe 查看添加的答案!
    猜你喜欢
    • 2021-08-31
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多