Common-Async-Data-Handle
前言
良好的系统设计必须要做到开闭原则,随着业务的不断迭代更新,核心代码也会被不断改动,出错的概率也会大大增加。但是大部分增加的功 能都是在扩展原有的功能,既要保证性能又要保证质量,我们往往都会使用异步线程池来处理,然而却增加了很多不确定性因素。 由此我设计了一套通用的异步处理SDK,可以很轻松的实现各种异步处理
目的
通过异步处理不仅能够保证方法能够得到有效的执行而且不影响主流程 更重要的是各种兜底方法保证数据不丢失,从而达到最终一致性
优点
无侵入设计,独立数据库,独立定时任务,独立消息队列,独立人工执行界面(统一登录认证) 使用spring事务事件机制,即使异步策略解析失败也不会影响业务 如果你的方法正在运行事务,会等事务提交后或回滚后再处理事件 就算事务提交了,异步策略解析失败了,我们还有兜底方案执行(除非数据库有问题,消息队列有问题,方法有bug)
原理
- 容器初始化bean完成后遍历所有方法,把有
@AsyncExec注解的方法缓存起来 - 方法运行时通过AOP切面发布事件
- 事务事件监听处理异步执行策略
@TransactionalEventListener(fallbackExecution = true, phase = TransactionPhase.AFTER_COMPLETION)
fallbackExecution=true没有事务正在运行,依然处理事件TransactionPhase.AFTER_COMPLETION事务提交后和事务回滚后都处理事件
组件
- kafka 消息队列
- xxl job 定时任务
- mysql 数据库
- spring 切面
- vue 界面
设计模式
- 策略
- 模板方法
- 动态代理
流程图
数据库脚本
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 '