beanstalkd:工人如何按一定顺序观察/排列管/队列的优先次序?

时间:2015-04-26 18:25:28

标签: beanstalkd

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

我想我是否可以告诉我的工作人员按照一定的顺序观看电子管或者优先考虑它可以解决我的问题,但也许其他人有更好的解决方案。

我需要或想要做的是为用户提供电子管1-5。 示例管称为:user1,user2,user3,user4,user5

我有5个工作流程来处理每个管道的工作。

挑战在于,如果只有1位用户提交了作业,我希望其他4个流程能够帮助您更快地完成工作。

但如果所有5个用户都在他们的管中有工作,我想优先考虑每个用户的工作正在处理并完成进度。

我不想要的是user1占用所有处理能力,特别是在他的管有1000个工作的情况下,其中user2,user3,user4& user5只有5-10个工作可以很快完成。

如果我告诉所有工作人员观察所有管(用户1-5),则FIFO规则启动,因此首先提交10000个工作的用户都获得优先权,而稍后提交了几个工作的用户都等待大工作完成。

我还想要的是,当进程无法感知等待其主要/优先级管(例如user3)的任何作业时,user3将默认返回帮助仍有待处理作业的任何其他userX管。

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

用户提交的作业可能有1000个可操作的项目/作业。因此,我打算在每个用户管中分解这些1000个工作提交批次或10或100个。不确定这会有所帮助。

另一个可能的解决方案是动态告诉工人注意"或"忽略"管,但这增加了另一层次的复杂性,我不确定会不会或希望没有必要。

如何解决这个问题的任何建议都将非常感激。

1 个答案:

答案 0 :(得分:0)

  1. 如果您控制提交方法,则应通过在这些增量之后设置较低优先级来提交10或100的批次。这是最容易做到的,并迅速解决您的问题。

  2. 根据某些输入让管道的管弦乐器观察/忽略也是可行的,一旦构建完成,您可以构建可插拔的,并可以重复使用不同的算法/逻辑。例如,使用免费计划的用户可以比付费计划的用户更晚。这并不像你想象的那么复杂。您只需要构建一个基于一组输入参数的脚本,通过在管中添加或减去工作人员来决定流程。它可以在很多情况下派上用场。如果您将使用消息队列进行大量工作,这是可行的方法,值得花时间。

  3. 另一个值得探索的就是让你的工人准备好观察多个管子。像worker1-instance1应该看管user1,user2,user3,那么同一个worker1-instance2应该监视user2,user3,user4,worker1-instance3 user3,user4,user5等等。这也可以在我提到的协调器中动态构建。

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