【发布时间】:2015-05-27 14:10:12
【问题描述】:
我需要确保 25 名工作人员中的任何一人同时处理每个 user_id 的工作不超过一项,以避免死锁。
我已经尝试过 sidekiq 独特的作业,但死锁不断发生,因为它一直在尝试处理队列中所有待处理的作业,而不是在参数上查找 user_id。
谢谢
类我的工作
包括 Sidekiq::Worker
sidekiq_options:队列=> “关键的”,独特的:真实的, unique_args: ->(args) { [ args.user_id ] }定义执行(工作参数)
【问题讨论】:
-
这是一个不太好的主意:您可以维护一个包含正在处理的用户 ID 的表。每次要开始处理的时候,看看表和当前的用户id;仅当用户 ID 不在表中时才开始处理。如果它在表中,则将作业推回队列。
-
最终这可能是一个不错的主意:)
-
你应该尝试使用redis提供的内存存储来做到这一点,而不是activerecord。
-
如果我可以节省资源并更快地提供数据,我将调查并可能尝试使用 redis 内存存储,从未听说过 @Vineeth。
标签: ruby-on-rails-4 redis capistrano resque sidekiq