📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。
📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。
🏆 InfoQ签约作者、CSDN专家博主/后端领域优质创作者/内容合伙人、阿里云专家/签约博主、51CTO专家 🏆
🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~
前言
系统功能类设计在分布式的环境中,一个系统的设计除掉可用性问题外,导致资损的问题可以归结为如下三类: 一幂等控制问题,二兼容性问题,三并发互斥问题。本文主要介绍幂等控制问题。
一、 资损防控系统设计资损防控规范
从系统架构层面整体来看,支付公司的系统可以抽象为如下结构:
一、对外部商户提供收单服务类的系统
二、连通支付公司与各金融渠道的网关类系统
三、支付公司的内部业务处理系统
四、消息、调度等中间件系统
五、数据库、缓存等存储平台
从系统架构与业务架构上来讲,各个结构连接的地方最容易出现资损。因此我们将从接口服务层面与系统设计层面对资损进行分析并总结相关规范。
二、发布环境中的兼容性控制设计
由于业务在发展,系统一定处在变化之中,变化就一定会有兼容性问题的存在。
大到每次业务上线、系统发布,小到一次业务迁移、配置项变更;
每一次变化都会带来一定的系统风险兼容性考虑不充分除了影响可用率外,还会导致资损的发生。因此兼容性设计是系统设计的重中之重,产线上已知的很多资损问题都和兼容性考虑不周有关。
三、常见兼容性问题资损风险
常见的兼容性设计需要考虑如下的兼容性场景:
1、老系统和新数据结构等不兼容
老系统和新数据结构等不兼容,由于我们现在生产发布是DB脚本发布现行,每次发布过程中均存在着老war包新db(表结构、索引、数据等)的情况。考虑不周会导致服务与数据出现兼容性问题。
2、新系统不能处理老系统产生的数据
新系统不能处理老系统产生的数据,如老系统落单了一笔支付交易,新系统上线后不能对其进行支付。
3、老系统不能处理新系统产生的数据
老系统不能处理新系统产生的数据,如系统上线后发生了回退,老系统不能处理新系统产生的数据将会导致问题。
4、收单、网关接口、服务接口兼容性考虑不全
5、发布过程中,由于存在一定时间的新旧war包并存
发布过程中,由于存在一定时间的新旧war包并存,消息和定时任务的兼容性考虑不全。
1、虽然我们在产线进行了消息分组,一定程度上规避了老系统生成的消息,新系统消费的消息兼容性问题;但当消息的源头生产者没有进行上下线的时候,会出现新系统消费老格式消息的问题。
2、定时任务(尤其是非调度中心触发的调度任务)的调度频率、执行系统、内部执行逻辑不兼容,容易出现资损。如某个系统自身的定时任务选择系统执行者的逻辑发生变化,本来该只有一个执行者的任务,导致两个执行者执行。
6、发布过程中,新老系统的幂等控制、并发控制不当
发布过程中,新老系统的幂等控制、并发控制不当,导致资损,有可能单独来看,新老系统都能控制好幂等和并发。
但是在发布过程中,有可能双方的控制机制不一致等情况,使得业务重复处理,引起资损。如网关的幂等在发布过程中曾经被击穿导致的资损。也可能老系统的业务没有并发场景,新系统上线后需要考虑并发,新老系统处理同一笔请求的时候(尤其是任务调度处理的时候),将做不了并发控制。
7、新老业务流程、业务处理规则不兼容
新老业务流程、业务处理规则不兼容,比如一笔理财的抢购支付过程中,分为落单和支付两个环节:库存控制的逻辑老业务流程是支付成功后再扣库存,新业务流程是落单扣库存再支付;
如果落单使用老系统、支付使用新系统;在兼容性考虑不周全的情况下会导致不扣减库存,出现超卖。
再比如,某个业务系统业务发生变化,状态机状态迁移发生了变化,原来的一个业务状态再支付成功的时候迁移为处理中,新状态机设计为迁移为成功;那么对于这笔中间态的业务数据的处理就可能导致资损
8、业务迁移对新旧业务的连续性等兼容性考虑不全导致资损
业务迁移对新旧业务的连续性等兼容性考虑不全导致资损,主要包括参数字段(包括备注)、业务规则处理、反交易处理、开关处理等方面。业务迁移不仅仅是新的业务规则替换老的业务规则,在整个替换过程中,更需要保证业务的连续性;
系统如果不能兼容新旧业务的处理会有极大的资损风险。如系统迁移过程中,新增或变更了很多业务参数,业务平台切换新接口的时候,如果对新旧参数做兼容处理,会导致资损;
新账务迁移过程中,商户出金中的基金划拨场景的商户出金交易新旧业务规则不同导致实际划拨了资金;新账务迁移过程中,如果一笔交易正交易走老体系,冲销走新体系将会出问题(反之亦然),如迁移的开关复用了以前的开关,开关混用,导致问题。
9、数据或数据存储迁移导致的兼容性问题
数据或数据存储迁移导致的兼容性问题,我们后续会碰到很对的数据迁移:如缓存从 redis 迁移到 hippo、数据库从 oracle、mysql 迁移到 pg 等等。
如果迁移过程中数据格式不同、甚至丢失精度会引发资损。业务数据迁移,如会员、ccdc 等数据迁移,如果新老系统对业务数据的处理不兼容会导致资损。
总结
每一次系统变化都会带来一定的系统风险兼容性考虑不充分除了影响可用率外,还会导致资损的发生。因此兼容性设计是系统设计的重中之重,产线上已知的很多资损问题都和兼容性考虑不周有关。
版权归原作者 小明java问道之路 所有, 如有侵权,请联系我们删除。