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

RabbitMQ 交换机、队列和路由键的命名规范

在 RabbitMQ 中,使用 Topic Exchange 模式时,交换机、队列和路由键的命名规范是非常重要的,尤其是在多环境和多微服务的场景中。合理的命名规范可以提高消息系统的可维护性、可扩展性以及可读性。以下是一些关于 Topic Exchange 模式中交换机、队列、和路由键的命名规范建议:

1. 交换机 (Exchange) 命名规范

交换机用于路由消息到合适的队列。在 Topic Exchange 中,交换机的命名应清晰地反映其用途或消息流的目的。

  • 命名格式:<service>.<component>.<exchangeType>
    • <service>:服务或系统的名称(例如:order, payment, shipping)。
    • <component>:表示消息流的具体功能组件(例如:event, notification)。
    • <exchangeType>:topic 或其他类型,虽然 topic 是默认值,但可以在命名时加上明确区分。
  • 示例:
    • order.event.topic:表示 order 服务的事件交换机。
    • payment.notification.topic:表示 payment 服务的通知交换机。
    • shipping.event.topic:表示 shipping 服务的事件交换机。

2. 队列 (Queue) 命名规范

队列的命名通常与业务功能和服务的使用场景密切相关。队列应该根据其用途、功能模块以及所接收的消息类型来命名。

  • 命名格式:<service>.<component>.<queueType>
    • <service>:服务名称。
    • <component>:队列的具体功能(例如:order, payment, shipping)。
    • <queueType>:队列的类型或消息的具体内容,如 incoming, outgoing, retry,或者使用 consumer 或 producer 来区分消费方和生产方。
  • 示例:
    • order.event.incoming:表示消费来自 order 服务的事件的队列。
    • payment.notification.outgoing:表示 payment 服务通知消息的输出队列。
    • shipping.event.consumer:表示 shipping 服务消费者队列。

3. 路由键 (Routing Key) 命名规范

路由键是将消息路由到合适队列的关键,它的命名方式可以通过使用不同的层级来分类消息。Topic Exchange 使用通配符 (* 和 #) 来匹配不同层级的路由键,因此需要注意设计路由键的层级。

  • 命名格式:<service>.<messageType>.<action>.<subaction>
    • <service>:消息所属的服务名称。
    • <messageType>:消息的类型(例如:order, payment, shipping)。
    • <action>:消息代表的业务操作(例如:created, updated, deleted)。
    • <subaction>:可选的额外细分(例如:failed, success,具体业务操作的进一步细化)。
  • 路由键的命名约定:
    • 使用点 (.) 分隔不同的层级。
    • 使用 * 通配符来匹配一个层级。
    • 使用 # 通配符来匹配多个层级。
  • 示例:
    • order.created:用于表示订单创建事件。
    • order.created.success:用于表示订单创建成功事件。
    • order.created.failed:用于表示订单创建失败事件。
    • payment.completed:用于表示支付完成事件。
    • payment.updated.retry:表示支付更新并需要重试的事件。

4. 示例完整配置

假设你有一个系统,其中包含 order 服务、payment 服务和 shipping 服务。使用 Topic Exchange 模式,你的配置可以类似于:
Exchange 配置:

@Bean
public Exchange orderEventExchange() {return new TopicExchange("order.event.topic");
}@Bean
public Exchange paymentNotificationExchange() {return new TopicExchange("payment.notification.topic");
}@Bean
public Exchange shippingEventExchange() {return new TopicExchange("shipping.event.topic");
}

Queue 配置:

@Bean
public Queue orderEventQueue() {return new Queue("order.event.incoming");
}@Bean
public Queue paymentNotificationQueue() {return new Queue("payment.notification.outgoing");
}@Bean
public Queue shippingEventQueue() {return new Queue("shipping.event.consumer");
}

Binding 配置:

@Bean
public Binding orderEventBinding(Queue orderEventQueue, TopicExchange orderEventExchange) {return BindingBuilder.bind(orderEventQueue).to(orderEventExchange).with("order.*");
}@Bean
public Binding paymentNotificationBinding(Queue paymentNotificationQueue, TopicExchange paymentNotificationExchange) {return BindingBuilder.bind(paymentNotificationQueue).to(paymentNotificationExchange).with("payment.*.completed");
}@Bean
public Binding shippingEventBinding(Queue shippingEventQueue, TopicExchange shippingEventExchange) {return BindingBuilder.bind(shippingEventQueue).to(shippingEventExchange).with("shipping.*");
}

消息转换器:

    @Beanpublic Jackson2JsonMessageConverter jackson2JsonMessageConverter() {return new Jackson2JsonMessageConverter();}@Beanpublic RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory,Jackson2JsonMessageConverter jackson2JsonMessageConverter) {RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);rabbitTemplate.setMessageConverter(jackson2JsonMessageConverter);return rabbitTemplate;}

