当前位置: 首页 > news >正文

成都私人做网站信丰做网站

成都私人做网站,信丰做网站,企业为什么要做流程,福建省建设注册执业资格管理中心网站大家好,我是工藤学编程 🦉一个正在努力学习的小博主,期待你的关注实战代码系列最新文章😉C实现图书管理系统(Qt C GUI界面版)SpringBoot实战系列🐷【SpringBoot实战系列】SpringBoot3.X 整合 Mi…
大家好,我是工藤学编程 🦉一个正在努力学习的小博主,期待你的关注
实战代码系列最新文章😉C++实现图书管理系统(Qt C++ GUI界面版)
SpringBoot实战系列🐷【SpringBoot实战系列】SpringBoot3.X 整合 MinIO 存储原生方案
分库分表分库分表之实战-sharding-JDBC分库分表执行流程原理剖析
消息队列深入浅出 RabbitMQ-交换机详解与发布订阅模型实战

前情摘要:

1、深入浅出 RabbitMQ-核心概念介绍与容器化部署
2、深入浅出 RabbitMQ-简单队列实战
3、深入浅出 RabbitMQ-工作队列实战(轮训策略VS公平策略)
4、深入浅出 RabbitMQ-交换机详解与发布订阅模型实战


【亲测宝藏】发现一个让 AI 学习秒变轻松的神站!不用啃高数、不用怕编程,高中生都能看懂的人工智能教程来啦!

👉点击跳转,和 thousands of 小伙伴一起用快乐学习法征服 AI,说不定下一个开发出爆款 AI 程序的就是你!


本文章目录

      • 深入浅出 RabbitMQ-路由模式详解
        • 一、什么是路由模式?
        • 二、核心组件与工作流程
        • 三、实战场景:日志系统的精准处理
        • 四、代码实战:手把手实现路由模式
          • 1. 生产者:发送带路由键的消息
          • 2. 消费者1:接收所有级别日志(存储用)
          • 3. 消费者2:仅接收错误日志(告警用)
        • 五、运行效果与核心亮点
        • 六、总结

深入浅出 RabbitMQ-路由模式详解

在消息中间件的世界里,RabbitMQ的路由机制堪称灵活调度的典范。今天我们聚焦其中的「路由模式」(Routing),聊聊它如何像精准的导航系统一样,让消息按规则抵达目的地。

一、什么是路由模式?

路由模式是RabbitMQ中一种基于「标签匹配」的消息分发机制。它的核心逻辑是:消息通过指定的“路由键”(Routing Key),被交换机精准转发到绑定了相同键值的队列

与广播模式(Fanout)不同,路由模式不会“雨露均沾”——只有当消息的Routing Key与队列绑定的Binding Key完全匹配时,消息才会被投递。这种特性让它成为需要“定向处理消息”场景的理想选择。

二、核心组件与工作流程
  1. 交换机类型:必须使用Direct类型(直连交换机),它是路由模式的“调度中心”。
  2. 绑定关系:队列与交换机绑定时,需明确指定Binding Key(可理解为队列“感兴趣的标签”)。
  3. 消息投递:生产者发送消息时,需指定Routing Key(消息的“标签”)。
  4. 转发规则:Direct交换机会将消息转发给所有Binding Key与消息Routing Key完全匹配的队列。

简单说,这就像快递分拣:Binding Key是“收件地址”,Routing Key是“快递面单地址”,交换机则是“分拣员”,只把快递送到地址完全匹配的站点。

三、实战场景:日志系统的精准处理

最经典的应用莫过于日志采集系统(如ELK stack):

  • 需求:error级别的日志需要实时告警(短信/邮件),而info、debug级别的日志仅需存储供后续分析。
  • 实现
    • 声明Direct交换机(如log_exchange)。
    • 告警队列(alert_queue)绑定Binding Key为error
    • 存储队列(store_queue)绑定Binding Key为errorinfodebug
    • 生产者发送日志时,按级别设置Routing Key(如error日志设为error)。

这样一来,error日志会同时进入两个队列(既告警又存储),而info/debug日志仅进入存储队列,完美满足差异化需求。

四、代码实战:手把手实现路由模式

下面用Java代码演示完整流程,基于RabbitMQ Java Client 5.x。

