最好的工作人员而不是循环法

问题描述 投票:1回答:2

我已经使用rabbitmqqos实现了基于ack示例2的工作队列。即使是工作重点,一切都很好。

但是,工作本身非常依赖于数据的本地化。例如,我有这些服务器:

  1. worker1与存储
  2. worker2与存储
  3. worker3没有存储空间
  4. worker3没有存储空间

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

{ 
   job_id: 1,
   data: "worker2/pool5/dataset7"
}

如果可用,我需要将此消息发送到worker2,否则应将其发送给下一个可用的工作人员。所以基本上我需要一些可以尊重数据局部性的路由器配置。

我该怎么用?

rabbitmq
2个回答
0
投票

从特定队列中消耗所有从队列中消耗的工作人员都是相同的 - 相同的代码,相同的硬件等等,有一种基本假设。当违反此假设时,您将在系统中引入一些可控的可变性,并且变异性通常转化为不稳定和不良结果。

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

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

除此之外,还有一些模糊的概念“如果工人不可用” - 我不确定这意味着什么。 RabbitMQ中存在许多“可用性”概念,虽然代理可以处理其中的许多概念,但通常认为发布者需要准确了解每条消息的消费时间和方式,这是一种糟糕的设计实践。如果你能在那里提供一些说明,我可以更新我的答案。


0
投票

谢谢你的回答。

通过“工作人员不可用”,我的意思是“此服务器上的所有工作人员都忙着处理工作”。

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

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

我会试着解释一下。

我们有一堆服务器,每个服务器都包含大量数据。一个作业要处理的数据量很大,从每个作业100Gb到几个Tb,因此即使在10Gb网络上流也不是很快。

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

因此,我们正在考虑优先考虑可以处理数据而无需流式处理的工作人员。

© www.soinside.com 2019 - 2024. All rights reserved.