【问题标题】:RabbitMQ: a worker listen to many queue but get 1 message at a timeRabbitMQ:一个工作人员听很多队列但一次收到一条消息
【发布时间】:2018-03-11 02:51:33
【问题描述】:

有没有一种方法可以让我设置一个监听多个队列但一次只处理来自单个队列的单个消息的工作人员?

用例: 1. 任务A 2. 任务 B 3.任务C

我想要 10 个工人。 #1 - #3 可以处理Task A,#1 - #6 可以处理Task B,它们都可以处理Task C。

我曾经让我的所有工作人员监听所有队列,但是当一些任务无法被太多工作人员处理时(例如,向另一个服务发出太多并发请求),它们会导致问题。

让工作人员在队列为空而其他队列已满时监听单个队列会浪费其资源。

【问题讨论】:

  • 为什么不合并队列?任务 A 一个队列,B 一个队列,C 一个队列,并正确路由消息?
  • but will process only a single message from a single queue at a time 这是否意味着 (a) 或 (b),(a) #1 worker 可以处理 TaskA、TaskB 和 TaskC,但一次只能运行一个 Task。 (b) #1 worker 可以处理 TaskA、TaskB 和 TaskC,如果所有 3 个任务同时运行则被接受。
  • @ChetanGhodasara 我的意思是,如果队列 A、队列 B、队列 C 在每个队列中都有一些消息。工作人员一次只会处理来自这些队列之一的消息。因此它可能会处理任务 A、任务 B 或任务 C。但一次只能处理其中一个。

标签: rabbitmq


【解决方案1】:

根据要求,工作人员可以一次处理任何一项任务,我建议为所有 3 种类型的消息创建一个队列,并将所有 10 个工作人员作为这个公共队列的接收者。 您可以使用自定义标头AMQP.BasicProperties --> Map<String,Object> headers 来区分消息。

例如,

发送者和队列:

(1) 如果您可以控制 Sender 和 Queues:

制作单个队列而不是 3 个不同的队列,如下所示。 发件人将在发布之前为每条消息添加自定义标头。 headers.put("type","Task#")

(2) 如果您无法控制 Sender 和 Queues:

您可以使用Processor 将headers.put("type","Task#") 添加到每条消息中,并将其发送至common queue。如下图。

工人:

每个工作人员都可以检查接收到的消息的类型并做出相应的行为。 Worker 4,5,6 只能处理 TaskB 和 TaskC。一次将处理任何人的消息。 (如下sn-p中提到的——仅供参考)

//Worker 4,5,6  (sample steps)
public void handler(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) {
    if(properties.getHeaders().get("type").equals("TaskA")) {
        // Negative acknowledgement - the message will be requeue.
    }
    else if(properties.getHeaders().get("type").equals("TaskB")) {
        // Convert body into TaskB (if required)
        // Process Task B
        // Positive acknowledgement
    }
    else if(properties.getHeaders().get("type").equals("TaskC")) {
        // Convert body into TaskC (if required)
        // Process Task C
        // Positive acknowledgement
    }
}

【讨论】:

  • 我也想过这种类似的方法,但是如果工作A的worker没有启动,会不会导致死循环?
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 2023-03-16
  • 2014-06-05
  • 2019-11-24
  • 1970-01-01
  • 2015-12-28
  • 2015-12-10
  • 2014-12-30
相关资源
最近更新 更多