beanstalkd:工人如何可以按特定顺序 watch/prioritize tubes/queues?

beanstalkd: How workers can watch/prioritize tubes/queues in certain order?

我能找到的最接近的是这个问题和答案,但它没有解决我的问题:Do priorities work across queues/tubes in Beanstalkd?

我在想,如果我可以告诉我的员工按特定顺序观看电视或优先看电视,这可能会解决我的问题,但也许其他人有更好的解决方案。

我需要或想做的是为用户 1-5 提供试管。 示例管名为:user1、user2、user3、user4、user5

我有 5 个工作进程来处理每个管子的作业。

挑战在于,如果只有 1 个用户提交了作业,我希望其他 4 个进程帮忙并更快地完成作业。

但是,如果所有 5 个用户都有工作,我想优先处理每个用户的工作,并逐步完成。

我不希望用户 1 占用所有处理能力,尤其是在他的管子中有 1000 个作业的情况下,而用户 2、用户 3、用户 4 和用户 5 只有 5-10 个作业可以非常完成很快。

如果我告诉所有工作人员观看所有管子(用户 1-5),FIFO 规则将启动,因此首先提交 10000 个作业的用户将获得优先权,而仅提交少量作业的用户将等待大作业要完成。

我还想要的是,当进程没有感知到任何等待其 main/prioritized 管(例如 user3)的作业时,user3 将默认返回帮助任何其他仍有待处理作业的 userX 管.

我还不确定解决这个问题的最佳方法,但我在这里的部分解决方案也是试图首先解释这个问题。

用户提交的职位可能有 1000 个可操作 items/jobs。所以我想在每个用户管中分解这 1000 个提交批次或 10 个或 100 个作业。也不确定这是否有帮助。

另一种可能的解决方案是动态地告诉工作人员使用 "watch" 或 "ignore" 管,但这会增加另一个级别的复杂性,我不确定是否有必要,也希望没有必要。

任何有关如何解决此问题的建议都将不胜感激。

  1. 如果您可以控制提交方法,您应该通过在这些增量之后设置较低的优先级来提交 10 或 100 个批次。这是最简单的方法,可以快速解决您的问题。

  2. 根据一些输入为你的管子提供一个编排器 watch/ignore 也是可行的,一旦构建完成,你就可以在构建时考虑到可插拔性,并且可以重复使用不同的 algorithms/logic。例如,可以选择使用免费计划的用户,而不是使用付费计划的用户。这并不像你想象的那么复杂。您只需要构建一个脚本,该脚本基于一组输入参数通过从您的管中添加或减去工作人员来决定流程。它可以在很多情况下派上用场。如果您经常使用消息队列,这就是您要走的路,值得花时间。

  3. 另一个需要探索的是让您的员工准备好交叉观看多个管道。比如worker1-instance1应该看管user1,user2,user3,那么同一个worker1-instance2应该看user2,user3,user4,worker1-instance3 user3,user4,user5等等。这也可以在我提到的协调器中动态构建。

  4. 将任务分解为多个较小的任务。不确定您当前的作业需要多长时间,但处理 1000 条消息应该不会对其他用户造成性能影响。确保任务不超过 50 毫秒。有了这个,当第二个用户提交一些作业时,第一个用户的很多作业已经处理完毕,你不会看到你受到 FIFO 规则的限制。我们通常在我们的项目中将 1 个任务分解为 10 个不同的跃点 tubes/tasks。我们看到这提高了整体吞吐量并且不影响整个往返。