一套万能的异步处理方案!(珍藏版)
前言良好的系统设计必须要做到开闭原则随着业务的不断迭代更新核心代码也会被不断改动出错的概率也会大大增加。但是大部分增加的功能都是在扩展原有的功能既要保证性能又要保证质量我们往往都会使用异步线程池来处理然而却增加了很多不确定性因素。由此我设计了一套通用的异步处理SDK可以很轻松的实现各种异步处理目的通过异步处理不仅能够保证方法能够得到有效的执行而且不影响主流程更重要的是各种兜底方法保证数据不丢失从而达到最终一致性优点无侵入设计独立数据库独立定时任务独立消息队列独立人工执行界面(统一登录认证)使用spring事务事件机制即使异步策略解析失败也不会影响业务如果你的方法正在运行事务会等事务提交后或回滚后再处理事件就算事务提交了异步策略解析失败了我们还有兜底方案执行除非数据库有问题消息队列有问题方法有bug原理容器初始化bean完成后遍历所有方法把有AsyncExec注解的方法缓存起来方法运行时通过AOP切面发布事件事务事件监听处理异步执行策略TransactionalEventListener(fallbackExecution true, phase TransactionPhase.AFTER_COMPLETION)fallbackExecutiontrue没有事务正在运行依然处理事件TransactionPhase.AFTER_COMPLETION事务提交后和事务回滚后都处理事件组件kafka 消息队列xxl job 定时任务mysql 数据库spring 切面vue 界面设计模式策略模板方法动态代理流程图图片数据库脚本CREATE TABLE async_scene ( id bigint NOT NULL AUTO_INCREMENT COMMENT 主键ID, application_name varchar(100) NOT NULL DEFAULT COMMENT 应用名称, method_sign varchar(50) NOT NULL DEFAULT COMMENT 方法签名, scene_name varchar(200) NOT NULL DEFAULT COMMENT 业务场景描述, async_type varchar(50) NOT NULL DEFAULT COMMENT 异步策略类型, queue_name varchar(200) NOT NULL DEFAULT COMMENT 队列名称, theme_value varchar(100) NOT NULL DEFAULT COMMENT 消费主题, exec_count int NOT NULL DEFAULT 0 COMMENT 失败重试次数, exec_deleted int NOT NULL DEFAULT 0 COMMENT 执行后是否删除, async_version varchar(50) NOT NULL DEFAULT COMMENT 组件版本号, create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 更新时间, cdc_crt_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 记录新增时间, cdc_upd_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 记录修改时间, PRIMARY KEY (id) USING BTREE, UNIQUE KEY uk_application_sign (application_name,method_sign) USING BTREE, KEY idx_cdc_upd_time (cdc_upd_time) ) ENGINEInnoDB COMMENT异步场景表; 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 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 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 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT异步处理日志;异步策略图片安全级别图片执行状态图片流程图图片图片图片apollo 配置# 开关默认关闭 async.enabledtrue # 应用名称 spring.application.namexxx # 数据源 druid spring.datasource.driver-class-namecom.mysql.jdbc.Driver spring.datasource.urljdbc:mysql://127.0.0.1:3306/fc_async?useUnicodetruecharacterEncodingutf-8zeroDateTimeBehaviorconvertToNulluseSSLfalseallowMultiQueriestruerewriteBatchedStatementstrue spring.datasource.usernameuser spring.datasource.passwordxxxx spring.datasource.filtersconfig spring.datasource.connectionPropertiesconfig.decrypttrue;config.decrypt.keyyyy #静态地址 spring.resources.add-mappingstrue spring.resources.static-locationsclasspath:/static/ # 以下配置都有默认值 # 核心线程数 async.executor.thread.corePoolSize10 # 最大线程数 async.executor.thread.maxPoolSize50 # 队列容量 async.executor.thread.queueCapacity10000 # 活跃时间 async.executor.thread.keepAliveSeconds600 # 执行成功是否删除记录默认删除 async.exec.deletedtrue # 自定义队列名称前缀默认应用名称 async.topic${spring.application.name} # 重试执行次数默认5次 async.exec.count5 # 重试最大查询数量 async.retry.limit100 # 补偿最大查询数量 async.comp.limit100 # 登录拦截默认false async.loginfalse用法1异步开关scm.async.enabledtrue2在需要异步执行的方法加注解 必须是spring代理方法AsyncExec(type AsyncExecEnum.SAVE_ASYNC, remark 数据字典)3人工处理地址http://localhost:8004/async/index.html注意1、应用名称spring.application.name2、队列名称${async.topic:${spring.application.name}}_async_queue3、自己业务要做幂等4、一个应用公用一个队列自产自消5、定时任务异步重试定时任务2分钟重试一次可配置重试次数异步补偿定时任务一小时补偿一次创建时间在一小时之前的效果展示图片图片代码地址https://github.com/xiongyanokok/fc-async
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2468946.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!