统一消息分发中心设计
背景
我们核心业务中订单完成时,需要完成后续的连带业务,扣件库存库存、增加积分、通知商家等。
如下图的架构:

这样设计出来导致我们的核心业务和其他业务耦合,每次新增连带业务或者去掉连带业务都需要修改核心业务。
一方面,不合符软件设计的OCP原则;二方面,修改核心业务风险、成本也是很大的。
方案
基于上述方案的问题,我们设计了新的方案。新的方案,可以动态接入新的连带业务,不会入侵核心业务,降低了变动的风险和成本。

1. 订单下发统一的ORDER_CREATED事件消息;
消息格式如下:
{
"enterEvent":"ORDER_CREATED",
"data":{
"order_id":"OR2023111000000001"
},
"source":"ORDER",
"datetime":"2023-11-10 21:40:52"
}
2. 所有核心业务发送到MQ的消息,统一发送到分发中心DISPATCHER_CENTER。
消息统一中心获取配置的路由信息,将消息发送到MQ。
*** @author darmi*/
@Component
public class KafkaEventListener {@Autowiredprivate MsgDispatcherCenterRepository msgDispatcherCenterRepository;@Autowiredprivate KafkaTemplate<String, String> kafkaTemplate;@Autowired@Qualifier(value = "eventExecutor")private Executor eventExecutor;@KafkaListener(topics = {"DISPATCHER_CENTER"})public void dispatchMsg(String event) {DispatcherCenterEvent dispatcherCenterEvent = DispatcherCenterEvent.getObject(event);eventExecutor.execute(() ->{msgDispatcherCenterRepository.findMsgDispatcherCenterByCenterEventAndActive(dispatcherCenterEvent.getCenterEvent(), Boolean.TRUE).forEach(e -> kafkaTemplate.send(e.getRouteEvent(), dispatcherCenterEvent.getData()));});}}
Mysql的消息路由表设计如下:
CREATE TABLE `tb_msg_dispatcher_ center` (`id` int NOT NULL AUTO_INCREMENT,`center_event` varchar(255) NOT NULL,`route_event` varchar(255) NOT NULL,`active` tinyint NOT NULL DEFAULT '0',`created` timestamp NOT NULL,`updated` timestamp NOT NULL,PRIMARY KEY (`id`),KEY `idx_center_event_active` (`center_event`,`active`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

3. 各个业务监听消息,处理自己的业务。
@KafkaListener(topics = {"ADD_POINT"})public void addPoint(String event) {// 添加积分}@KafkaListener(topics = {"REDUCE_STOCK"})public void reduceStock(String event) {// 扣件库存}@KafkaListener(topics = {"NOTICE_MERCHANT"})public void noticeMerchant(String event) {// 通知商家}
总结
这个方案是一个简易可行的方案,符合快速上手并实施。在人力、时间、成本不充足的情况下,基本能满足我们的需求。
如果想让它作为平台级的技术组件推广,还有一些细节的点可以优化。
- 核心的业务是否也可以分离出来,通过平台配置的方式自动分发数据到消息中心。
- 消息中心每次都会从数据库拉去路由表信息,这样性能不好,可以放在分布式缓存或本地内存。这时需要注意缓存数据的一致性问题。
- 分发中心是否存在性能瓶颈、集群化等。
- 连带业务是否也可以通过配置,自动拉取MQ的消息。
相关文章:
统一消息分发中心设计
背景 我们核心业务中订单完成时,需要完成后续的连带业务,扣件库存库存、增加积分、通知商家等。 如下图的架构: 这样设计出来导致我们的核心业务和其他业务耦合,每次新增连带业务或者去掉连带业务都需要修改核心业务。 一方面&…...
前端项目导入vue和element
1.安装nodejs 下载链接https://cdn.npmmirror.com/binaries/node/v18.18.0/node-v18.18.0-x64.msi 进入cmd 命令行模式 管理员身份运行 输入 (node -v)能看到版本号 npm config set prefix "C:\Program Files\nodejs" 默认路径 npm config…...
【11】使用透视投影建立一个3D空间的测试
核心操作: 1.proj view model 这三个矩阵 glm::mat4 mvp m_Proj * m_View * model; m_Shader->Bind(); m_Shader->SetUniformMat4f("u_MVP", mvp);着色器里面就: proj:投影矩阵,可以选择正交投影,或者透视投影…...
【广州华锐互动】VR影视制片虚拟仿真教学系统
随着虚拟现实(VR)技术的不断发展,VR在影视制片教学中的应用场景也变得越来越丰富。本文将介绍VR在影视制片教学中的常见应用场景及其意义,并通过案例分析来更好地展示其应用前景。 在影视制片教学中,VR可以提供一种沉浸式的制作体验。其中&am…...
从研发域到量产域的自动驾驶工具链探索与实践
导读 本文整理自 2023 年 9 月 5 日百度云智大会 - 智能汽车分论坛,百度智能云自动驾驶云研发高级经理徐鹏的主题演讲《从研发域到量产域的自动驾驶工具链探索与实践》。 全文中部段落附有演讲中 2 个产品演示视频的完整版,精彩不容错过。 (视频观看&…...
404. 左叶子之和
原题链接:404. 左叶子之和 思路: 首先要注意是判断左叶子,不是二叉树左侧节点,所以不要上来想着层序遍历。 节点A的左孩子不为空,且左孩子的左右孩子都为空(说明是叶子节点),那么A节…...
基于SSM的课程管理系统
末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…...
【hcie-cloud】【5】华为云Stack规划设计之华为云Stack标准化配置、缩略语【下】
文章目录 前言、华为云Stack交付综述为云Stack标准组网华为云Stack标准化配置华为云Stack配置概览华为云Stack云服务全视图华为云Stack部署方案节点类型说明华为云Stack云服务组件部署场景管理节点部署原则云平台管理规格华为云Stack IaaS场景&高阶场景起步必选部署组件x86…...
搭建自己的MQTT服务器,实现设备上云(Ubuntu+EMQX)
一、EMQX介绍 这篇文章教大家在ECS云服务器上部署EMQX,搭建自己私有的MQTT服务器,配置EMQX实现设备上云,设备数据转发,存储;服务器我采用的华为云的ECS服务器,系统选择Ubuntu系统。 Windows版本的看这里: https://blog.csdn.net/xiaolong1126626497/article/details/1…...
web3案例中解决交易所中 ETH与token都是0问题 并帮助确认展示是否成功
可能写了这么久 很多人会发现一个问 我们前面的案例 个人在交易所中的 自定义token 和 ETH 一直是放了个0 大家也不太敢确认是否真的有效 那么 很简单 我们操作 存入一些进交易所 不就ok了 我们 来看之前交易所写的代码 我们写了 depositEther 存入 ETH 和 depositToken 存入…...
unreal engine oculus 在vr场景中fade in , fade out
https://www.youtube.com/watch?vxRA7hRiXwuA...
0. 前言与大纲
机器学习面试题汇总与解析——前言与大纲 故事引入专栏介绍作者介绍大纲 受众:本教程适合于Python已经入门的学生或人士,有一定的编程基础。 本教程适合于算法工程师、机器学习求职的学生或人士。 故事引入 蒋 豆 芽:老李,我们…...
家乡特色饮食体验系统的设计与实现-计算机毕设 附源码 27533
家乡特色饮食体验系统的设计与实现 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对家乡特色…...
本地数据库迁移到云端服务器
工具迁移xtrabackup 创建云服务器——通过云服务器提供的公网地址远程连接XShell——利用迁移工具将数据库从本地迁移到云服务器 (1)创建云服务器 (2)远程连接XShell (3)yum安装mysql (4&…...
SpringCloudGateway--Sentinel限流、熔断降级
目录 一、概览 二、安装Sentinel 三、微服务整合sentinel 四、限流 1、流控模式 ①直接 ②关联 ③链路 2、流控效果 ①快速失败 ②Warm Up ③排队等待 五、熔断降级 1、慢调用比例 2、异常比例 3、异常数 一、概览 SpringCloudGateway是一个基于SpringBoot2.x的…...
ARMday02(汇编语法、汇编指令)
汇编语法 汇编文件中的内容 1.伪操作:在汇编程序中不占用存储空间,但是可以在程序编译时起到引导和标识作用 .text .global .glbal .if .else .endif .data .word.... 2.汇编指令:每一条汇编指令都用来标识一个机器码,让计算机做…...
docker容器中运行jar 出现invalid or corrupt jarfile
1,背景: 在本地java开发完毕之后,想要打包成docker镜像,方便安装。由于本地没有docker环境,也懒得装了。有一台测试的linux机器可以使用,所以先在本地打包生成xxx.jar,然后拷贝到有docker环境的…...
PHP+MySQL人才招聘小程序系统源码 带完整前端+后端搭建教程
在当今竞争激烈的人才市场中,招聘平台的需求日益增长。传统的招聘平台往往需要投入大量的人力物力进行维护和管理,这对于许多中小企业来说是一个沉重的负担。因此,开发一个简单易用、高效便捷的招聘平台显得尤为重要。 PHP是一种流行的服务器…...
MongoDB常用的语句
mongodb 可视化工具: Robo3T。 DataGrip,对mongodb的日期格式不友好。 MongoDB常用的语句: 注意,凡是涉及到日期类型的,最好都用这种格式 ISODate(“2023-03-27T16:00:00.000Z”) MongoDB倒序,查询&am…...
MIPSsim模拟器 使用说明
(一) 启动模拟器 双击MIPSsim.exe,即可启动该模拟器。模拟器启动时,自动将自己初始化为默认状态。所设置的默认值为: u所有通用寄存器和浮点寄存器为全0; u内存清零; u流水寄存器为全0ÿ…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
