一致性框架设计方案

补充组件依赖

前言
对于供应链业务,一般对数据一致性要求高。且由于业务复杂,可能会存在一个业务功能触发几个异步操作的场景,且要保证相关操作同时触发或不触发。
为了降低技术设计难度、代码编写难度,特意设计最终一致性框架,将复杂度转移到底层组件,释放业务层设计难度,提高一致性,减少线上问题。

需求分析

应用场景

  1. 供应链复杂业务,需要确保 MQ、数据库事务的一致性,但是不希望在业务层过多设计
  2. 供应链复杂业务,发送多个 MQ 消息,且要保证这些 MySQL事务、MQ 同时成功或失败
  3. 对于C端商城业务,此中间件作为选项。如果不采用这套方案,需要为具体的业务场景设计最终一致性方案
  4. 主要针对功能:异步类型功能,例如:MQ、异步任务等

原理

  1. 原理:基于 MySQL 事务,将异步功能,先转换为一行数据存储到 MySQL。存储后再用异步线程执行任务。同时,设置有后台定时任务对任务表进行轮询补偿。

功能
2. 管理后台:拥有在管理后台,查询相关接口并进行重试的能力
3. 监控:监控执行的相关性能:生成任务的速率、异步线程消费任务的速率、定时任务消费任务的速率

组件依赖

  1. xx-mybatis-plus-starter
    a. 依赖 xx mysql 规范,使用基础组件的 orm starter
  2. xx-threadpool-starter
  3. xx-redis-starter
  4. xx-rocketmq-starter
  5. xx-actuator-starter
  6. promethues
    a. 需要对相关指标做监控

使用注意事项

  1. 对使用的需求:上述执行的任务,要是幂等的。在MQ层面,要求MQ消费者幂等;在异步任务层,要求异步任务是幂等的

概要设计
功能交互

在这里插入图片描述
后台管理功能

  1. 管理列表
  2. 重试单个失败任务
  3. 批量重试失败任务

详细设计

