我已经使用rabbitmq
和qos
实现了基于ack
示例2的工作队列。即使是工作重点,一切都很好。
但是,工作本身非常依赖于数据的本地化。例如,我有这些服务器:
例如,作业指的是存储在具有存储的工作人员上的数据
{
job_id: 1,
data: "worker2/pool5/dataset7"
}
如果可用,我需要将此消息发送到worker2
,否则应将其发送给下一个可用的工作人员。所以基本上我需要一些可以尊重数据局部性的路由器配置。
我该怎么用?
从特定队列中消耗所有从队列中消耗的工作人员都是相同的 - 相同的代码,相同的硬件等等,有一种基本假设。当违反此假设时,您将在系统中引入一些可控的可变性,并且变异性通常转化为不稳定和不良结果。
因此,我认为,出于您的目的,您有两种可能的解决方案:
除此之外,还有一些模糊的概念“如果工人不可用” - 我不确定这意味着什么。 RabbitMQ中存在许多“可用性”概念,虽然代理可以处理其中的许多概念,但通常认为发布者需要准确了解每条消息的消费时间和方式,这是一种糟糕的设计实践。如果你能在那里提供一些说明,我可以更新我的答案。
谢谢你的回答。
通过“工作人员不可用”,我的意思是“此服务器上的所有工作人员都忙着处理工作”。
为每个不相同的使用者创建不同的队列,并更新您的路由逻辑以确保只有适当的消息在每个队列中结束。
生产者不知道的唯一问题是工人是否可用(能够处理工作)。
我会试着解释一下。
我们有一堆服务器,每个服务器都包含大量数据。一个作业要处理的数据量很大,从每个作业100Gb到几个Tb,因此即使在10Gb网络上流也不是很快。
现在我们所有的工人都是平等的,并且使用qos和ack,使用网络共享从一个队列中消耗作业。
因此,我们正在考虑优先考虑可以处理数据而无需流式处理的工作人员。