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

代码规范 —— QMQ 开发规范

优质博文: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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 设计模式之拦截器模式
  • 前置(3):npm 和npx异同点
  • Layout 布局组件快速搭建
  • package-lock.json 要提交到git吗?
  • string详解(1)
  • 8.7笔记
  • TTL缓存用户数据
  • 基于paddlehub 未戴口罩检测算法
  • Python绘图入门:使用 Matplotlib 绘制折线图
  • MySQL 的 InnoDB 缓冲池里有什么?--InnoDB存储梳理(二)
  • 2024 年最佳 7 款 Java 分析器工具
  • Linux驱动入门实验班——基础驱动模板(附百问网视频链接)
  • MongoDB | MongoDB 终端查询
  • 详细分析Python链接Oracle的多种方式(附Demo)
  • “从头开始训练模型,几乎没有意义”
  • python3.6+scrapy+mysql 爬虫实战
  • 【css3】浏览器内核及其兼容性
  • 5、React组件事件详解
  • create-react-app项目添加less配置
  • CSS3 变换
  • egg(89)--egg之redis的发布和订阅
  • es的写入过程
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • React+TypeScript入门
  • Vim 折腾记
  • 阿里云前端周刊 - 第 26 期
  • 初识 webpack
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 诡异!React stopPropagation失灵
  • 基于webpack 的 vue 多页架构
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 微服务入门【系列视频课程】
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 掌握面试——弹出框的实现(一道题中包含布局/js设计模式)
  • 正则学习笔记
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​业务双活的数据切换思路设计(下)
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #pragam once 和 #ifndef 预编译头
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (编译到47%失败)to be deleted
  • (二)原生js案例之数码时钟计时
  • (六)vue-router+UI组件库
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (转)程序员疫苗:代码注入
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .Net 路由处理厉害了
  • .NET6 命令行启动及发布单个Exe文件
  • .Net插件开发开源框架
  • .net知识和学习方法系列(二十一)CLR-枚举