消息发送示例:

@Autowired
private RabbitTemplate rabbitTemplate;public void sendOrderCreatedEvent(OrderCreatedEvent event) {rabbitTemplate.convertAndSend("order.event.topic", "order.created", event);
}public void sendPaymentCompletedEvent(PaymentCompletedEvent event) {rabbitTemplate.convertAndSend("payment.notification.topic", "payment.completed", event);
}public void sendShippingEvent(ShippingEvent event) {rabbitTemplate.convertAndSend("shipping.event.topic", "shipping.created", event);
}

5. 命名规范总结

  • Exchange 命名:应明确服务和消息类型,保持一致性。推荐使用 service.event.topic 格式。
  • Queue 命名:应清晰地描述队列用途,区分消费和生产者。推荐使用 service.component.type 格式。
  • Routing Key 命名:应采用清晰的层级结构,利用通配符 *# 做路由匹配。推荐使用 service.messageType.action 格式。

相关文章:

RabbitMQ 交换机、队列和路由键的命名规范

在 RabbitMQ 中&#xff0c;使用 Topic Exchange 模式时&#xff0c;交换机、队列和路由键的命名规范是非常重要的&#xff0c;尤其是在多环境和多微服务的场景中。合理的命名规范可以提高消息系统的可维护性、可扩展性以及可读性。以下是一些关于 Topic Exchange 模式中交换机…...

腾讯云AI代码助手编程挑战赛-刑说

作品简介 鉴于当代普法力度不够大&#xff0c;这个刑说可以帮助大家更好的普及法律知识 技术架构 采用了全后端分离的架构&#xff0c;前端使用Vue.js&#xff0c;腾讯云的AI服务处理自然语言理解与生成。 实现过程 开发环境、开发流程 系统&#xff1a;win11 开发工具&…...

【测试】持续集成CI/CD

近期更新完毕&#xff0c;建议关注收藏点赞&#xff5e; 目录 概括gitJenkinspostman集成jenkins代码集成jenkins 概括 CI/CD stands for Continuous Integration and Continuous Deployment 定义 团队成果持续集成到公共平台。一天可以集成1次or多次 本地代码管理 git 远程代…...

阿里云直播Web

官方文档&#xff1a;Web播放器SDK常见问题_视频点播(VOD)-阿里云帮助中心 bug&#xff1a;播流的不稳定&#xff0c;直播总会进入 onM3u8Retry 监听&#xff0c;用户端就会黑屏&#xff0c;&#xff08;但其实并没有关播&#xff0c;正常关播进入的是pause这个监听&#xff0…...

DuckDB:PRAGMA语句动态配置数据库行为

PRAGMA语句是DuckDB从SQLite中采用的SQL扩展。PRAGMA命令可能会改变数据库引擎的内部状态&#xff0c;并可能影响引擎的后续执行或行为。本文介绍PRAGMA命令及其典型应用场景。 DuckDB PRAGMA介绍 在 DuckDB 中&#xff0c;PRAGMA 是一种编译指示&#xff08;compiler directi…...

GO通过SMTP协议发送邮件

什么是SMTP协议 SMTP&#xff08;Simple Mail Transfer Protocol&#xff0c;简单邮件传输协议&#xff09;是用于发送邮件的协议。当一个邮件服务器需要发送邮件给另一个邮件服务器时&#xff0c;它会使用SMTP协议与目标服务器建立连接&#xff0c;并传输邮件内容。SMTP协议的…...

