Sidekiq可以执行超过1个任务吗?

时间:2015-07-13 10:19:00

标签: ruby-on-rails sinatra sidekiq

我们已经使用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异步删除用户,我怎样才能区分插入的进程和已删除的进程而没有任何混乱?

1 个答案:

答案 0 :(得分:0)

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

创建方法不会引发错误。

检查here

Destroy方法与Create方法相同 使用破坏方法! (destroy!

当然,您应该为销毁用户添加新工作人员 因为执行方法应该只存在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

P.S
我认为create()next new()有些尴尬(?)。
我推荐

@user = User.create(client_info)

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

并且不需要开始救援块。只需使用创建,破坏方法与爆炸。

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

++已添加评论

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

如果必须一次创建或销毁所有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()方法。