Rabbitmq的3种模式业务流程

添加jar包

<!-- 消息队列 -->

      <dependency>

         <groupId>com.rabbitmq</groupId>

         <artifactId>amqp-client</artifactId>

         <version>3.5.1</version>

      </dependency>

      <dependency>

             <groupId>org.springframework.amqp</groupId>

             <artifactId>spring-rabbit</artifactId>

             <version>1.4.0.RELEASE</version>

      </dependency>

 

 

1.ConnectionFactory factory.   用于注入消息队列的ip,客户端端口,账户,密码,虚拟主机名

2.Connection connection                                                                                                   //连接

3.Channel channel                                                                                                             //定义队列 

4.QueueingConsumer consumer                                                                                      //消费者

5.QueueingConsumer.Delivery delivery

6.String msg

 

 

queueDeclare(队列名称,是否持久化,是否生产者独有,队列无消息是否删除,传递额外参数)       //定义队列

exchangeDeclare(交换机名称,”3种模式之一”);                                                                                        //定义交换机;

queueBind(队列名称,交换机名称,路由key);                                                                                                //将队列和交换机绑定

basicPublish(交换机名称,路由key,参数设定props一般为null,传输字节码文件msg.getBytes())         //发送消息

basicConsume(队列名称,是否自动回复,消费者名称)                                                                      //将队列和消费者绑定

basicQos(1)                                                                                                                                             //每个消费者获取消息个数

basicAck(delivery.getEnvelope().getDelivertTag(),multiple是否批量回复)                                             //回复确认消

 

 

一、发布订阅模式fanout:

2=1.newConnection();

3=2.creataChannel();

3.exchangeDeclare(

3.basicPublish(                                         //循环发送消息

//下面定义第一个消费者

3.queueDeclare(

3.queueBind(                                           

3.basicQos(1个);

4=3                                                          //新建对象参数传入

3.basicConsume(

5=4.nextDelivery();                                 //这里开始循环获取消息

6=5                                                          //新建对象参数5.getBody()传入

得到6

3.basicAck(

//第二个消费者是一样的操作

 

 

二、路由模式direct:

2=1.newConnection();

3=2.creataChannel();

3.exchangeDeclare(

//下面3行发送消息,定义队列,队列和交换机绑定

3.queueDeclare(

3.basicPublish(                                         //循环发送消息

3.queueBind(

//下面定义第一个消费者

3.basicQos(1个);

4=3                                                          //新建对象参数传入

3.basicConsume(

5=4.nextDelivery();                                  //这里开始循环获取消息

6=5                                                          //新建对象参数5.getBody()传入

得到6

3.basicAck(

//下面是第二个消费者绑定第二条队列,第二条队列与交换机绑定

 

三、主题模式topic:

流程和路由模式是一样的,区别在路由key,根据一类路由key来发送消息或者是队列与交换机绑定

basicPublish和queuebind   这两个方法里的路由key

路由key的通配符

*号:能够匹配单个字符或者词组(只能匹配一个.)

#号:能够匹配多个字符,能够匹配多个”.”

### RabbitMQ 中三种模式的使用场景及选择策略 RabbitMQ 提供了多种消息传递模式,每种模式都有其独特的特点和适用场景。以下是 Direct Exchange、Fanout Exchange 和 Topic Exchange 这三种主要交换机类型的详细分析及其选择方法。 #### 1. **Direct Exchange** Direct Exchange 是一种简单的路由机制,它将消息发送到与其绑定的队列中,前提是这些队列的 routing key 完全匹配指定的 binding key[^5]。 - **特性**: 只有当消息的 routing key 与队列绑定的 binding key 完全一致时,消息才会被投递给对应的队列。 - **典型应用**: - 工作任务分配:例如,在分布式系统中,不同任务可以根据类型分发给不同的处理节点。 - 日志记录:按照日志级别(如 info, warning, error)将日志消息分类存储到不同的队列中。 - **优点**: - 实现简单,易于理解和配置。 - 高效的消息过滤能力。 - **缺点**: - 路由规则较为单一,无法满足复杂的业务需求。 --- #### 2. **Fanout Exchange** Fanout Exchange 将接收到的所有消息无条件地广播到所有绑定的队列,而不考虑 routing key 或其他条件。 - **特性**: 所有的消息都会被复制并发送至每一个绑定的队列,无论它们是否有特定的 routing key。 - **典型应用**: - 广播通知:向多个消费者同步更新事件或状态变化的信息。 - 实时数据推送:例如股票行情更新、新闻动态等需要即时推送给大量用户的场景。 - **优点**: - 极高的效率,适合大规模并发广播的需求。 - 不依赖于复杂的路由逻辑,简化了开发流程。 - **缺点**: - 缺乏灵活性,无法针对不同类型的消息实施差异化处理。 --- #### 3. **Topic Exchange** Topic Exchange 支持基于模式匹配的方式进行消息路由,允许使用通配符定义更灵活的 routing key 规则。 - **特性**: 消息的 routing key 可以是一个点号 (`.`) 分隔的字符串,而队列可以通过 `*` (单个单词) 和 `#` (零个或多个单词) 来声明匹配规则。 - **典型应用**: - 复杂的日志管理系统:根据不同模块和严重程度组合筛选日志信息。 - 动态任务调度:依据任务属性(如优先级、区域、设备类型等)自动分派执行单元。 - **优点**: - 强大的表达能力和适应性,能够覆盖广泛的业务场景。 - 更加精细的控制粒度,便于构建高度定制化的解决方案。 - **缺点**: - 相对于 Direct 和 Fanout,其实现复杂度较高,可能导致性能开销增加。 --- #### 如何选择合适的交换机类型? 在实际项目中,应根据具体的业务需求和技术约束来决定采用哪种交换机: - 如果只需要精确匹配某个固定的 routing key,则推荐使用 **Direct Exchange**。 - 若目标是将相同的内容分发给尽可能多的目标群体,则可以选择 **Fanout Exchange**。 - 当面临多样化的路由需求或者希望利用通配符增强可扩展性和维护便利性时,应该倾向于选用 **Topic Exchange**。 此外,还需综合考量诸如吞吐量要求、延迟容忍度等因素,并结合 RabbitMQ 的内置管理和监控功能优化整体架构设计[^2]。 ```python import pika connection = pika.BlockingConnection(pika.ConnectionParameters(&#39;localhost&#39;)) channel = connection.channel() # Example of publishing a message to different exchanges def publish_message(exchange_type, exchange_name, routing_key, body): channel.exchange_declare(exchange=exchange_name, exchange_type=exchange_type) channel.basic_publish( exchange=exchange_name, routing_key=routing_key, body=body ) print(f"Message sent with {routing_key}: {body}") publish_message(&#39;direct&#39;, &#39;logs_direct&#39;, &#39;info&#39;, &#39;This is an informational log&#39;) publish_message(&#39;fanout&#39;, &#39;broadcast_fanout&#39;, &#39;&#39;, &#39;Broadcast this notification!&#39;) publish_message(&#39;topic&#39;, &#39;topics_topic&#39;, &#39;*.critical.#&#39;, &#39;Critical system alert&#39;) connection.close() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值