最好的工人,而不是轮循

时间:2018-08-29 11:54:29

标签: rabbitmq

我已经基于rabbitmqqos的{​​{1}}示例2实现了工作队列。即使工作优先,一切都很好。

但是作业本身非常依赖于数据局部性。例如,我有以下服务器:

  1. 具有存储空间的worker1
  2. 带存储的worker2
  3. 没有存储空间的worker3
  4. 没有存储空间的worker3

例如,作业是指存储在具有存储设备的工作人员上的数据

ack

我需要将此消息分发给{ job_id: 1, data: "worker2/pool5/dataset7" } (如果可用),否则应将其分发给下一个可用的工作程序。 因此,基本上,我需要一些路由器配置,该配置可以考虑数据局部性。

我应该使用什么?

2 个答案:

答案 0 :(得分:0)

从特定队列使用时,存在一个基本假设,即从该队列使用的所有工作程序都是相同的-相同的代码,相同的硬件等。如果违反此假设,您将在您的过程中引入一些可控制的可变性系统,而可变性通常会导致不稳定和结果不佳。

因此,我认为出于您的目的,您有两种可能的解决方法:

  1. 更改使用者,使其相同,包括对任何特定存储的相同访问,或者
  2. 为每个不同的使用者创建一个不同的队列,并更新您的路由逻辑,以确保只有适当的消息才能出现在每个队列中。

除此以外,还有一些模糊的概念,即“如果工人不可用” –我不确定这意味着什么。 RabbitMQ中有很多“可用性”的概念,尽管代理可以处理其中的许多问题,但是对于发布者来说,需要确切地知道何时以及如何使用每条消息,通常被认为是不良的设计实践。如果您可以在此处提供一些说明,我可以更新我的答案。

答案 1 :(得分:0)

谢谢您的回答。

“工人不可用”是指“此服务器上的所有工人都在忙于处理作业”。

  

为每个不同的使用者创建一个不同的队列,并更新您的路由逻辑,以确保只有适当的消息才能出现在每个队列中。

生产者唯一不知道的问题是有工人可用(能够处理作业)。

我会解释。

我们有一堆服务器,每个服务器包含大量数据。 一项任务要处理的数据量很大,从每项任务100Gb到数Tb,因此即使通过10Gb网络流式传输它们也不是很快。

现在,我们所有的工人都是平等的,并且使用qos和ack通过网络共享从一个队列中消耗工作。

因此,我们正在考虑对可以处理数据而不进行数据流处理的工作人员进行优先级排序。