
目前,微服务已经成为架构设计领域开发者关注的焦点,那么,微服务架构的特点以及典型设计模式有哪些,实际实施过程中如何拆分微服务、数据一致性如何保证,将通过转转的实践为大家带来实施微服务的关键技术分享。
微服务架构特点
微服务架构是Martin Fowler 在2014年提出的架构模式。微服务架构是一系列小的微服务构成。那么,什么是“小的微服务”?微服务按照业务领域模型来拆分,即根据不同的业务功能单元进行垂直拆分。微服务架构本质上一个业务架构,对业务了解越深刻,微服务拆分将会越合理。

二手交易平台转转,平台包括了用户功能、商品功能、交易功能、搜索功能以及推荐功能。各个业务单元相对独立,就可以按照业务垂直拆分成用户、商品、交易、搜索、推荐微服务。对每一个功能单元,继续进行水平拆分,分为网关层、业务逻辑层、数据访问层、DB/Cache。
那么典型的微服务架构由哪些元素组成的?如下图,包括网关、微服务业务逻辑层(聚合层)、数据访问层(原子层)、数据存储、注册中心、配置中心。网关负责请求接入,聚合层用于各种业务逻辑的处理,数据原子层用做数据访问代理,提供ORM、数据Sharding以及屏蔽底层存储的差异性等功能。

架构设计模式及实践案例
微服务架构模式模式较多,本文重点讲述:链式设计模式、聚合器设计模式、异步消息模式以及数据共享模式。
第一链式设计模式,APP请求首先经过网关层,接下来调用两个微服务1和微服务2。微服务1同步调用微服务2,微服务2处理完毕后反馈给微服务1,微服务1再反馈给Gateway,最后反馈到APP。在实际业务场景中,交易业务场景常会用到链式架构模式。

第二聚合器设计模式, 一个APP请求经过Gateway,到达聚合层,聚合层串行或并行调用三个微服务,将三个微服务的返回结果做聚合处理,比如对结果数据按照时间排序,聚合之后再反馈到Gateway以及APP端。

第三数据共享模式,APP经过微服务网关,接下来调用微服务1和微服务2,假设服务1和维服务2分别是商品查询微服务和商品更新微服务,这两个微服务使用的商品数据是共享的。

第四异步消息设计模式,上述三种架构模式本质都是同步模式。一个APP请求必须等到每个环节都处理完才会得到应答。如果APP请求不需要关注处理结果,可以使用异步来实施。一个APP更新请求经过微服务网关后,请求持久化到消息队列,写入消息队列成功后马上给APP端回应。之后微服务再从消息队列异步消费,从而提高系统整体吞吐量。这类架构对社区等大流量的业务场景适用,但对金融、交易等对数据敏感性高的场景不适用。

我们看一个聚合器设计模式的案例:二手交易平台转转,包括商品、分类搜索、关键词搜索、商品推荐等功能。用户请求经过网关到达聚合层,聚合层根据业务需要调用商品、交易、推荐等微服务原子层,最终在聚合层把各个微服务原子层的结果汇总后返回给APP端。具体如下图所示:
数据最终一致性实践
采用微服务架构后,模块多、数据分散在不同的地方,数据一致性的复杂度增高。在单体架构里可以采用Local Transaction,但是在微服务体系里已不再可行。

我们的业务场景无非是两种:第一种是异步调用,一个请求写入消息队列后,通过异步消费来保证成功,这种模式相对简单。重点讲述同步调用场景下数据的最终一致性。在同步调用场景,不能降低业务系统的吞吐量,因此同步的三阶段提交等方式变的不可行。分布式事务本质上是由多个本地事务组成的一个长事务。因此分布式长事务可以转变成多个本地短事务来实施,一旦某一本地事务操作失败后,分布式事务需要协调失败的本地事务进行回滚或者补偿操作。期望建立一个异步的分布式事务来达到请求调用的最终一致性。业务调用失败后,通过异步方式来补偿业务。第一在正常请求调用前记录业务调用链(调用正常请求的完整参数),第二请求异常时沿调用链反向进行补偿。
基于这个思路,架构设计上的关键点有三,第一是基于补偿机制,第二是记录调用链,第三是业务方需提供幂等补偿接口。如下图右边是聚合器架构设计模式,左边是异步补偿服务。
首先需要在聚合层引入一个Proxy。聚合层Proxy在调用原子层之前,通过代理记录当前调用请求参数。如果业务正常,调用结束后,当前方法的调用记录存档或删除,如果业务异常,查询调用链回滚。

原子层第一是需要提供正常的原子接口,其次是需要提供幂等补偿接口。

分布式事务关键是两上述两张表,第一事务组表,假设A->B->C三个请求构成一个分布式事务,首先针对分布式事务A->B->C生成一个事务ID,并且记录这个分布式事务的状态,初始为“开始状态”。第二事务调用组表,记录事务组内的每一次业务请求调用的请求上下文参数,在每一步调用原子层之前记录相应请求参数。第三,业务请求执行失败后把“开始状态”变为“失败状态”,业务请求执行成功后,把“开始状态“变为“成功状态”。上图中左边的补偿逻辑,会不断地扫描事务组表,确定是否有事务状态为失败的,一旦事务状态为“失败状态”,分布式事务就执行异步补偿服务。
如果分布式事务自身执行失败了,系统会记录错误日志,通过短信等方式报警出来,人工介入处理。
个人简介
孙玄转转基础架构负责人,前58集团技术委员会主席,“架构之美”公众号作者。

