来源:得物技术
一、前言
二、一致性理论基础
1. 一致性模型概述
2. 最终一致性的必要性
三、供应链一致性框架总体架构
1. 一致性框架的核心功能
2. 一致性框架整体框架
3. 一致性框架整体流程
四、一致性框架实现原理
1. 核心组件设计
2. 异步执行实现原理
3. 重试机制实现
五、领域模型
六、数据模型
七、一致性框架案例
八、结语
一
前言
在当今微服务架构盛行的时代,分布式系统已经成为企业级应用的标准模式。然而,随之而来的分布式事务问题也成为了开发人员的一大挑战。在复杂的供应链系统中,
各个业务模块之间的数据一致性一直是一个重要且棘手的问题。物流、库存、订单等系统相互协作,如何在保证业务高效运转的同时,确保跨系统操作的数据一致性?
今天,我们将深入探讨一个专为解决供应链分布式事务问题而设计的框架——「一致性框架」。
二
一致性理论基础
一致性模型概述
在分布式系统中,一致性模型主要分为几种类型。
一致性模型类型
※ 强一致性
任何时刻,所有节点看到的数据都是一样的。
※ 弱一致性
不保证所有节点同时看到相同的数据。
※ 最终一致性
在一段时间后,所有节点最终会看到相同的数据。
其中,最终一致性是CAP理论(一致性、可用性、分区容忍性)中的一个重要妥协方案,它在保证系统高可用性的同时,通过异步机制确保数据的最终一致。
最终一致性的必要性
在微服务架构的系统中,我们常常面临着跨服务调用中的分布式事务问题、网络暂时性故障导致的调用失败、第三方系统响应慢导致的超时问题等。这些问题如果使用强一致性方案解决,往往会导致系统可用性下降、响应时间增加。因此,"先完成本地事务,异步确保远程调用的最终成功"的最终一致性方案被广泛采用。
三
供应链一致性框架总体架构
一致性框架的核心功能
供应链一致性框架包含以下核心功能:
- 声明式API:简洁易用的接口供开发者使用
- 操作记录持久化:记录操作信息,以便重试
- 自动重试机制:失败后按策略自动重试
- 并发控制:避免并发重试导致的问题
- 超时与熔断:防止无效重试消耗资源
- 监控与告警:重试失败达阈值时进行告警
一致性框架整体框架
一致性框架整体流程
供应链的一致性框架基于Spring Boot生态,这提供了简单易用的注解式API 。其总体流程如下:
初始化阶段
- 应用启动时,加载一致性框架配置。
- 初始化线程池、策略组件、监听器等核心组件。
- 注册定时任务(重试任务、清理任务)。
方法拦截阶段
- AOP拦截标注了 @EventualConsistency 注解的方法。
- 解析注解参数(referenceNo、是否异步、重试策略等)。
- 创建一致性操作上下文(ConsistencyContext)。
事务处理阶段
- 执行业务方法,记录执行结果。
- 事务提交后,进行一致性操作的执行。
一致性框架执行阶段
- 根据配置决定同步执行或异步执行。
- 保存执行记录到数据库。
- 同步执行直接调用目标方法,异步执行提交到线程池。
- 根据执行结果更新记录状态(DONE、EXCEPTION、FAILED)。
重试阶段
- 从数据库找出异常状态的记录,包含执行方法名、方法参数等。
- 执行器重试方法。
- 根据执行结果更新记录状态(DONE、EXCEPTION、FAILED)。
一致性框架整体流程如下
四
一致性框架实现原理
核心组件设计
我们的一致性框架包含以下核心组件:
注解层
@EventualConsistency 注解是框架的入口,它是一个运行时注解,可以应用于方法和类。其核心属性如下:
- async() :控制第一次执行是否为异步执行,默认为 true 。
- maxRetryTimes() :设置最大重试次数,默认为6次。
- delay() : 配置重试延迟策略,使用嵌套的 @Delay 注解。
- listeners() :指定监听器的Bean名称,用于监听重试过程。
- beanName() :指定Bean名称,用于定位执行目标。
- referenceNo() :设置业务参考号,用于业务追踪和幂等性控制。
- serializerListener() :指定用于序列化和反序列化的监听器Bean名称。
拦截层
AnnotationAwareRetryOperationsInterceptor 负责拦截带有注解 @EventualConsistency 的方法,根据注解配置创建相应的执行策略。
执行层
执行层负责根据当前带有一致性注解方法的状态来选择合适的执行器,执行带有一致性框架注解的方法。一致性框架会记录执行方法的状态,包含初始化、异常、失败和完成状态。
根据状态不同,会选择不同的执行器:
- SyncConsistencyExecutor :同步执行器,在当前线程中执行。
- AsyncConsistencyExecutor :异步执行器,通过异步线程执行,不等待执行结果立即返回成功。
- RetryConsistencyExecutor :重试执行器,专门对执行状态为异常的记录进行重试。
- NestedConsistencyExecutor :嵌套执行器,专门处理嵌套一致性调用场景,记录执行信息但不立即执行方法,通过重试机制来执行嵌套任务,解决同一事务中嵌套调用的问题。
持久层
使用数据库存储执行记录,支持记录的创建、更新和查询。大消息存储到MongoDB,避免数据库性能问题。
异步执行实现原理
异步执行的核心是将操作持久化,然后在事务提交后异步执行。这种设计确保了只有当原事务提交成功后,才会执行异步操作,避免了事务回滚后执行异步操作的问题。
重试机制实现
重试机制基于以下几个关键点:
- 持久化记录:记录每次执行的参数和状态
- 定时扫描:定期扫描需要重试的记录
- 分布式锁:确保在集群环境下只有一个实例执行重试
- 反射调用:通过反射动态调用目标方法
五
领域模型
六
数据模型
七
一致性框架案例
买家在得物App下单后,供应链会接收商品发货单据。商品从仓库发货时,仓储域要将发货信息通知履约域,并扣减仓储库存。代码如下:
public void ship(String orderCode){ //通知履约域 notifyOfcShip(orderCode); //库存扣减 inventorySubtract(orderCode);
}
@EventualConsistency(referenceNo = "#orderCode")public void notifyOfcShip(String orderCode){ // 发货调用履约域}
效果:即使履约系统出现异常,库存也能正常扣减,确保商品发货成功。一致性框架会重试通知履约域的方法,确保履约域发货单状态变更并通知交易域。
八
结语
在分布式系统中,一致性框架是确保系统可靠性的重要工具。通过正确使用一致性框架,我们可以构建既高可用又最终一致的系统,应对各种复杂的分布式场景。希望本文能帮助您更好地理解一致性框架的原理和应用,为您的系统添砖加瓦。