总结Rabbitmq的六种模式

本文详细介绍了RabbitMQ的六种工作模式,包括简单模式、工作队列模式、发布/订阅模式、路由模式、主题模式以及RPC模式。文章还涵盖了相关概念如AMQP、连接、信道等,并提供了SpringBoot整合RabbitMQ的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RabbitMQ六种工作模式

RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。

RabbitMQ有六种模式

  • 简单模式
  • work模式
  • Publish/Subscribe发布与订阅模式
  • Routing路由模式
  • Topics主题模式
  • RPC远程调用模式(远程调用,不太算MQ;暂不作介绍)

 

相关概念介绍

AMQP 一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。

RabbitMQ是AMQP协议的Erlang的实现。

概念说明
连接Connection一个网络连接,比如TCP/IP套接字连接。
信道Channel多路复用连接中的一条独立的双向数据流通道。为会话提供物理传输介质。
客户端ClientAMQP连接或者会话的发起者。AMQP是非对称的,客户端生产和消费消息,服务器存储和路由这些消息。
服务节点Broker消息中间件的服务节点;一般情况下可以将一个RabbitMQ Broker看作一台RabbitMQ 服务器。
端点AMQP对话的任意一方。一个AMQP连接包括两个端点(一个是客户端,一个是服务器)。
消费者Consumer一个从消息队列里请求消息的客户端程序。
生产者Producer一个向交换机发布消息的客户端应用程序。

准备工作

导入相关依赖

  <dependency>
    <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-amqp</artifactId>
  </dependency>

在你的application中添加以下代码(根据自己的实际情况修改)

spring:
  rabbitmq:
    host: 192.168.67.129
    port: 5672
    username: admin
    password: 123

创建配置类

  @Bean
    public Jackson2JsonMessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }

    @Bean
    public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){
        RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
        rabbitTemplate.setConnectionFactory(connectionFactory);
        rabbitTemplate.setMessageConverter(messageConverter());
        return rabbitTemplate;
    }

创建枚举类RabblimqConstants 创建常量

public interface RabblimqConstants {

    String SIMPLE_QUEUE = "hello_queue_new";//点对点常量

    String WORK_QUEUE = "my_work_queue"; //工作模式

    //路由模式
    String PUBLISHER_A = "publisher_quque_a";
    String PUBLISHER_B = "publisher_quque_b";
    String PUBLISHER_EXCHANGE = "my.exchange";


    //创建两个队列
    String FANOUT_QUEUE_A = "fanout_queue_a";
    String FANOUT_QUEUE_B = "fanout_queue_b";


    //创建交换机 广播模式
    String FANOUT_EXCHANGE = "my.fanout_exchange";


    //rounting交换机
    String ROUTING_QUEUE_ORANGE = "my_routing_queue_orange";

    String ROUTING_QUEUE_BLACK = "my_routing_queue_black";
    String ROUTING_QUEUE_GRENN = "my_routing_queue_green";

    String ROUTING_EXCHANGE = "my.routing_exchange";

    //定义rounting key
    String ROUNTING_KEY_ORANGE = "orange";
    String ROUNTING_KEY_BLACK = "black";
    String ROUNTING_KEY_GREEN = "green";


    //topic模式

    String TOPIC_QUEUE_RED = "my_topic_queue_red";

    String TOPIC_QUEUE_WHITE = "my_topic_queue_white";

    String TOPIC_EXCHANGE = "my.topic.exchange";

    String TOPIC_KEY_RED = "red.#";

    String TOPIC_KEY_WHITE = "*.white.#";


    String NORMAL_QUEUE = "normal_queue";//正常队列

    String NORMAL_EXCHANGE = "normal_exchange";//正常交换机

    String NORMAL_ROUNTING_KEY = "normal_routingkey"; //正常的key

    String DL_QUEUE = "dl_queue";//死信队列

    String DL_EXCHANGE = "dl_exchange";//死信交换机

    String DL_ROUNTING_KEY = "dl_routingkey"; //死信key

    //插件完成死信队列
    String SDL_QUEUE = "sdl_queue";

    String SDL_EXCHANGE = "sdl_exchange";

    String SDL_ROUNTING_KEY = "sdl_routingkey";

    String SDL_EXCHANGE_TYPE = "x-delayed-message";



}

详细介绍

Hello World简单消息模式

模式说明

在上图的模型中,有以下概念:

  • P:生产者,也就是要发送消息的程序
  • C:消费者:消息的接受者,会一直等待消息到来。
  • queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息。

Work queues工作队列模式

Work Queues与入门程序的简单模式相比,多了一个或一些消费端,多个消费端共同消费同一个队列中的消息。

工作队列模式实际上是一种竞争关系的模式,多个消费者之间是竞争关系,即一条消息如果被某个消费者消费了,那么其他的消费者就获取不到了。

Publish/Subscribe发布与订阅模式

发布订阅模式:

  • 1、每个消费者监听自己的队列。
  • 2、生产者将消息发给broker,由交换机将消息转发到绑定此交换机的每个队列,每个绑定交换机的队列都将接收到消息

Routing路由模式

模式说明
路由模式特点:

