代码规范 —— QMQ 开发规范

news2024/11/13 15:54:16

优质博文:IT-BLOG-CN在这里插入图片描述

一、代码规范

【1】消费者必须以Consumer结尾,生产者必须以Producer结尾。

【2】选择合适的消费模式:根据业务判断消费模式是集群模式还是广播模式,具体为:MessageConsumerProvider.addListener(String subject, String consumerGroup, MessageListener listener,boolean consumeMostOnce)//consumerGroup为空时是广播模式,否则为集群模式。

【3】选择适合的队列类型:根据业务判断消费模式是普通队列还是延迟队列,具体为:Message message = producer.generateMessage("qmq.fx.test");// 延迟10smessage.setDelayTime(10, TimeUnit.SECONDS);

【4】选择适合的消费者数量:若想加快消费速度,可以新增单台机器的消费者数量,具体为:MessageListenerConfig messageListenerConfig = new MessageListenerConfig();messageListenerConfig.setNotifierThreadCount(Runtime.getRuntime().availableProcessors());

二、命令规范

【1】若为监听数据库,命名为top.cache.db.topcoredb.表名若为其他业务需要,命名为top.模块.业务

配置规范

【1】需要新增配置文件xxx.qmq.properties:若应用使用qmq,需要新增配置文件xxx.qmq.properties,否则会导致qmq初始化失败。

【2】明确使用的场景:解耦减少依赖,使核心业务外的其他业务插件化,例如订单出票后需要发邮件,库存卖空需要触发报警等削峰异步化,前置流量过大,将整体流程拆为两部分,核心逻辑保持干净和足够的性能,较重的逻辑后置处理定时器支持在未来指定时刻消费消息,减少业务侧轮询任务的开发。

【3】慎用Pull模式:确保所有分支都覆盖ACK ,最好是有finally,建议Push模式:采用自动ack,无须业务线程池。

【4】有限次数的重试。

【5】消息量适度:消息量过大且消费者来不及处理会导致消息堆积。

【6】消息大小适度:业务消息<4KB

【7】合并处理:相同处理对象更新频次较高场景,建议滑动窗口聚合.

【8】尽量避免使用有序消息:有时序要求场景,和服务提供方确认是不是同步写入。

【9】消息重复投递,业务要做容错:幂等处理。

【10】消息堆积、延迟、处理能力下降等指标监控。

【11】防止jackson版本不一致:jackson版本不一致可能会导致反序列化的结果不一致。

【12】对消息量大的消息队列可以单独拆分:监听binlog时,对于消息量大又不太重要的表,可以拆分消息队列,将这部分放到单独的消息队列中,可以避免这部分消息积压影响重要数据。

【13】重要数据持久化消息或做补偿动作:正常qmq客户端不能保证消息不丢失,如果对对消息有可靠性要求,需要持久化消息或做补偿动作。比如数据库监听binlog,将订单状态通过qmq进行同步,实际情况可能存在丢失;可以通过定时任务查询数据库进行补偿。

三、使用规范

【1】QMQ新主题通过注册模式部署到独立的集群, 避免直接代码中定义与使用。

【2】QMQ适用范围, 避免滥用。
  ☑️ 不能将QMQ用作数据传输, 数据存储等功能。
  ☑️ 适用于状态通知,事件驱动。
  ☑️ 适用于异步解耦。
  ☑️ 契约json遵循最精简方式, 只传递基本信息, 如订单号, 状态等, 其他业务处理数据依赖接口反查. 同时精简有利于后续的补偿与异常处理。

【3】QMQ生产者和消费者代码目前存在的问题:
  ☑️ 规范不统一, 编码风格不统一, 订阅和推送QMQ消息代码写法各异。
  ☑️ 消费者与生产者的代码散落在各个地方, 同一个topic存在多个producer
  ☑️ QMQ缺乏契约治理, 消费者/生产者都需感知具体的message, 定义一个或多个类做json转换或读取具体的message属性。
  ☑️ 开发直接依赖的是QMQ框架Message, 读取各个property或字符串再转为对象, 非直接面向对象的编码风格。

【4】对于QMQ生产者与消费者编码在框架基础上再次进行了统一的封装,实现代码风格与编码规范的统一。
   ☑️ 消费者模板
     a) QMQ消费者(流量入口)只能在service层的consumer package
     b) 命名后缀为XXXConsumer
   ☑️ 生产者模板
     a) QMQ生产者只能在service层的producer package
     b) 命名后缀为XXXProducer
     c) 同一个Topic只能有一个Producer,严格禁止在不同的应用或单个应用不同的package中出现相同topic的生产者。
   ☑️ 生产者与消费者共同依赖契约对象
     a) QMQ契约类为contract层。
     b) QMQ即使是只有1,2property, 也需定义一个类,走统一的对象模式。
     b) 发布Contract Jar, 提供maven依赖给消费者, 包括后续升级同步。
   ☑️ 放到独立Consumer集群。消费时,调用业务API接口进行处理。
   ☑️ 返回状态要正确。如果消费成功,那么返回成功,否则返回失败。

