0

我有一个工作队列,有多个工人在看这个队列。(每个作业对应一个用户)。在任何给定时间,队列中的每个用户都可能有多个作业。

我不希望我的员工在任何给定时间为每个用户处理超过 1 个工作。仅当当时没有其他工作人员处理该用户时,该工作人员才应选择该用户的工作。如果用户的工作正在由工作人员处理,我还希望下一个用户工作在完成后立即被选中。

我想让我的工人用户不可知(即,任何工人都应该能够处理任何用户的工作)。这将帮助我水平扩展。

我应该怎么做?我想为每个用户创建单独的队列,但工作人员将不得不观看大量队列并可能浪费资源。我现在使用 beanstalkd 作为队列服务器。

任何帮助表示赞赏。

4

1 回答 1

0

首先,让我说,限制每个用户只处理一个作业可能会导致其他用户处理作业的极端延迟。考虑一个场景,当您的队列包含大量连续的 user1 作业,然后是大量连续的 user2 作业,依此类推。由于您提出的架构,您必须先排空您的 user1 作业队列,然后才开始处理 user2 作业,让 user3 等待很长时间......

您可以通过引入多个队列(仍然不是每个用户一个)并以循环方式对您的工作进行排队来缓解这种情况,但正如您所看到的,这仍然不是 100% 可靠的。

但是,如果您真的想用一个(或几个)队列来保证这一要求,我实际上建议使用某种共享锁定机制(例如memcached)在处理该用户的作业时维护每个用户的锁。 本文描述了如何做到这一点,并且有一些宝石可以做到这一点。然后您可以使用以下算法:

job = @beanstalkd.reserve
user_id = job.body["user_id"]
if (get_lock_for(user_id)
  # process job
  # ....
  job.delete
end
于 2013-04-11T02:43:23.980 回答