spring|复杂任务中,流程的解耦设计

spring|复杂任务中,流程的解耦设计

文章图片

spring|复杂任务中,流程的解耦设计

文章图片

spring|复杂任务中,流程的解耦设计

文章图片

spring|复杂任务中,流程的解耦设计

文章图片


\">
复杂流程 , 得一步异步地来;
一、业务场景在系统开发的过程中 , 必然存在耗时极高的动作 , 是基于请求响应模式无法解决的问题 , 通常会采用解耦的思维 , 并基于异步或者事件驱动的方式去调度整个流程的完整执行;
文件任务:在系统解析大文件数据时 , 在获取任务之后 , 会异步处理后续文件读写流程;
中间表:执行复杂场景的数据分析时 , 收集完待分析的对象之后 , 会并发执行各个维度的采集动作 , 并依次将数据写入临时的中间表中 , 方便数据查询动作;
在上述场景中 , 基于单次请求响应无法执行整个过程 , 必须对流程分段分步和异步推进 , 在流程中根据场景去判断 , 是异步有序驱动 , 还是异步并发处理 , 并基于各个节点的执行状态判断动作是否成功 。
二、任务管理复杂任务的执行周期相对偏长 , 要确保稳定的执行则需要对任务做精细的设计和管理 , 通常会基于如下几个因素去描述任务:

  • 场景:定义任务的主题场景 , 便于将多种任务做统一管理和调度 , 例如:文件、数据、报表等;
  • 计划:对任务做好步骤的拆分 , 并制定和推进相应的执行计划 , 例如:有序调度、并发执行等;
  • 状态:针对任务和节点的执行计划 , 都要提供细节的状态定义 , 例如:开始/结束 , 进行中/已完成 , 成功/失败等;
设计合理的任务结构 , 以便更高效地管理流程 , 根据主题场景做任务分类 , 添加相应的执行计划 , 根据状态跟踪任务执行过程 , 并对失败动作进行捕捉和重试;
三、设计思路1、同步请求响应服务之间的通信模式一般分为:同步和异步两种;同步是指在请求端发出动作之后 , 会一直等待响应端完成 , 或者响应超时导致熔断 , 即在一次请求调用中耦合所有的处理流程;

服务中大部分的请求都是同步响应模式 , 可以提高系统的响应速度;但是在分布式中 , 首先要控制超时熔断的时间 , 避免在流量高峰期请求堆积 , 拖垮整个服务;另外对于被大量调用的公共服务 , 要提高并发的支撑能力 , 降低对请求链路的性能影响 。
2、异步解耦模式异步模式的最大优点就是实现请求和响应的完全解耦 , 任务只需要触发一次开始动作 , 后续的流程就会逐步地推进直到结束;各个服务节点处理逻辑不会受到整个请求链路的耗时限制;

实现异步有多种方式 , 例如:请求回调、发布订阅、Broker代理等;在之前异步章节中有详细描述 , 这里不再赘述;异步消除了服务节点之间的依赖关系 , 但是也同样提高了流程的复杂性;
3、事件驱动设计事件驱动是一个抽象的概念 , 即通过事件的方式实现多个服务间的协同 , 驱动整个流程的处理逻辑;在业务层面是一种设计思想 , 在技术层面通常采用发布订阅的方式 , 同样也可以消除服务间的强依赖关系;