轻量自高斯注意力机制LSGAttention模型详解及代码复现

模型背景 近年来,卷积神经网络(CNN)在高光谱图像分类领域取得了显著进展。然而,CNN面临 长距离关系建模 和 计算成本 增加的挑战。为解决这些问题,研究人员提出了基于 轻量自高斯注意(Light Self-Gaussian-Attention, LSGA) 机制的视觉转换器(Vision Transformer, VIT),旨…...

解读若依框架中的`@Excel` 和 `@Excels` 注解

文章目录 一、Excels 注解详解1.1 适用场景1.2 作用与好处 二、Excel 注解详解2.1 核心属性解析2.2 高级用法2.3 综合应用案例 三、总结 解读若依框架中的 Xss 注解博客&#xff1a;解读若依框架中的 Xss 注解 接下来我们将对若依框架中的 Excel 和 Excels 注解进行更加详细的…...

云商城--基础数据处理和分布式文件存储

第2章 基础数据处理和分布式文件存储 1.分布式文件存储系统Ceph学习 ​ 1).掌握Ceph架构 ​ 2).掌握Ceph组件 ​ 3).搭建Ceph集群(了解) 2.Ceph使用 ​ 1).基于Ceph实现文件上传 ​ 2).基于Ceph实现文件下载 3.SKU、SPU管理 ​ 1).掌握SKU和SPU关系 ​ 2).理解商品发…...

六十九:基于openssl实战验证RSA

RSA&#xff08;Rivest-Shamir-Adleman&#xff09;是一种非对称加密算法&#xff0c;广泛应用于数据加密和数字签名领域。在实际开发和学习过程中&#xff0c;理解 RSA 的工作原理和使用场景非常重要。本文将以 OpenSSL 工具为基础&#xff0c;通过实例操作来验证和理解 RSA 的…...

Three.js 用户交互:构建沉浸式3D体验的关键

文章目录 前言一、基本交互&#xff1a;鼠标与触摸事件二、高级交互&#xff1a;键盘控制与游戏手柄支持三、物理模拟与碰撞检测四、手势识别与多点触控五、增强现实&#xff08;AR&#xff09;与虚拟现实&#xff08;VR&#xff09;六、触觉反馈与震动效果七、语音控制八、眼球…...

Android车机DIY开发之学习篇(五)默认应用修改

Android车机DIY开发之学习篇(五)默认应用修改 android默认应用位置 sdk/packages/apps InitRC配置 应用安装的目录 /system/priv-app 该路径存放一些系统底层的应用&#xff0c;比如Setting&#xff0c;systemUI等。该目录中的app拥有较高的系统权限&#xff0c;而且如果要使…...

linux 设置mysql 外网访问

1、修改 MySQL 配置文件 找到并编辑配置文件&#xff1a;在Linux系统中&#xff0c;MySQL的配置文件通常是/etc/mysql/my.cnf&#xff0c;使用命令sudo vim /etc/mysql/my.cnf打开文件。 注释或修改 bindaddress&#xff1a;找到bindaddress 127.0.0.1&#xff0c;将其注释掉…...

SQL UNION 操作符

SQL UNION 操作符 SQL UNION 操作符用于合并两个或多个 SELECT 语句的结果集。它将多个结果集组合成一个单独的结果集&#xff0c;并去除重复的行。为了使用 UNION&#xff0c;每个 SELECT 语句必须具有相同的列数&#xff0c;并且对应列的数据类型必须兼容。 语法 SELECT c…...

c++ 17 constexpr

未来已来&#xff1a;从SFINAE到concepts #include <type_traits> #include <vector> #include <list> #include <iostream> // 一个通用的容器打印函数&#xff0c;支持任何带 begin()/end() 的容器 template<typename Container> …...

Java QueryWrapper groupBy自定义字段,以及List<Map>转List<Entity>

Java queryWrapper groupby自定义字段 String sql "data_id,(select value from lz_html a where a.data_id lz_html.data_id and class_nametest-item-status) status," "(select value from lz_html a where a.data_id lz_html.data_id and class_nametes…...

