代码规范 —— 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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win系统下使用Docker安装RabbitMQ及延迟插件

Win系统下使用Docker安装RabbitMQ及延迟插件 docker 安装 rabbitmq docker pull rabbitmq:3.12.0-management运行 docker run -d --namerabbitmq --restartalways -p 5672:5672 -p 15672:15672 rabbitmq:3.12.0-management 访问 访问 http://localhost:15672/&#xff0c;…

Docker如何删除没有名字或标签的镜像

如下图,这些没有名字和标签的镜像如何删除呢?下面提供删除方法。 1、找出所有没有名字的镜像 docker images -f "dangling=true"2、删除所有没有名字的镜像 当然,你也可以通过镜像的ID去删除它。 docker rmi -f $(docker images -f "dangli

在远程服务器上创建git仓库并ssh连接到github进行管理

1.生成SSH 公钥&#xff0c;keygen放在.ssh中 2.添加公钥到github 3.确保 SSH 密钥被加载到 SSH 代理中 使用 ssh-add 命令将密钥添加到 SSH 代理中&#xff1a; eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_rsa 检查 SSH 代理中是否列出了密钥&#xff1a; ssh-ad…

MySQL运维-分库分表

介绍 问题分析 拆分策略 垂直拆分 水平拆分 实现技术 Mycat概述 介绍 概念介绍 Mycat配置 schema.xml schema标签 schema标签&#xff08;table&#xff09; datanode标签 datahost标签 rule.xml sever.xml system标签 user标签 Mycat分片 分片规则-范围 分片规则-取模 分…

LVS多模式集群攻略!

目录 NAT模式下的lvs集群准备工作具体步骤客户机lvs服务器1服务器2 测试 DR模式下的lvs集群具体流程客户机&#xff1a;路由器LVS服务器1服务器2测试 防火墙标签解决轮询问题LVS持久链接解决方案 NAT模式下的lvs集群 lvs-nat概念&#xff1a;修改请求报文的目标IP,多目标IP的D…

关于RCE

什么是RCE&#xff1f; RCE漏洞&#xff0c;可以让攻击者直接向后台服务器远程注入操作系统命令或者代码&#xff0c;从而控制后台系统。也就是远程命令执行。命令执行是在目标服务器上任意执行系统命令。它属于高危漏洞之一&#xff0c;也属于代码执行的范畴。命令执行漏洞与…

红外遥控与NEC协议详解

文章目录 红外遥控的基本原理发射装置红外接收器 NEC协议的基础知识编码格式什么是“连发码”&#xff1f;NEC协议中的连发码连发码的工作原理 红外遥控的基本原理 红外遥控器通过发射红外光来传输信息&#xff0c;这种光线在肉眼不可见&#xff0c;但可以被接收设备上的红外接…

Linux 下的进程状态

文章目录 一、运行状态运行队列运行状态和运行队列 二、睡眠状态S状态D状态D状态产生的原因 三、暂停状态T状态t 状态 四、僵尸状态为什么有僵尸状态孤儿进程 一、运行状态 R状态&#xff1a;进程已经准备好随时被调度了。 运行队列 每个 CPU 都会维护一个自己的运行队列&am…

【鸿蒙开发基础学习】组件导航 (Navigation)

组件导航 (Navigation) Navigation 是路由容器组件&#xff0c;一般作为首页的根容器&#xff0c;包括单栏(Stack)、分栏(Split)和自适应(Auto)三种显示模式。Navigation 组件适用于模块内和跨模块的路由切换&#xff0c;一次开发&#xff0c;多端部署场景。通过组件级路由能力…

[CSCCTF 2019 Qual]FlaskLight (jinja2模版注入)

两种方法&#xff1a; 1.工具法 进来看见flask到处飘&#xff0c;估计就是ssti ctrlU打开发现两行注释提示GET方式传递参数search 这种有参数的我先直接丢fengjing扫了一下&#xff0c;结果还真搞出来&#xff0c;这工具还是挺牛的&#xff0c;就是没参数的时候搞不了 fengj…

牛客周赛 Round 55 解题报告 | 珂学家

前言 题解 补题这场比赛&#xff0c;好像还是难。 A. 小红的字符串 签到题 枚举最终的字符&#xff0c;求最小的修改 这个方法更有通用性 s input()from math import inf import stringans inf for c in string.ascii_letters:ans min(ans, sum([1 for z in s if z ! c…

【Datawhale X 魔搭 】AI夏令营第四期大模型方向,Task1:智能编程助手(持续更新)

在一个数据驱动的世界里&#xff0c;人工智能的未来应由每一个愿意学习和探索的人共同塑造和掌握。希望这里是你实现AI梦想的起点。 大模型小白入门&#xff1a;https://linklearner.com/activity/14/11/25 大模型开发工程师能力测试&#xff1a;https://linklearner.com/activ…

【前端可视化】 大屏可视化项目二 scale适配方案 g6流程图 更复杂的图表

项目介绍 第二个大屏可视化&#xff0c;整个项目利用scale进行按比例适配。 图表更加复杂&#xff0c;涉及到图表的叠加&#xff0c;mark&#xff0c;地图&#xff0c;g6流程图的能等 始终保持比例适配(本项目方案),始终满屏适配(项目一). echarts绘制较为复杂图表&#xff0…

mysql导入jdbc

每次创建项目都要导入jar包 版本对应 mysql是5xxjdbc也用5xx 下载jdbc.jar包 maven仓库搜索mysql&#xff1a;maven官网 导入jar包 创建lib目录&#xff0c;复制jar包&#xff0c;粘贴到lib当中 导入成功

Android Basis - 密钥和ID认证

书读百遍其义自现&#xff0c;知识点多复习&#xff0c;看到的越多&#xff0c;理解的也越是深刻。也许此时我看到的点是点&#xff0c;十天半个月之后回头看时可能就是新的点或者线了&#xff0c;写博客也是&#xff0c;越写越深刻。 遇到KeyAttestation在gms中的错误 在cts…

Nest.js 实战 (八):基于 JWT 的路由身份认证鉴权

身份验证 身份认证是大多数应用程序的重要组成部分&#xff0c;有很多不同的方法和策略来处理身份认证。 当前比较流程的是JWT 认证&#xff0c;也叫令牌认证&#xff0c;今天我们探讨一下在 Nest.js 中如何实现。 认证流程 客户端将首先使用用户名和密码进行身份认证认证成…

Sql与Rce注入相关漏洞复现

目录 sqli-labs注入第38&#xff0c;48关 第38关&#xff08;单引号闭合&#xff09; ​编辑 第48关 (GET请求-基于错误-盲注-数字型-order by 排序 ​编辑 贷齐乐系统多处Sql注入漏洞 环境搭建 将贷齐乐源码放入phpstudy中的www目录下 在phpstudy上创建网站&#xff1…

ESP8266与阿里云物联网平台连接

前言 最近折腾项目&#xff0c;需要用到ESP8266模块对接阿里云物联网平台&#xff0c;网上感觉十分完善的教程少了一点点&#xff0c;比较折腾我哈哈哈&#xff0c;所以打算自己写一篇。 材料准备 1、ESP8266 WiFi模块 数据线 网上随便买一个就好&#xff0c;十块钱左右一个…

C# winform 三层架构增删改查,(删除篇)

一.留言 C# wnform 三层架构增删改查&#xff0c;本篇是增删改查是删除篇&#xff0c;也就增删改查外加一个登录更新完&#xff0c;后续考虑出一个增删改查就是不用三层架构&#xff0c;在uI里面 直接写完&#xff0c;并且放一个帮助类&#xff0c;基本十分钟可以写完一套增删…

数据保存--总结

目录 Excel Excel--openpyxl mysql Excel Excel--openpyxl ... mysql