一套万能的异步处理方案(VIP珍藏版)
大家好,我是凯哥Java(小绿泡:kaigejava)。
前言
良好的系统设计必须要做到开闭原则,随着业务的不断迭代更新,核心代码也会被不断改动,出错的概率也会大大增加。
但是大部分增加的功能都是在扩展原有的功能,既要保证性能又要保证质量,我们往往都会使用异步线程池来处理,然而却增加了很多不确定性因素。
由此我设计了一套通用的异步处理 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_scene` (
`id`bigintNOTNULL AUTO_INCREMENT COMMENT'主键ID',
`application_name`varchar(100) NOTNULLDEFAULT''COMMENT'应用名称',
`method_sign`varchar(50) NOTNULLDEFAULT''COMMENT'方法签名',
`scene_name`varchar(200) NOTNULLDEFAULT''COMMENT'业务场景描
原创不易,完成人机校验,阅读全文