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