很长一段时间一直在考虑支付系统的可靠性、一致性问题,生产上随着交易量的增大或是其他程序原因发生过很多问题,例如:
- 服务器JVM crash导致客户流水状态不一致、批量自动任务未执行完成
- 数据库处理阻塞导致记录/更新流水失败,导致数据状态不一致
- 应用服务器阻塞导致交易处理缓慢,客户迟迟查不到结果或是查到的结果不正确
- 前端组件阻塞导致客户交易发到应用系统时已超时,客户查无流水但最终交易成功
- 由于后端核心系统问题流控或其他异常导致客户交易异常失败
这些问题都不太好解决,但又是作为支付系统必须面对的,将这些问题留给客户处理实在是不可取。最近在网上发现一个PPT《准备好发射了吗?–面向生产环境的SOA系统设计》,看了很有启发,和大家分享一下。这个PPT的作者是程立,支付宝的首席架构师,这里我就不多做介绍了,大家可以在网上搜一下。
下面逐个对其中介绍的内容进行介绍。有写的不对的地方欢迎指正。
1. 典型的SOA应用
典型的SOA应用可分为几层:
- 接入层:界面展现服务、客户接入服务(集成服务),主要负责渠道接入功能;
- 产品服务层:包括各个产品应用,比如收付款、代收付、理财等产品应用,主要完成产品的业务处理,一般作为主项目对整个产品负责。
- 公共服务:提供基础的公共服务如客户信息、机构员工信息、收费处理、安全检查等等,这些一般不会直接作为产品,但通过这些划分可以大大简化产品开发,提高一致的企业级要求。
- 基础服务:这些是多个公共服务中的公共功能,和上面的公共服务的区别比较模糊。
- 集成服务:这里指的是调用外部系统的网关,对于支付宝来说一般是负责接入各家银行系统,从设计上集成服务一般仅负责接口适配、路由转发(在目前我们系统中是这样的)。
2. 服务的内部
服务作为基础业务单元,本身具有高内聚的特性。它需要保证对外提供的服务具有如下指标:质量约束(包括功能、非功能指标)、服务位置、功能描述(包括功能描述,还包括其他特性描述,如是否满足幂等性、可查性、TCC等等)、交互模式(包括同步联机交易、异步消息等)、通信协议、消息格式。服务对外表现为独立的业务单元,不仅要考虑自身的功能还需要在设计时充分考虑调用方的需求、业务场景以及业务扩展,另外尽量简化调用方的使用。
3. SOA技术基础设置
这些基础设施是为各个产品服务、基础服务来使用的,从后面的PPT可以看出是根据各个服务对功能、性能以及监控的要求而独立出来的。大家从各个服务角度来看待这些基础设施会好理解很多。(再想想,我们系统现在就是缺少这些基础设施,|-_- )
4. 一个典型的电子支付应用
这里拿一个典型的电子支付做例子,电子支付本身很复杂,涉及到很多的业务规则,也涉及到很多其他的服务。这里也可以看出,所有的汇聚点是在“订单处理”,也就是说订单处理需要负责整个全流程的控制、处理,它也就是我上面说的产品服务。
5. 响应时间分析
这里可以看出整个处理时间依赖与各个服务的处理时间,这也可以看出SOA并不能减少交易时延,甚至还会增加时延。这里说的合理评估务必要通过技术手段来统计各个服务的响应时间,这也就是公共基础设施“服务监控”的作用。
6. 响应时间优化
除了交易自身处理逻辑本身的优化外,另两个常用的(有效的)优化措施包括:(1)改为异步调用;(2)通过future并发调用来减少时延,当然并发调用本身也会带来额外的时延(文中为10ms)。(3)通过缓存服务结果来提高服务本身的响应时间。这个会后面文里提到的。
7. 关于性能的基础设施支持
上面优化方案都需要基础设置的支持,这些基础设置包括企业服务总线、服务监控、服务代理等等。有了这些服务支持才能使性能优化过程大大简化,更易于实现,也更科学。
8. 吞吐量分析
每个新业务上线会对底层服务带来大量的吞吐量。如果超过了底层服务的吞吐量就需要对新业务能支持的吞吐量进行调整。
注:这页PPT可以通过放映模式观看,会更易懂。
9. 关键服务的吞吐量优化
每个服务都需要给出自己的吞吐量公式,指出其优化的方向。对于无状态的服务只要增加服务器即可,但对于有状态的服务(例如记账、结算)就没那么简单了,可能需要拆库、拆表设计改造,另外也要保证服务事务的一致性。从后面程立对支付宝的重构的讲解中可以看出他对高可用、水平扩展很重视,也就是说这些关键服务必须要保证其水平扩展,这个决定是需要强大的技术支持、也需要魄力的。
10. 非关键服务的吞吐量优化
非关键服务可以通过optional在超量时进行短路降级,以保证整体系统的可用性。这也是需要基础设施支持的。
11. 资源使用分析
文中指出通过sql执行次数来进进行分析,这个数据也是依赖于服务监控的。可以看出性能要通过监控数据优化,通过监控能迅速找到性能瓶颈,减少分析成本。监控的常见手段包括日志分析,交易链路分析,服务器性能指标分析等。
12. 资源使用优化
文中指出了如何通过服务代理缓存服务结果,以减少对资源的直接访问。其实通过缓存手段对于服务本身进行改造也是一个手段,这样也更加可控。缓存的key值选取需要根据应用而已,且务必保证结果正确性。
13. 关于容量的基础设施支持
文中介绍了几个基础设施,如果没有这些基础设施或是基础设施不易用、功能不完善,会导致各个产品功能优化开发很难开展,问题排查也很痛苦。
14. 单个服务的故障条件
单个服务的故障条件有很多种,对于资源(主要是数据库,也可能是文件系统)来说,包括资源不可用、资源响应超时;对于外部服务来说,存在通信中断、服务不可用、服务响应超时、服务违背功能契约(外部服务自身问题);对于服务使用者来说会有并发请求、重复请求、超量请求、请求积压;对于服务自身来说会有BUG、处理中断、处理超时等。正如PPT中所说,唯一确定的是不确定。如何在这些不确定中保证系统的正确性是一个值得探讨的问题。
15. 应对方式
虽然这些问题多种多样,但总有应对之道。ppt中指出了应对的思路,但也指出需要从下面几个方面进行控制:避免发生、降低概率、控制影响、快速恢复。
故障条件 |
应对方式 |
类型 |
超量请求 |
配额控制 |
避免发生 |
重复请求 |
幂等控制 |
控制影响 |
并发请求 |
并发控制 |
降低概率或控制影响 |
请求积压 |
请求丢弃 |
控制影响 |
服务/资源响应超时 |
时间控制 |
控制影响 |
可恢复通信故障 |
合理重试 |
控制影响、快速恢复 |
处理中断 |
事务/分布事务 |
控制影响、快速恢复 |
BUG |
自检 |
降低概率 |
16. 局部配额控制
通过令牌控制超量请求,在服务发起之前申请令牌,服务完成后归还令牌。当然为了防止令牌未归还的情况,令牌需要设置超时时间。此令牌服务也是一种基础设置。
17. 幂等服务、幂等控制
这里说的幂等服务包括两类,一类是服务本身支持幂等,另一类是通过唯一ID来进行判重,以便保证不会重发。这种幂等控制一般采用数据库的唯一索引来做,这样可以做到严格的唯一性控制且性能很好。例如在我们系统中设计了判重辅助表,通过插入操作判断是否为重复交易。PPT中指出通过“操作日志服务”来进行唯一性判断,具体的实现方式文中没说,应该是类似的数据库的实现。
18. 基于资源的并发
文中详细介绍了悲观和乐观的方案,两者的区别是事务的长短,会影响系统的伸缩性。两者的另一个不同是悲观方案可以保证在并发不大时对客户不报错,乐观锁如果要做到这一点需要做更多的工作例如应用级的重试。在系统设计时需要充分考虑利弊,尽量做到在系统层面支持并发。另外这两种方案都不适用于热点资源,针对热点资源的并发是很复杂的问题,例如春运火车票,很大程度需要根据业务情况进行设计解决。文中还提到了通过分布式锁的方式,其本质是将悲观或是乐观方案中的锁采用单独的服务来提供,以达到控制并发的目的。
19. 请求丢弃、时间控制
交易请求中需包括请求发出时间+客户端超时设置(或是约定好的固定超时时间),业务活动能否继续取决于整体的时延,在系统的关键位置(例如外呼、预计和更新流水信息等)中需要提供对交易是否超时的判断,如超时将直接报错。这样可以避免我最开始列的交易阻塞的问题。这里我们采用了时间,而时间在分布式系统中是不一致的,需要考虑时间的补偿(一般采用直接扣减差异的方式)。
注:前面提到的请求发起时间的设置一般是在前置机或是接入系统中进行设置,如果采用客户的时间会带来太大偏差,而使用整个系统内部的时间误差是可控的。另外在考虑超时时间时还需要考虑http的超时时间,例如客户端超时时间是30s,但接入系统的超时时间不能是30s,应该减去接入系统http的超时时间例如15s,则整个交易的超时时间保守设置应该是15s。此请求时间和超时时间应保证做到全交易线传递。
20. 领域自检
领域自检即对数据库资源内容进行简单的核验,保证其数据的正确性,自检的时机为领域对象读取后、更新前。采用这种方式可以一定程度上避免程序的bug。自检的内容包括不变式如取值范围等的校验、状态变迁,即状态变化可选范围的控制。
21. 分布式事务(TCC模式)
通过事务可以避免程序处理中断(如jvm crash等)导致的数据库状态不一致。例如两次资金记账操作,为了保证一致性,可以采用此模式。此TCC模式说起来简单,但实现起来可不简单,其本质相当于使用应用服务来作为数据库的资源管理器的角色,例如负责实现隔离性、原子性,通过统一的调度来实现最终一致性。
22. 分布事务(补偿模式)
这种事务的难点是如何实现补偿,以及在无法实现补偿时如何处理(或是通过业务处理)。这种事务不提供隔离性支持。
23. 总结
可以看出企业级的SOA设计不是单独一个项目组这么简单,很多东西需要是企业级,需要大量的基础设施的支持。目前比较火热的微服务、DevOps不仅仅是一个概念,它们体现了一种架构思想,也体现了一种企业文化,甚至也体现了一种企业组织架构。这个PPT已经发布很久,但现在来看还是很有借鉴意义,相信大家在阅读时结合自己的经历会更有体会。