【5】QMQ订阅之后的处理逻辑即使非常简单, 调用链也必须是如下的统一模式, 流程或控制代码在service层,细节代码在process.SendMessageService(service层) → SendMessageProcess(process层)

【6】QMQ生产,需要注意几点:
   ☑️ 生产失败如何处理?
     a) 失败记录信息。
     b) Job补偿处理。
   ☑️ 生产Q是否需要持久化。
     a) 核心Q必须持久化。

【7】QMQ异常消费重试注意:重试分本地重试和远程重试。如果使用本地重试,一定要设置最大重试次数,防止死循环。

【8】topicConsumerGroup的长度不允许超过170

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

R的行和列命名和类型的转换

下面内容摘录自&#xff1a; 4章8节&#xff1a;用R做数据重塑&#xff0c;行列命名和数据类型转换-CSDN博客 欢迎订阅我们专栏 一、行和列命名 在数据科学和统计分析中&#xff0c;命名是组织和管理数据的一个重要部分。尤其是在处理复杂的多维数据集时&#xff0c;为行和列命…

FPGA知识基础之--FIFO ip核的使用以及实例化clocking wizard ip产生一个异步FIFO,附RTL和仿真代码

目录 一、FIFO简介1.定义2.特点3.分类4.FIFO在FPGA中的应用 二、实验任务三、FIFO IP核1.接口2.写时序3.读时序1.Standara2 .FWFT 四、vivado设置五、程序设计1.模块2.时序3.异步信号传输4.RTL代码 五、仿真1.Testbench代码2.波形 一、FIFO简介 1.定义 FIFO是一种先进先出的数…

电能表在企业能源管理中的作用

电能表在企业能源管理中扮演着至关重要的角色&#xff0c;它不仅是能源计量的基础工具&#xff0c;更是企业实现高效能源管理、降低能源成本、提高竞争力的关键所在。 一、精确计量与实时监测 电能表作为能源计量的基础工具&#xff0c;其首要作用是实现电能的精确计量。相比…

PostgreSQL 练习 ---- psql 新增连接参数

目标 添加一个连接参数&#xff0c;默认为 false 。当 psql 连接时&#xff0c;若该连接参数非 “true” 时&#xff0c;用户 “u1“ 对表对象无操作权限&#xff0c;包括自己拥有的表。 连接机制简介 连接过程如下所述&#xff1a; 客户端初始化一个空连接&#xff0c;设置…

如何高效记录并整理编程学习笔记?

一&#xff1a;简介 在编程学习的过程中&#xff0c;建立一个高效的笔记记录和整理方法确实非常重要。下面是一些方法和建议&#xff0c;帮助你打造自己的编程学习“知识宝库”。 1&#xff09;. 选择合适的工具 选择一个适合自己的笔记工具非常重要。可以考虑以下几种&#…

SB3045LFCT-ASEMI无人机专用SB3045LFCT

编辑&#xff1a;ll SB3045LFCT-ASEMI无人机专用SB3045LFCT 型号&#xff1a;SB3045LFCT 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 批号&#xff1a;最新 最大平均正向电流&#xff08;IF&#xff09;&#xff1a;30A 最大循环峰值反向电压&#xff08;VRRM&…

大模型系列8-Latex

大模型系列8-Latex 背景Latex符号符号加帽子、横线和波浪线求和连乘希腊字母等于约等于积分微分公式对齐算法矩阵 背景 目前正通过论文、博客、视频、文档等各种形式学习各种大模型知识。为了更好的记录&#xff0c;写了一些大模型的博客&#xff0c;不专业&#xff0c;只备忘…

Openlayers6 图形绘制和修改功能(结合React)

Openlayers常用的API了解的差不多了&#xff0c;就开始进入实战了&#xff0c;首先从绘制基本的图形开始&#xff0c;这里主要介绍一下绘制圆形、矩形和多边形。 通过使用openlayers的ol.interaction.Draw和ol.interaction.Modify模块实现地图上绘制圆形、矩形、多边形并修改编…

2024.8.12(LVS)

一、LVS 1、描述以及工作原理 1. 什么是LVS linux virtural server的简称,也就是linxu虚拟机服务器,这是一个由章文嵩博士发起的开源项目,官网是http://www.linuxvirtualserver.org,现在lvs已经是linux内核标准的一部分,使用lvs可以达到的技术目标是:通过linux达到负载均衡技…

