我目前在Sidekiq的帮助下使用Sidekiq--独一无二的--乔布斯和Sidekiq-状态来执行我的应用程序上的任务。
工人所做的工作很小,而且几乎总是立即执行。(很少或根本没有排队)
我正在“黑客”侧奇克来同步执行任务(检查控制器找不到由工作人员创建的对象),这些任务很小,执行速度也很快(通常不到1秒)。我的应用程序需要同步运行作业并获取其详细信息(创建/更新记录)。
我用的是“蹩脚”的解决方案:
20.times do
status = Sidekiq::Status::get balance, :exp_status
if ["done"].include?(status)
break
end
sleep(0.2)
end创建一个队列,并通过params确保同一个用户同时执行的作业不超过一个--我可以避免所有死锁,但是我觉得这应该是一个更好的执行方法,而不是黑客,因为它是用来异步执行作业的。
的问题是:在限制输入的方式上,有没有任何替代或类似的创业板可以限制输入,但在默认情况下是要同步运行的?我不能仅仅询问控制器Balance.find_or_create_by(user: user, market: market),因为它迟早会给我带来死锁(同时编辑/manipulated /创建记录),但我觉得从长远来看,我使用的侧翼解决方案也是不可能的。我是不是错过了一些基本的东西??如何确保通过中间件或类似的重复params/操作不同时执行以避免死锁?
发布于 2015-10-15 01:37:17
我用朱迪斯-穆特解决了我的问题。
有了这一点,我就有了一个本机同步解决方案,它仍然可以锁定我正在处理的行,如果行被锁定,也没有问题,因为我只是简单地重试。当记录解锁时,它会返回并重新尝试这项工作。
def enter
RedisMutex.with_lock(user) do
# hard-work
end
rescue RedisMutex::LockError
retry
end发布于 2015-10-13 18:00:57
https://stackoverflow.com/questions/33108855
复制相似问题