队列与交换机的绑定,不能是任意绑定了,而是要指定一个RoutingKey(路由key)
消息的发送方在向 Exchange 发送消息时,也必须指定消息的 RoutingKey。
Exchange 不再把消息交给每一个绑定的队列,而是根据消息的Routing Key进行判断,只有队列的Routingkey与消息的 Routing key 完全一致,才会接收到消息

 

P:生产者,向Exchange发送消息,发送消息时,会指定一个routing key。
X:Exchange(交换机),接收生产者的消息,然后把消息递交给 与routing key完全匹配的队列
C1:消费者,其所在队列指定了需要routing key 为 error 的消息
C2:消费者,其所在队列指定了需要routing key 为 info、error、warning 的消息

Topics主题模式

模式说明
Topic主题模式也叫通配符模式。Topic类型与Direct相比,都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符!

Routingkey 一般都是有一个或多个单词组成,多个单词之间以”.”分割,例如: item.insert

通配符规则:

#:匹配零个或多个词

*:匹配不多不少恰好1个词

举例:

item.#:能够匹配item.insert.abc 或者 item.insert

item.*:只能匹配item.insert

### RabbitMQ六种工作模式及其使用场景 RabbitMQ 是一种功能强大的消息中间件,支持多种工作模式来满足不同的业务需求。以下是其常见的六种工作模式以及各自的适用场景: #### 1. **简单模式 (Simple Mode)** 在这种模式下,生产者将消息发送到队列中,消费者从该队列接收消息并处理。这种模式是最基础的消息传递方式。 - 使用场景:适用于简单的消息传递场景,例如日志记录、任务分发等。 - 特点:只有一个生产者和一个消费者[^2]。 ```java // 生产者代码示例 rabbitTemplate.convertAndSend(queueName, message); ``` --- #### 2. **工作队列模式 (Work Queues / Round-Robin Dispatching Mode)** 此模式允许多个消费者绑定同一个队列,通过轮询的方式分配任务给多个消费者,从而实现负载均衡。 - 使用场景:适合用于任务分发和并发执行的任务调度系统。 - 特点:多个消费者共享同一队列中的消息[^3]。 ```java // 配置队列 @Bean public Queue workQueue() { return new Queue("work_queue", true); } ``` --- #### 3. **发布/订阅模式 (Publish/Subscribe Mode)** 在此模式下,生产者将消息发送到交换机(Exchange),而交换机会将消息广播至所有绑定的队列。每个消费者可以监听自己的队列。 - 使用场景:适用于通知机制或多播消息的应用程序。 - 特点:一个生产者对应多个消费者,消息会被广播到所有的绑定队列[^4]。 ```java // Exchange 和 Queue 绑定 @Configuration public class RabbitMqConfig { @Bean public FanoutExchange fanoutExchange() { return new FanoutExchange("fanout_exchange"); } @Bean public Queue queueA() { return new Queue("queue_a"); } @Bean public Binding binding(Queue queueA, FanoutExchange fanoutExchange) { return BindingBuilder.bind(queueA).to(fanoutExchange); } } ``` --- #### 4. **路由模式 (Routing Mode)** 路由模式允许生产者根据指定的 Routing Key 将消息发送到特定的队列。只有与 Routing Key 匹配的队列才能接收到消息。 - 使用场景:适用于需要精确控制消息流向的具体业务逻辑。 - 特点:基于 Routing Key 进行消息过滤[^3]。 ```java // 定义 Direct Exchange 并绑定队列 @Bean public DirectExchange directExchange() { return new DirectExchange("direct_exchange"); } @Bean public Binding bindingDirect(Queue queueB, DirectExchange directExchange) { return BindingBuilder.bind(queueB).to(directExchange).with("routing_key_b"); } ``` --- #### 5. **主题模式 (Topics Mode)** 主题模式是一种高级形式的路由模式,它支持通配符匹配规则。生产者可以根据 Topic Key 发送消息,消费者则可以通过模糊匹配接收感兴趣的主题消息。 - 使用场景:适用于复杂的消息分类和筛选场景。 - 特点:支持 `*` 和 `#` 两种通配符[^2]。 ```java // 定义 Topic Exchange 并绑定队列 @Bean public TopicExchange topicExchange() { return new TopicExchange("topic_exchange"); } @Bean public Binding bindingTopic(Queue queueC, TopicExchange topicExchange) { return BindingBuilder.bind(queueC).to(topicExchange).with("*.orange.*"); } ``` --- #### 6. **RPC 模式 (Remote Procedure Call Mode)** 在 RPC 模式下,客户端发出请求后会等待服务端返回响应结果。这种方式类似于远程过程调用。 - 使用场景:适用于需要同步通信的服务间交互。 - 特点:每次请求都会创建一个新的临时队列用于接收响应消息[^4]。 ```java // 设置 Correlation Data 来关联请求与响应 CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend(requestQueue, requestMessage, correlationData); // 接收响应 Object response = rabbitTemplate.receiveAndConvert(responseQueue); ``` --- ### 总结 以上介绍了 RabbitMQ六种主要工作模式及其典型应用场合。每种模式都有其独特的特点和最佳实践,在实际开发过程中应根据具体需求选择合适的工作模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值