【Rust自学】11.7. 按测试的名称运行测试

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 11.7.1. 按名称运行测试的子集 如果想要选择运行的测试&#xff0c;就将测试的名称&#xff08;一个或多个&#xff09;作为cargo test的…...

Git:Cherry-Pick 的使用场景及使用流程

前面我们说了 Git合并、解决冲突、强行回退等解决方案 >> 点击查看 这里再说一下 Cherry-Pick功能&#xff0c;Cherry-Pick不是merge&#xff0c;只是把部分功能代码Cherry-Pick到远程的目标分支 git cherry-pick功能简介&#xff1a; git cherry-pick 是用来从一个分…...

Ubuntu 24.04 LTS系统安装Docker踩的坑

一开始我跟着Docker给出的官网文档 Ubuntu | Docker Docs 流程走&#xff0c;倒腾了两个多小时&#xff0c;遇到了各种坑&#xff0c;最后放弃了。在我们使用脚本安装Docker命令前&#xff0c;我们先把已经安装的Docker全部卸载掉。 卸载Docker 1.删除docker及安装时自动安装…...

工作生活的感悟

前言 这篇博客基本每年都更新&#xff0c;每年都有新的感悟&#xff0c;作为一个记录吧&#xff01;以后按照年来记录 2022年 不经意间&#xff0c;已在职场耕耘数载&#xff0c;特此记录以作回顾。 无用之用&#xff0c;方为大用&#xff1a; 年岁渐长&#xff0c;愈发体会…...

NCCL学习笔记-函数解析

前言 1.NCCL 是一个专注于 GPU 间高性能通信的库&#xff0c;不提供进程管理或安全通信功能。 2.用户需要依赖应用程序的进程管理系统&#xff08;如 MPI&#xff09;来管理进程&#xff0c;并确保 NCCL 在安全的网络环境中运行。 3.通过正确配置环境变量&#xff08;如 NCCL_…...

windows系统如何将基座大模型私有化部署

1.windows10系统 安装npm、node、 git 最新版本 安装vmware虚拟机 内存8GB以上 双核4线程 2.vmware虚拟机 安装ubuntu系统 22.04版本 3.进入ubuntu系统 3.1 安装Ollama 基座大模型工具 在命令行中执行 curl -fsSL https://ollama.com/install.sh | sh 浏览器打开 …...

牛客网刷题 ——C语言初阶(6指针)——BC106 上三角矩阵判定

1. 题目描述——BC106 上三角矩阵判定 牛客网OJ题链接 描述 KiKi想知道一个n阶方矩是否为上三角矩阵&#xff0c;请帮他编程判定。上三角矩阵即主对角线以下的元素都为0的矩阵&#xff0c;主对角线为从矩阵的左上角至右下角的连线。 示例 输入&#xff1a; 3 1 2 3 0 4 5 0 0…...

CentOS 7 下 MySQL 5.7 的详细安装与配置

1、安装准备 下载mysql5.7的安装包 https://dev.mysql.com/get/mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar 下载后上传至/home目录下 2、mysql5.7安装 2.1、更新yum并安装依赖 yum update -y sudo yum install -y wget sudo yum install libaio sudo yum install perl su…...

【深度学习】数据预处理

为了能用深度学习来解决现实世界的问题&#xff0c;我们经常从预处理原始数据开始&#xff0c; 而不是从那些准备好的张量格式数据开始。 在Python中常用的数据分析工具中&#xff0c;我们通常使用pandas软件包。 像庞大的Python生态系统中的许多其他扩展包一样&#xff0c;pan…...

day01-HTML-CSS——基础标签样式表格标签表单标签

目录 此篇为简写笔记下端1-3为之前笔记&#xff08;强迫症、保证文章连续性&#xff09;完整版笔记代码模仿新浪新闻首页完成审核不通过发不出去HTMLCSS1 HTML1.1 介绍1.1.1 WebStrom中基本配置 1.2 快速入门1.3 基础标签1.3.1 标题标签1.3.2 hr标签1.3.3 字体标签1.3.4 换行标…...