API接口设计

  1. 管理列表
    接口说明 列表分页查询
    分页方式:使用{@link ConsistencyListDto#getStartId()}(默认为0)作为起始ID进行查询,返回size大小的数据。
    前端点「下一页」时需要将当前页最大的id赋值给startId作为参数传递
    todo 不能返回上一页,或前端记录上一页的startId??
    排序:默认使用主键排序,不支持自定义
    {@link ConsistencyListDto#getSize()}为必填,最大限制50
    接口地址 /consistency/getByPage
    入参 com.xx.support.consistency.core.entity.dto.ConsistencyListDto
    出参 com.xx.support.consistency.core.entity.vo.ConsistencyVo
  2. 手动重试已失败的任务
    接口说明 单个失败任务重试
    执行方式:立即执行任务
    接口地址 /consistency/retryFailedTaskById
    入参 com.xx.support.consistency.core.entity.dto.ConsistencyIdDto
    出参 无
  3. 手动批量重试已失败的任务
    接口说明 1. 可根据consumerBeanName进行重试
  4. 如果consumerBeanName为空则重试全部已失败的任务
    执行方式:接口操作内容为修改已失败任务的状态由FAIL改为PENDING,修改后后台定时任务会进行扫描执行这些任务
    接口地址 /consistency/retryFailedTaskAll
    入参 com.xx.support.consistency.core.entity.dto.ConsistencyBeanNameDto
    出参 无

表设计
CREATE TABLE support_consistency (
id bigint unsigned NOT NULL AUTO_INCREMENT COMMENT ‘id’,
consumer_bean_name varchar(32) NOT NULL DEFAULT ‘’ COMMENT ‘消费本地消息的bean的名称’,
consistency_state varchar(16) NOT NULL DEFAULT ‘’ COMMENT ‘消息状态’,
msg_type varchar(16) NOT NULL DEFAULT ‘’ COMMENT ‘消息类型’,
exec_count int unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘执行次数(默认为0,当消息发送一次 进行加1)’,
max_exec_count int unsigned NOT NULL DEFAULT ‘3’ COMMENT ‘最大重试次数’,
exec_priority int unsigned NOT NULL DEFAULT ‘100’ COMMENT ‘执行优先级,数字越小,优先级越高’,
expected_exec_time datetime NOT NULL DEFAULT ‘1970-01-01 00:00:00’ COMMENT ‘预期执行时间’,
latest_exec_time datetime NOT NULL DEFAULT ‘1970-01-01 00:00:00’ COMMENT ‘最后一次执行时间’,
success_time datetime NOT NULL DEFAULT ‘1970-01-01 00:00:00’ COMMENT ‘执行成功时间’,
fail_time datetime NOT NULL DEFAULT ‘1970-01-01 00:00:00’ COMMENT ‘失败时间’,
exec_user varchar(32) NOT NULL DEFAULT ‘’ COMMENT ‘执行人’,
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
create_user varchar(32) NOT NULL DEFAULT ‘’ COMMENT ‘创建人’,
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’,
update_user varchar(32) NOT NULL DEFAULT ‘’ COMMENT ‘更新人’,
del_timestamp bigint unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘是否删除(0:未删除,非0(14位时间戳):已删除)’,
version int unsigned NOT NULL DEFAULT ‘1’ COMMENT ‘版本号’,
PRIMARY KEY (id),
KEY idx_support_consistency_1 (consistency_state,msg_type,exec_priority,expected_exec_time) USING BTREE,
KEY idx_support_consistency_2 (consumer_bean_name,consistency_state) USING BTREE
) ENGINE=InnoDB COMMENT=‘一致性本地消息-主表’;

CREATE TABLE support_consistency_text (
id bigint unsigned NOT NULL AUTO_INCREMENT COMMENT ‘id’,
support_consistency_id bigint unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘主表id’,
error_msg varchar(255) NOT NULL DEFAULT ‘’ COMMENT ‘执行错误信息’,
msg_text text COMMENT ‘消息文本’,
create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
create_user varchar(32) NOT NULL DEFAULT ‘’ COMMENT ‘创建人’,
update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’,
update_user varchar(32) NOT NULL DEFAULT ‘’ COMMENT ‘更新人’,
del_timestamp bigint unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘是否删除(0:未删除,非0(14位时间戳):已删除)’,
version int unsigned NOT NULL DEFAULT ‘1’ COMMENT ‘版本号’,
PRIMARY KEY (id),
KEY idx_support_consistency_text_1 (support_consistency_id) USING BTREE
) ENGINE=InnoDB COMMENT=‘一致性本地消息-报文表’;

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

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

相关文章

ChatGPT+Ai绘图【stable-diffusion实战】

ai绘图 stable-diffusion生成【还有很大的提升空间】 提示词1 Picture a planet where every living thing is made of light. The landscapes are breathtakingly beautiful, with mountains and waterfalls made of swirling patterns of color. What kind of societies m…

程序员跳槽,要求涨薪50%过分吗?

如果问在TI行业涨工资最快的方式是什么? 回答最多的一定是:跳槽! 前段时间,知乎上这样一条帖子引发了不少IT圈子的朋友的讨论 ,有网友提问 “程序员跳槽要求涨薪50%过分吗?” 截图来源于知乎,…

摄影知识整理

目录 焦距 焦距分类 对焦 相机的MF与AF 自动对焦操作 自动对焦方式 镜头防抖 防抖模式 景深 景深的作用 影响景深的因素 景深预览 摄影三大元素 光圈 光圈的作用 光圈与景深的关系 感光度(ISO) 注意 感光度的作用 快门 B门与T门 快门速度 闪…

【SSM】SpringMVC(三:SpringMVC拦截器)

文章目录 1. 登录案例2. 拦截器2.1 应用2.2 拦截器的执行原理2.3 拦截器执行的时机2.4 拦截器的实现方法2.5 拦截器的实现步骤2.6 开发拦截器 1. 登录案例 【login.jsp】 <%--Created by IntelliJ IDEA.User: BeyongDate: 2023/4/17Time: 11:43To change this template use…

SQL的函数

文章目录 一、SQL LCASE() 函数二、SQL MID() 函数三、SQL LEN() 函数四、SQL ROUND() 函数五、SQL NOW() 函数六、SQL FORMAT() 函数总结 一、SQL LCASE() 函数 LCASE() 函数把字段的值转换为小写。 SQL LCASE() 语法 SELECT LCASE(column_name) FROM table_name;用于 SQL …

入行IC选择国企、私企还是外企?(内附各IC大厂薪资福利情况)

不少人想要转行IC&#xff0c;但不知道该如何选择公司&#xff1f;下面就来为大家盘点一下IC大厂的薪资和工作情况&#xff0c;欢迎大家在评论区补充。 一&#xff0e;老 牌 巨 头 在 IC 设计领域深耕许久&#xff0c;流程完善、技术扎实&#xff0c;公司各项制度都很完善、前…

IT知识百科:什么是暴力破解?

暴力破解是一种常见的网络安全攻击方法&#xff0c;它利用计算机程序自动尝试大量的密码组合来破解密码。这种攻击方法通常用于获取未经授权的访问权限&#xff0c;如入侵网络系统或个人账户。在本文中&#xff0c;我们将探讨暴力破解的原理、工具和防范方法。 暴力破解的原理 …

TCP/UDP协议 (详解)

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

Linux搭建SVN服务器详细教程

前言 本文讲解 Linux 系统下如何搭建 SVN 服务器&#xff0c;详细说明各配置项的功能&#xff0c;最终实现可管控多个项目的复杂配置。 SVN 是 subversion 的缩写&#xff0c;是一个开放源代码的版本控制系统&#xff0c;通过采用分支管理系统的高效管理&#xff0c;实现最终集…

HANA SDA连接外部数据库到BW的步骤

咱都知道&#xff0c;我们不能直接从BW连接到外部数据库。第一步得从HANA database通过SDA去建一个到外部DB的连接。 数据库连接好了&#xff0c;那么接下来别忘了&#xff0c;还得建一个源系统。 也就是说第一步&#xff0c;我们要用HANA SDA通过Linux ODBC driver去连接外部…

PHP快速入门05-时间日期与时区,附30个常用案例

文章目录 前言一、时间日期与时区1.1 时间与日期1.2 时区 二、 30个日期时间函数的用法示例2.1 获取当前的时间戳2.2 将时间戳格式化为日期时间2.3 获取当前的日期2.4 获取当前的时间2.5 获取当前年份2.6 获取当前月份2.7 获取当前日期的第几天2.8 计算两个日期之间的天数差2.9…

【生活工作经验 十】ChatGPT模型对话初探

最近探索了下全球大火的ChatGPT&#xff0c;想对此做个初步了解 一篇博客 当今社会&#xff0c;自然语言处理技术得到了迅速的发展&#xff0c;人工智能技术也越来越受到关注。其中&#xff0c;基于深度学习的大型语言模型&#xff0c;如GPT&#xff08;Generative Pre-train…

Java:MybatisPlus--条件构造器

1、条件构造器类别 ①wrapper&#xff1a;抽象类&#xff0c;条件类的顶层&#xff0c;提供了一些获取和判断相关的方法。 ②AbstractWrapper&#xff1a;抽象类&#xff0c;Wrapper的子类&#xff0c;提供了所有的条件相关方法。 ③AbstractLambdaWrapper&#xff1a;抽象类…

Tinymce富文本编辑器在vue项目中的使用;引入第三方插件和上传视频、图片等

先放张效果图 第一步&#xff1a;安装依赖 npm install tinymce5.0.12 第二步&#xff1a;在项目中的public文件夹中新建tinymce文件夹&#xff08;因为我的项目是脚手架创建的&#xff0c;所以公共文件夹是public&#xff09;&#xff1b;在node_modules中找到skins文件夹复制…

Java day11

第11章 在用户界面上排列组件 11.1 基本的界面布局11.1.1 布置界面11.1.2 顺序布局11.1.3 方框布局11.1.4 网格布局11.1.5 边框布局 11.2 使用多个布局管理器11.3 卡片布局11.3.1 在应用程序中使用卡片布局11.3.2 单元格内边距和面板内边距 11.1 基本的界面布局 11.1.1 布置界…

社科院与杜兰大学中外合作办学金融管理硕士项目——比起过往,前路更值得期待

当结束一天工作陷入沉思时&#xff0c;你有没有特别遗憾的事情呢&#xff0c;人生有太多的不确定性&#xff0c;比起过往&#xff0c;未知的人生更值得我们期待。与其懊恼没完成的遗憾&#xff0c;不如珍惜当下&#xff0c;努力创造未来。人生没有太晚的开始&#xff0c;在职读…

macOS设置环境变量和别名

因为我的mac所用shell是bash&#xff0c;所以本文中涉及的环境变量和别名配置均在~/.zshrc文件中,且在每次配置完成后&#xff0c;需要执行source ~/.zshrc命令使配置文件生效 环境变量 通过配置环境变量&#xff0c;我们可以将某个路径暴露到全局&#xff0c;这样可以在全局…

【C语言学习3——基本的C语言语法知识2】

C语言学习3——基本的C语言语法知识 标识符关键词什么是字面常量&#xff1f;printf函数printf函数更多用法 #include命令 标识符 在前面的代码中&#xff0c;由我们自己命名&#xff0c;用于指代某一个实体的名称&#xff0c;例如:add&#xff0c;result&#xff0c;函数的参…

android studio ImageView和ImageButton和Button

1.ImageView 1.1代码显示 ImageView img findViewById(R.id.img); img.setImageResource(R.drawable.apple); 1.2XML <ImageViewandroid:layout_width"match_parent"android:layout_height"match_parent"android:id"id/img"android:src&qu…

连接云服务器

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…