一套万能通用的异步处理方案
前言

目标
长处
原理
组件
设计模式
流程图
数据库剧本
异步策略
平安级别
执行状况
流程图
apollo 设置装备摆设
用法
注意
后果展现
github地址
1前言
优越的体系设计必需要做到开闭原则,跟着营业的赓续迭代更新,焦点代码也会被赓续修改,失足的概率也会年夜年夜增长。然则年夜部门增长的功效都是在扩大原有的功效,既要保证机能又要保证质量,我们每每都邑使用异步线程池来处置,然而却增长了许多不肯定性因素。
由此我设计了一套通用的异步处置SDK,可以很轻松的实现各类异步处置2目标
经由过程异步处置不仅可以或许保证办法可以或许获得有用的执行并且不影响主流程
更紧张的是各类兜底办法保证数据不丧失,从而到达终极同等性
3长处
无侵入设计,自力数据库,自力准时义务,自力新闻行列步队,自力人工执行界面(同一登录认证)
使用spring事务变乱机制,纵然异步策略解析失败也不会影响营业
假如你的办法正在运行事务,会等事务提交后或回滚后再处置变乱
就算事务提交了,异步策略解析失败了,我们还有兜底计划执行(除非数据库有问题,新闻行列步队有问题,办法有bug)
4原理
容器初始化bean完成后遍历所有办法,把有@AsyncExec表明的办法缓存起来
办法运行时经由过程AOP切面宣布变乱
事务变乱监听处置异步执行策略
@TransactionalEventListener(fallbackExecution = true, phase = TransactionPhase.AFTER_COMPLETION)
fallbackExecution=true
没有事务正在运行,依然处置变乱
TransactionPhase.AFTER_COMPLETION
事务提交后和事务回滚后都处置变乱
5组件
kafka 新闻行列步队
xxl job 准时义务
mysql 数据库
spring 切面
vue 界面
6设计模式
策略
模板办法
动态署理
7流程图8数据库剧本
CREATE TABLE `async_req` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`application_name` varchar(100) NOT NULL DEFAULT '' COMMENT '利用名称',
`sign` varchar(50) NOT NULL DEFAULT '' COMMENT '办法署名',
`class_name` varchar(200) NOT NULL DEFAULT '' COMMENT '全路径类名称',
`method_name` varchar(100) NOT NULL DEFAULT '' COMMENT '办法名称',
`async_type` varchar(50) NOT NULL DEFAULT '' COMMENT '异步策略类型',
`exec_status` tinyint NOT NULL DEFAULT '0' COMMENT '执行状况 0:初始化 1:执行失败 2:执行胜利',
`exec_count` int NOT NULL DEFAULT '0' COMMENT '执行次数',
`param_json` longtext COMMENT '哀求参数',
`remark` varchar(200) NOT NULL DEFAULT '' COMMENT '营业描写',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创立光阴',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新光阴',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_applocation_name` (`application_name`) USING BTREE,
KEY `idx_exec_status` (`exec_status`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='异步处置哀求';
CREATE TABLE `async_log` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`async_id` bigint NOT NULL DEFAULT '0' COMMENT '异步哀求ID',
`error_data` longtext COMMENT '执行差错信息',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创立光阴',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_async_id` (`async_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='异步处置日记';
9异步策略
10平安级别11执行状况12流程图
13apollo 设置装备摆设
# 开关:默认封闭
async.enabled=true
# 利用名称
spring.application.name=xxx
# 数据源 druid
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/fc_async?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true
spring.datasource.username=user
spring.datasource.password=xxxx
spring.datasource.filters=config
spring.datasource.connectionProperties=config.decrypt=true;config.decrypt.key=yyy
#静态地址
spring.resources.add-mappings=true
spring.resources.static-locations=classpath:/static/
# 以下设置装备摆设都有默认值
# 焦点线程数
async.executor.thread.corePoolSize=10
# 最年夜线程数
async.executor.thread.maxPoolSize=50
# 行列步队容量
async.executor.thread.queueCapacity=10000
# 活跃光阴
async.executor.thread.keepAliveSeconds=600
# 执行胜利是否删除记载:默认删除
async.exec.deleted=true
# 自界说行列步队名称前缀:默认利用名称
async.topic=${spring.application.name}
# 重试执行次数:默认5次
async.exec.count=5
# 重试最年夜查询数目
async.retry.limit=100
# 赔偿最年夜查询数目
async.comp.limit=100
# 登录拦阻:默认false
async.login=false
14用法
1,异步开关
scm.async.enabled=true
2,在必要异步执行的办法加表明 (必需是spring署理办法)
@AsyncExec(type = AsyncExecEnum.SAVE_ASYNC, remark = "大众数据字典公众)
3,人工处置地址
http://localhost:8004/async/index.html15注意
1,利用名称
spring.application.name
2,行列步队名称
${async.topic:${spring.application.name}}_async_queue
自界说topic:async.topic=xxx
3,本身营业要做幂等
4,一个利用公用一个行列步队
自产自消
5,准时义务
异步重试准时义务(2分钟重试一次,可设置装备摆设重试次数)
异步赔偿准时义务(一小时赔偿一次,创立光阴在一小时之前的)
16后果展现17github地址
https://github.com/xiongyanokok/fc-async.git
IT架构师/技术年夜咖的交流圈子,为您提供架构系统常识、技术文章、流行实践案例、办理计划等,行业年夜咖分享交流/同业履历分享互动,等待你的参加!扫码即可参加哦,跟着资料赓续增多社群会不按期涨价早参加更优惠
免责声明:
本"号部门分享的材料来自收集网络和整顿,所有笔墨和图片版权归属于原作者所有,且仅代表作者小我概念,与本"号无关,文章仅供读者进修交流使用,并请自行核实相关内容,如文章内容涉及侵权,请接洽后台治理员删除。