无需昂贵GPU:本地部署开源AI项目LocalAI在消费级硬件上运行大模型

无需昂贵GPU&#xff1a;本地部署开源AI项目LocalAI在消费级硬件上运行大模型 随着人工智能技术的快速发展&#xff0c;越来越多的AI模型被广泛应用于各个领域。然而&#xff0c;运行这些模型通常需要高性能的硬件支持&#xff0c;特别是GPU&#xff08;图形处理器&#xff09…...

搭建prometheus+grafana监控系统抓取Linux主机系统资源数据

Prometheus 和 Grafana 是两个非常流行的开源工具&#xff0c;通常结合使用来实现监控、可视化和告警功能。它们在现代 DevOps 和云原生环境中被广泛使用。 1. Prometheus 定义&#xff1a;Prometheus 是一个开源的系统监控和告警工具包&#xff0c;最初由 SoundCloud 开发&am…...

uni-app无限级树形组件简单实现

因为项目一些数据需要树形展示&#xff0c;但是官网组件没有。现在简单封装一个组件在app中使用&#xff0c;可以无线嵌套&#xff0c;展开&#xff0c;收缩&#xff0c;获取子节点数据等。 简单效果 组件TreeData <template><view class"tree"><te…...

基于华为ENSP的OSPF状态机、工作过程、配置保姆级别详解(2)

本篇技术博文摘要 &#x1f31f; 基于华为enspOSPF状态机、OSPF工作过程、.OSPF基本配置等保姆级别具体详解步骤&#xff1b;精典图示举例说明、注意点及常见报错问题所对应的解决方法 引言 &#x1f4d8; 在这个快速发展的技术时代&#xff0c;与时俱进是每个IT人的必修课。我…...

网站案例/电商平台运营方案

今天笔试的东西&#xff0c;重载&#xff0c;覆盖和隐藏 重载与覆盖成员函数被重载的特征&#xff1a;&#xff08;1&#xff09;相同的范围&#xff08;在同一个类中&#xff09;&#xff1b; // 这个很重要&#xff0c;如在不同类中则是隐藏&#xff08;2&#xff09;函数名字…...

广州制作网站公司/宁波seo外包费用

【回复“1024”&#xff0c;送你一个特别推送】在 Google I/O 2018 开发者大会上&#xff0c;谷歌官方推出了 Android Jetpack&#xff0c;其中包含的 Android 开发架构组件能够帮助我们简化开发流程&#xff0c;从而轻松打造出优质应用。开发者能够利用 Jetpack 组件学习最佳实…...

好网站求推荐/网站分析

我正试图让我的新samba服务器运行几天,我开始失去理智而不知道我做错了什么.这是我的设置&#xff1a;OpenLDAP 2.4.21服务器,包含~15个组和> 100个用户,所有服务器都具有存储在LDAP中的unix和samba密码,以及分配和存储在LDAP中的用户SID和主要组SID,这些服务器来自SID LDAP…...

html 网站源码 卖手机/互联网营销的方法

2019独角兽企业重金招聘Python工程师标准>>> (index):11 Uncaught ReferenceError: testAlert is not definedat HTMLInputElement.onclick ((index):11)解决&#xff1a; if后面漏了{。 要从chrome控制台看。否则很难定位。 Uncaught SyntaxError: Unexpected toke…...

博客式笑话网站织梦源码/潍坊seo招聘

Spring AOP AOP介绍 Aop为Aspect Oriented Programming的缩写&#xff0c;面向切面编程&#xff0c;是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。 AOP 是 OOP 的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是Spring框架中的一个重要内容&…...

兰州网站建设/推广平台哪儿有怎么做

临江仙.吴忠漫步 纵目水乡多少埠&#xff1f;引来商贾如云。黄河造就万家春。 古城连广厦&#xff0c;绿树抱街心。 在此唐宗施大略&#xff0c;丝绸驼队铃频。清真美食诱嘉宾。 人勤千业旺&#xff0c;当数穆斯林&#xff01; 注&#xff1a;吴忠&#xff0c;市名&#xff0c;…...