首页 > 其他分享 >异步处理方案

异步处理方案

时间:2024-09-23 10:21:34浏览次数:9  
标签:COMMENT 异步 方案 处理 spring DEFAULT async NULL

前言

良好的系统设计必须要做到开闭原则,随着业务的不断迭代更新,核心代码也会被不断改动,出错的概率也会大大增加。但是大部分增加的功能都是在扩展原有的功能,既要保证性能又要保证质量,我们往往都会使用异步线程池来处理,然而却增加了很多不确定性因素。由此我设计了一套通用的异步处理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` 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`)
) ENGINE=InnoDB 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
) 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='异步处理日志';

异步策略

异步处理方案_spring_02

图片

安全级别

异步处理方案_应用名称_03

图片

执行状态

异步处理方案_应用名称_04

图片

流程图

异步处理方案_spring_05

图片

异步处理方案_定时任务_06

图片

异步处理方案_应用名称_07

图片

apollo 配置

# 开关:默认关闭
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.cnotallow=config.decrypt=true;config.decrypt.key=yyy
#静态地址
spring.resources.add-mappings=true
spring.resources.static-locatinotallow=classpath:/static/


# 以下配置都有默认值
# 核心线程数
async.executor.thread.corePoolSize=10
# 最大线程数
async.executor.thread.maxPoolSize=50
# 队列容量
async.executor.thread.queueCapacity=10000
# 活跃时间
async.executor.thread.keepAliveSecnotallow=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

用法

1,异步开关

scm.async.enabled=true

2,在需要异步执行的方法加注解 (必须是spring代理方法)

@AsyncExec(type = AsyncExecEnum.SAVE_ASYNC, remark = "数据字典")

3,人工处理地址

注意

1、应用名称

spring.application.name

2、队列名称

${async.topic:${spring.application.name}}_async_queue

3、自己业务要做幂等

4、一个应用公用一个队列

自产自消

5、定时任务

  • 异步重试定时任务(2分钟重试一次,可配置重试次数)
  • 异步补偿定时任务(一小时补偿一次,创建时间在一小时之前的)

效果展示

异步处理方案_定时任务_08


异步处理方案_应用名称_09

标签:COMMENT,异步,方案,处理,spring,DEFAULT,async,NULL
From: https://blog.51cto.com/maguobin/12087358

相关文章

  • Fes.js :一个基于 Vue 3 好用的前端应用解决方案,开源且免费!
    在前端开发的世界中,如何快速且高效地构建应用程序,常常成为开发者的核心挑战。构建一个完整的前端项目,需要从零开始搭建开发环境、封装API请求、配置路由、处理权限管理等,这无疑是一项繁琐的任务。......
  • 深度解析APS系统异常预警处理:从识别到解决的全流程策略
    订单发生变更当企业接收到产品加工订单发生变更的通知时,立即启动快速响应机制。包括指派专人负责跟进此事,并确保该信息能够迅速传递到所有相关部门和人员。同时,直接访问APS(高级计划与排程)系统,准备对受影响的订单进行详细审查。1.确认变更在APS系统中,详细检查发生变更的订单信......
  • 缓存写入失败的解决方案
    缓存写入失败通常是因为磁盘空间不足或目录权限设置不当。以下是一些具体的解决方案:1.检查磁盘空间1.1检查磁盘空间是否已满使用命令行检查:使用命令行工具检查磁盘空间是否已满。sh df-h输出示例:  FilesystemSizeUsedAvailUse%Mountedon/d......
  • 【解决方案】Java 互联网项目中常见的 Redis 缓存应用场景
    目录前言一、常见key-value二、时效性强三、计数器相关四、高实时性五、排行榜系列六、文章小结前言在笔者3年的Java一线开发经历中,尤其是一些移动端、用户量大的互联网项目,经常会使用到Redis作为缓存中间件的基本工具来解决一些特定的问题。下面是笔者总结梳理的一些常......
  • AI工人操作行为流程规范识别方案 YOLOv7
    AI工人操作行为流程规范识别系统利用高清监控摄像头覆盖现场作业区域,AI工人操作行为流程规范识别系统通过图像识别和深度学习技术对作业人员的操作行为进行实时分析。AI工人操作行为流程规范识别系统能够准确识别工人的操作行为是否符合作业标准规定的流程和合规SOP,并根据设定......
  • 图像处理基础知识点简记
    简单记录一下图像处理的基础知识点一、取样1、释义图像的取样就是图像在空间上的离散化处理,即使空间上连续变化的图像离散化,决定了图像的空间分辨率。2、过程简单描述一下图象取样的基本过程,首先用一个网格把待处理的图像覆盖,然后把每一小格上模拟图像的各个亮度取平均......
  • [OpenCV] 数字图像处理 C++ 学习——16直方图均衡化、直方图比较 详细讲解+附完整代码
    文章目录前言1.直方图均衡化的理论基础(1)什么是直方图(2)直方图均衡化原理(3)直方图均衡化公式2.直方图比较理论基础(1)相关性(Correlation)——HISTCMP_CORREL(2)卡方(Chi-Square)——HISTCMP_CHISQR(3)十字交叉性(Intersection)——HISTCMP_INTERSECT(4)巴氏距离......
  • Spring Cloud Gateway CORS 方案
    SpringCloudGatewayCORS(跨域资源共享)方案主要涉及在网关层面配置CORS策略,以允许前端应用跨域访问后端服务。以下是一个详细的CORS配置方案,包括配置文件(如application.yml)和Java代码配置两种方式。一、配置文件方式(application.yml)在SpringCloudGateway项目中,通常可以通过编辑a......
  • 面试-JS异步进阶
    面试题:......
  • 数据处理与统计分析篇-day08-apply()自定义函数与分组操作
    一.自定义函数概述当Pandas自带的API不能满足需求,例如:我们需要遍历的对Series中的每一条数据/DataFrame中的一列或一行数据做相同的自定义处理,就可以使用Apply自定义函数apply函数可以接收一个自定义函数,可以将Series对象的逐个值或DataFrame的行/列数据传递给自......