【问题标题】:Designing a job queuing system where only one job per user can be processed by workers any given time设计一个作业排队系统,其中每个用户在任何给定时间只能由工人处理一个作业
【发布时间】:2013-04-02 16:14:15
【问题描述】:

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

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

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

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

感谢任何帮助。

【问题讨论】:

    标签: architecture worker beanstalkd job-queue


    【解决方案1】:

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

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

    然而,如果你真的想用一个(或几个)队列来保证这个要求,我实际上建议使用某种共享锁定机制(例如memcached)来维护每个用户的锁,同时为该用户工作正在处理中。 This article 描述了如何,并且有 gems 可以做到这一点。 然后你可以使用以下算法:

    job = @beanstalkd.reserve
    user_id = job.body["user_id"]
    if (get_lock_for(user_id)
      # process job
      # ....
      job.delete
    end
    

    【讨论】:

      猜你喜欢
      • 2020-05-19
      • 2011-03-31
      • 2017-04-16
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 1970-01-01
      • 2016-09-22
      • 2017-02-16
      相关资源
      最近更新 更多