1. 生产者:发送带路由键的消息
public class LogProducer {private static final String EXCHANGE_NAME = "log_direct_exchange";public static void main(String[] args) throws Exception {// 1. 创建连接工厂并配置ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.229.128");factory.setUsername("admin");factory.setPassword("password");factory.setVirtualHost("/dev");factory.setPort(5672);// 2. 建立连接和信道try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 3. 声明Direct交换机channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);// 4. 准备不同级别的日志消息String errorLog = "【ERROR】数据库连接失败";String infoLog = "【INFO】用户登录成功";String debugLog = "【DEBUG】SQL执行耗时: 20ms";// 5. 发送消息并指定Routing Keychannel.basicPublish(EXCHANGE_NAME, "error", null, errorLog.getBytes());channel.basicPublish(EXCHANGE_NAME, "info", null, infoLog.getBytes());channel.basicPublish(EXCHANGE_NAME, "debug", null, debugLog.getBytes());System.out.println("日志消息发送完成");}}
}
2. 消费者1:接收所有级别日志(存储用)
public class LogStorageConsumer {private static final String EXCHANGE_NAME = "log_direct_exchange";public static void main(String[] args) throws Exception {// 1. 配置连接(同生产者)ConnectionFactory factory = new ConnectionFactory();factory.setHost("192.168.229.128");factory.setUsername("admin");factory.setPassword("password");factory.setVirtualHost("/dev");factory.setPort(5672);Connection connection = factory.newConnection();Channel channel = connection.createChannel();// 2. 声明交换机(与生产者保持一致)channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);// 3. 创建临时队列并绑定多个Routing KeyString queueName = channel.queueDeclare().getQueue();channel.queueBind(queueName, EXCHANGE_NAME, "error");  // 接收error日志channel.queueBind(queueName, EXCHANGE_NAME, "info");   // 接收info日志channel.queueBind(queueName, EXCHANGE_NAME, "debug");  // 接收debug日志// 4. 消费消息(存储逻辑)DeliverCallback callback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println("[存储服务] 收到日志: " + message);};channel.basicConsume(queueName, true, callback, consumerTag -> {});}
}
3. 消费者2:仅接收错误日志(告警用)
public class ErrorAlertConsumer {private static final String EXCHANGE_NAME = "log_direct_exchange";public static void main(String[] args) throws Exception {// 连接配置同上ConnectionFactory factory = new ConnectionFactory();// ...省略连接参数Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT);String queueName = channel.queueDeclare().getQueue();// 只绑定error路由键channel.queueBind(queueName, EXCHANGE_NAME, "error");// 消费消息(告警逻辑)DeliverCallback callback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println("[告警服务] 紧急! " + message);};channel.basicConsume(queueName, true, callback, consumerTag -> {});}
}
五、运行效果与核心亮点
  • 当生产者发送消息时:

    • error日志会同时被「存储服务」和「告警服务」接收。
      在这里插入图片描述

    • infodebug日志仅被「存储服务」接收。
      在这里插入图片描述

  • 核心优势:通过Routing Key实现消息的“按需分发”,既保证了消息处理的针对性,又降低了系统耦合度。

六、总结

路由模式是RabbitMQ中实现“精准消息投递”的核心方案,尤其适合需要按消息类型/级别差异化处理的场景(如日志分级、订单状态通知等)。掌握它的关键在于理解「Direct交换机+Routing Key+Binding Key」的三角关系——看似简单的机制,却能支撑起复杂业务的消息流转需求。

下次开发中遇到消息定向分发的需求,不妨试试RabbitMQ路由模式,让消息像被精准导航一样抵达目的地~

觉得有用请点赞收藏!
如果有相关问题,欢迎评论区留言讨论~

http://www.dtcms.com/a/594757.html

相关文章:

  • 正则表达式入门
  • 男和女做暖暖网站青海城乡住房建设厅网站
  • 服装设计师常用网站企业文化墙设计图效果图
  • 做爰全过程免费的教网站邢台做网站价位
  • 贵阳网站seo公司2022一级造价师停考
  • 递归函数练习题
  • [設計模式]設計模式原則
  • 【RK3568】TFTP+NFS启动文件系统
  • 网站建设 中标都江堰建设局网站
  • 网站开站备案外贸营销推广方案
  • 怎样注册网站中文域名免费个人网站 上传
  • 【Janet】控制流
  • 网站建设哪家公司最好免费医院网页模板
  • 【App开发】05:Android Studio项目配置文件全解析( App 项目结构)
  • 合并两个有序链表 --- 递归
  • 编译立创S3小智语音机器人+修改表情
  • 网站的文件夹结构承包工地的网站
  • Simulink从入门到入门--热水器1
  • 【开题答辩实录分享】以《云音乐小程序设计与开发》为例进行答辩实录分享
  • 三生团队网站找谁做的国人原创wordpress主题
  • 京东云网站建设做网站四百全包
  • 深圳做男装什么网站容易找工网站建设总体需求报告
  • Java-167 Neo4j CQL 实战:CREATE/MATCH 与关系建模速通 案例实测
  • 基于突发性链路感知的自适应链路质量估计算法matlab仿真
  • 开发网站广州a站app
  • 一款3.8V to 55V输入,提供2A电流的DC-DC降压芯片推荐
  • OpenAI responses使用教程(三) ——Responses create python SDK 介绍
  • 北京运营推广网站建设黄骅港赶海推荐个好地方
  • 珠海网站建设公司哪个好最近发生的新闻事件
  • win10 配置下载安装 Office LTSC 专业增强版 2024