mysql注入-字符编码技巧

一、环境搭建 创建数据表 CREATE TABLE mysql_Bian_Man (id int(10) unsigned NOT NULL AUTO_INCREMENT,username varchar(255) COLLATE latin1_general_ci NOT NULL,password varchar(255) COLLATE latin1_general_ci NOT NULL,PRIMARY KEY (id) ) ENGINEMyISAM AUTO_INCREME…

Python办公自动化:使用`xlutils` 修改Excel文档

在日常办公自动化中&#xff0c;除了读取Excel文件&#xff0c;我们还经常需要对文件进行修改或更新。在Python中&#xff0c;除了xlrd&#xff0c;还可以使用xlutils库来实现对Excel文件的修改操作。本文将继续以“巴黎奥运会奖牌榜.xlsx”文件为例&#xff0c;讲解如何使用xl…

OpenCV + CUDA + cuDNN模块编译

简介 在追求高端性能与资源优化并重的应用场景中&#xff0c;如边缘计算设备或资源受限的开发板上运行YOLO等复杂深度学习模型&#xff0c;采用C结合OpenCV与GPU加速技术相较于传统的Python环境展现出显著优势。这种策略不仅极大地提升了执行效率&#xff0c;还显著降低了运行时…

陶晶池串口屏数据存储区概述与使用

陶晶池串口屏的数据存储区大小&#xff1a;x系列是2k字节的&#xff0c;其他系列是1k字节的&#xff0c;超出了就会从头覆盖最先的字节 你可以在主动解析模式下调用u[x]来访问数据存储区内第x-1字节是什么&#xff0c;也可以读取usize看看记录大小 它的原理是&#xff0c;每接收…

axios 封装避免重复请求(两种)

目录 前言 Demo 第一种实现方法 第二种方法&#xff08;axios版本0.22.0以上&#xff09; 前言 在当今的前端开发领域&#xff0c;数据交互是不可或缺的一环。Axios 作为一款基于 Promise 的 HTTP 客户端&#xff0c;因其简洁的 API 和丰富的配置选项&#xff0c;深受广大…

R语言的下载和安装

R是一种强大的编程语言和环境&#xff0c;主要用于统计计算和数据分析。自从R诞生以来&#xff0c;它在统计学家和数据科学家中迅速普及。然而&#xff0c;R本身只是一个命令行工具&#xff0c;对于大多数用户来说&#xff0c;单独使用R可能会有些困难或者不方便。RStudio作为一…

科技云报道:“大模型+机器人”,具身智能将开启“智械时代”

科技云报道原创。 从15世纪达芬奇绘制出世界上第一份人形机器人手稿&#xff0c;到如今波士顿动力、本田、特斯拉、Figure AI等企业相继推出了人形机器人产品&#xff0c;机器人新物种持续衍生&#xff0c;人形机器人产业已经从萌芽概念阶段进入产业化落地前期。 近日&#x…

Golang面试题四(并发编程)

目录 1.Go常见的并发模型 2.哪些方法安全读写共享变量 3.如何排查数据竞争问题 ​4.Go有哪些同步原语 1. Mutex (互斥锁) 2. RWMutex (读写互斥锁) 3. Atomic 3.1.使用场景 3.2.整型操作 3.3.指针操作 3.4.使用示例 4. Channel 使用场景 使用示例 5. sync.WaitGr…

Java同城生鲜配送物流配送到店独立骑手端系统小程序源码

&#x1f69a;【一键解锁新鲜生活&#xff01;同城生鲜配送系统全揭秘】&#x1f966;&#x1f680; &#x1f50d; 源码揭秘&#xff1a;打造高效生鲜配送的秘密武器 &#x1f527; 想要在家就能享受超市般的生鲜盛宴吗&#xff1f;揭秘同款城生鲜配送系统的源码&#xff0c…

信号与线性系统实验一:LTI连续系统时域响应测试与分析

文章目录 一、实验目的二、实验内容与原理&#xff08;简单列了一下提纲&#xff09;第一部分&#xff1a;连续系统时域响应MATLAB仿真分析第二部分&#xff1a;连续系统时域响应Multisim电路仿真分析 三、实验器材四、实验步骤第一部分&#xff1a;连续系统时域响应MATLAB仿真…

vulnhub系列:sp eric

vulnhub系列&#xff1a;sp eric 靶机下载 一、信息收集 nmap扫描存活&#xff0c;根据mac地址寻找IP nmap 192.168.23.0/24nmap扫描端口&#xff0c;开放端口&#xff1a;22、80 nmap 192.168.23.189 -p- -A -sV -Pndirb 扫描目录&#xff0c;.git 源码&#xff0c;admin…