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.*");
}

消息转换器:

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

    @Bean
    public 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 格式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/951634.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wireshark排除私接小路由

1.wireshark打开&#xff0c;发现了可疑地址&#xff0c;合法的地址段DHCP是192.168.100.0段的&#xff0c;打开后查看发现可疑地址段&#xff0c;分别是&#xff0c;192.168.0.1 192.168.1.174 192.168.1.1。查找到它对应的MAC地址。 ip.src192.168.1.1 2.通过show fdb p…

视频编辑最新SOTA!港中文Adobe等发布统一视频生成传播框架——GenProp

文章链接&#xff1a;https://arxiv.org/pdf/2412.19761 项目链接&#xff1a;https://genprop.github.io 亮点直击 定义了一个新的生成视频传播问题&#xff0c;目标是利用 I2V 模型的生成能力&#xff0c;将视频第一帧的各种变化传播到整个视频中。 精心设计了模型 GenProp&…

git merge与rebase区别以及实际应用

在 Git 中&#xff0c;merge 和 rebase 是两种将分支的更改合并到一起的常用方法。虽然它们都可以实现类似的目标&#xff0c;但它们的工作方式和效果有所不同。 1. Git Merge 定义&#xff1a;git merge 是将两个分支的历史合并在一起的一种操作。当你执行 git merge 时&…

HTML实战课堂之简单的拜年程序

一、目录&#xff1a; &#xfffc;&#xfffc; 一、目录&#xff1a; 二、祝福 三&#xff1a;代码讲解 &#xff08;1&#xff09;详细解释&#xff1a; 1.HTML部分 2. CSS部分 三、运行效果&#xff08;随机截图&#xff09;&#xff1a; 四、完整代码&#xff1a; 二、祝福…

Postman接口测试03|执行接口测试、全局变量和环境变量、接口关联、动态参数、断言

目录 七、Postman 1、安装 2、postman的界面介绍 八、Postman执行接口测试 1、请求页签 3、响应页签 九、Postman的环境变量和全局变量 1、创建环境变量和全局变量可以解决的问题 2、postman中的操作-全局变量 1️⃣手动设置 2️⃣代码设置 3️⃣界面获取 4️⃣代…

Linux第二课:LinuxC高级 学习记录day01

0、大纲 0.1、Linux 软件安装&#xff0c;用户管理&#xff0c;进程管理&#xff0c;shell 命令&#xff0c;硬链接和软连接&#xff0c;解压和压缩&#xff0c;功能性语句&#xff0c;结构性语句&#xff0c;分文件&#xff0c;make工具&#xff0c;shell脚本 0.2、C高级 …

python学opencv|读取图像(二十九)使用cv2.getRotationMatrix2D()函数旋转缩放图像

【1】引言 前序已经学习了如何平移图像&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;二十七&#xff09;使用cv2.warpAffine&#xff08;&#xff09;函数平移图像-CSDN博客 在此基础上&#xff0c;我们尝试旋转图像的同时缩放图像。 【2】…

logback日志

一、使用两个以上spring环境变量做三目操作 <springProperty name"application_name" scope"context" source"spring.application.name"/><springProperty name"trace_app_name" scope"context" source"sprin…

计算机网络 (34)可靠传输的工作原理

前言 计算机网络可靠传输的工作原理主要依赖于一系列协议和机制&#xff0c;以确保数据在传输过程中能够准确无误地到达目的地。 一、基本概念 可靠传输指的是数据链路层的发送端发送什么&#xff0c;在接收端就收到什么&#xff0c;即保证数据的完整性、正确性和顺序性。由于网…

如何用通俗易懂的方式解释大模型中的SFT,SFT过程需要大量标记的prompt和response吗?

想象你在培训一个超级助理 假设你新买了一个智能管家机器人&#xff0c;它已经看过海量的书籍和资料&#xff08;这就是预训练过程&#xff09;。但是呢&#xff0c;它还不太懂得"做人的艺术"——不知道该用什么语气说话、怎么回应你的需求。 现在你要训练它成为一…

istio-proxy oom问题排查步骤

1. 查看cluster数量 cluster数量太多会导致istio-proxy占用比较大的内存&#xff0c;此时需检查是否dr资源的host设置有配置为* 2. 查看链路数据采样率 若采样率设置过高&#xff0c;在压测时需要很大的内存来维护链路数据。可以调低采样率或增大istio-proxy内存。 检查iop中…

科研绘图系列:R语言绘制分组箱线图(boxplot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图输出系统信息介绍 科研绘图系列:R语言绘制分组箱线图(boxplot) 加载R包 library(ggpubr) library(ggplot2) library(tidyverse) # dev…

【SpringAOP】Spring AOP 底层逻辑:切点表达式与原理简明阐述

前言 &#x1f31f;&#x1f31f;本期讲解关于spring aop的切面表达式和自身实现原理介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &am…

IOS HTTPS代理抓包工具使用教程

打开抓包软件 在设备列表中选择要抓包的 设备&#xff0c;然后选择功能区域中的 HTTPS代理抓包。根据弹出的提示按照配置文件和设置手机代理。如果是本机则会自动配置&#xff0c;只需要按照提醒操作即可。 iOS 抓包准备 通过 USB 将 iOS 设备连接到电脑&#xff0c;设备需解…

Elasticsearch:使用 Playground 与你的 PDF 聊天

LLMs作者&#xff1a;来自 Elastic Toms Mura 了解如何将 PDF 文件上传到 Kibana 并使用 Elastic Playground 与它们交互。本博客展示了在 Playground 中与 PDF 聊天的实用示例。 Elasticsearch 8.16 具有一项新功能&#xff0c;可让你将 PDF 文件直接上传到 Kibana 并使用 Pla…

ClickHouse vs StarRocks 选型对比

一、面向列存的 DBMS 新的选择 Hadoop 从诞生已经十三年了&#xff0c;Hadoop 的供应商争先恐后的为 Hadoop 贡献各种开源插件&#xff0c;发明各种的解决方案技术栈&#xff0c;一方面确实帮助很多用户解决了问题&#xff0c;但另一方面因为繁杂的技术栈与高昂的维护成本&…

机器翻译优缺点

随着科技的飞速发展&#xff0c;机器翻译是近年来翻译行业的热门话题&#xff0c;在人们的生活和工作中日益普及&#xff0c;使用机器能够提高翻译效率&#xff0c;降低成本。尽管关于机器翻译为跨语言交流带来了诸多便利&#xff0c;但在译文的正确率和局限性方面存在一定争议…

【redis初阶】浅谈分布式系统

目录 一、常见概念 1.1 基本概念 2.2 评价指标&#xff08;Metric&#xff09; 二、架构演进 2.1 单机架构 2.2 应用数据分离架构 2.3 应用服务集群架构 2.4 读写分离/主从分离架构 2.5 引入缓存 ⸺ 冷热分离架构 2.6 数据库分库分表 2.7 业务拆分 ⸺ 引入微服务 redis学习&…

【Linux】文件 文件描述符fd

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 &#x1f33b;个人主页&#xff1a;路飞雪吖~ 一、C文件接口 &#x1f31f;写文件 &#x1f320;小贴士&#xff1a; &#x1f320;stdin && stdout && stderr Linux下…

uni-app如何引入echarts

在uni-app官网的官网插件中找echarts 打开图片对应的echarts&#xff0c;点击下载并导入插件 如果是vue3使用const echarts require(../../uni_modules/lime-echart/static/echarts.min);引入echarts <template><view><view style"width:750rpx; height:…