RabbitMQ中的消息路由模式有哪几种,它们有什么区别?

RabbitMQ中的消息消费模式有3种:

  1. Consumer工作队列:多个消费者共同消费同一个Queue中的消息。
  2. 发布/订阅:交换器将消息路由到多个绑定的Queue上。
  3. 路由:交换器根据消息的路由键将消息路由到指定的Queue上。

Java代码示例如下:

Consumer工作队列:

// 1. 声明Queue
channel.queueDeclare("test_queue", false, false, false, null);

// 2. 创建消费者
channel.basicConsume("test_queue", true, "consumer1", new DefaultConsumer(channel) {
    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
        // 3. 消息处理
    }
}); 

发布/订阅:

// 1. 声明交换机和Queue,并绑定
channel.exchangeDeclare("logs", "fanout");
channel.queueDeclare("queue1", false, false, false, null);    
channel.queueBind("queue1", "logs", ""); 

// 2. 发布消息到交换机
channel.basicPublish("logs", "", null, "Hello".getBytes());

// 3. 创建消费者消费绑定的Queue 
channel.basicConsume("queue1", true, new DefaultConsumer(channel) {
    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
        // 消息处理
    }
});

路由:

// 1. 声明交换机和Queue,并绑定 
channel.exchangeDeclare("direct_logs", "direct");
channel.queueDeclare("error_logs", false, false, false, null);
channel.queueBind("error_logs", "direct_logs", "error");

// 2. 发布消息到交换机
channel.basicPublish("direct_logs", "error", null, "Hello".getBytes()); 

// 3. 创建消费者消费绑定的Queue
channel.basicConsume("error_logs", true, new DefaultConsumer(channel) {
    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
        // 消息处理
    } 
});

所以,RabbitMQ消息消费模式的主要区别在于:

  • Consumer工作队列:多个消费者消费同一个Queue中的消息。
  • 发布/订阅:将消息路由到多个绑定的Queue上。
  • 路由:根据路由键 precisely 将消息路由到指定的Queue上。