用户积分技术揭秘之分布式事务

Posted 用户营销技术文摘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用户积分技术揭秘之分布式事务相关的知识,希望对你有一定的参考价值。

1、柔性事务和刚性事务

柔性事务满足BASE理论(基本可用,最终一致)
刚性事务满足ACID理论

京东用户积分采用的是分布式事务当中的柔性事务的处理方式。

2、柔性事务分为

  1. 两阶段型

  2. 补偿型

  3. 异步确保型

  4. 最大努力型。


由于用户积分整个架构是SOA架构,其事务是跨系统和跨业务资源,因此传统单机环境下数据库的ACID事务满足不了分布式环境下的业务需要,以上几种事务类似就是针对分布式环境下业务需要设定的。

3、两阶段提交(2PC)型

两阶段型:就是分布式事务两阶段提交,对应技术上的XA、JTA/JTS。
这是分布式环境下事务处理的典型模式。

    全局事务

            事务由全局管理器全局管理

    事务管理器

            管理全局事务状态与参与的资源,协同资源的一致提交/回滚

    TX协议

            应用或应用服务器与事务管理器的接口

    XA协议

            全局事务管理器与资源管理器的接口


两阶段提交的最大局限性:

1、潜在故障点多带来的脆弱性

2、准备后,提交前,出现故障引发的一系列的隔离与恢复难题


3、补偿型(TCC)

用户积分技术揭秘之分布式事务


Try:尝试执行业务

        完成所有业务检查(一致性)

        预留必须的业务资源(准隔离性)

Confirm:确认执行业务

        真正执行业务

        不做任何业务检查

        只使用try阶段预留的业务资源

        confirm操作满足幂等性

Cancel:取消执行业务

        释放Try阶段预留的业务资源

        cancel操作满足幂等性

4、异步确保型

        将一些同步阻塞的事务操作变为异步的操作,避免对数据库事务的争用,典型例子是利用分布式队列,消息队列等。

5、最大努力型

        针对执行的结果状态进行重试处理,例如worker对异步发奖流程进行补发等。

6、用户积分兑换详解


        我们的用户积分兑换中,要求实时性,跨应用,跨数据源以及相对较为复杂的业务场景,如果单一选择上述任何一种分布式事务模型,都难以达到理想中的效果,故我们根据不同的业务场景,采用多种事务模型结合使用,从而达到理想中的状态。


调用实时性

        我们在用户积分平台中,为大量的业务系统提供了积分兑换的RPC接口。在保证事务一致性的情况下,必须尽可能的提高相应速度。所以我们采用了TCC模型做事务控制,并且同时只有C端积分明细和积分兑换接口实时要求比较高,故我们再TCC模型中,舍弃了对ES,HBase等耗时的IO操作的实时一致性。

        积分换券精简后流程图如下:

Try :

        检查积分,检查优惠券,冻结积分,(部分券有锁券的逻辑也属于这个阶段)

Confirm :

        发券、扣积分(mysql事务写明细,加积分,解除冻结积分)

cancel :

        恢复积分,(优惠券解锁)


TCC的疑问:

        TCC的三个阶段和流程图对应起来了,但是疑问颇多,假设发券时候,发券接口超时,我们应该返回什么给调用方呢?扣积分时,数据库服务器超时异常,又该返回什么呢?


异常处理:

        对于上面TCC的疑问中提到的问题,我们的答案是返回提交成功,而我们的异步重试,会以最大努力模型来保证事务的最终一致性。在积分换券的实例中,我们在TCC模型执行到每一个阶段都会记录事务日志,一旦出现需要重试的异常,我们会根据事务日志,继续执行接下来的操作。当然,在TCC中,一些业务异常,比如优惠券不足等,这类异常会触发回滚操作,即进入TCC的cancel阶段。


数据源同步 :

        上面有说到,我们在接口里为了实时性,舍弃了对ES,HBase的写操作,然而ES对于后台的聚合查询,HBase对于后台的明细查询以及归档都是非常重要的,我们怎么保证他们的数据和mysql的数据是一致的呢?在这里,我们采用了异步确保型,在用户兑换积分后,我们会发一个消息出来,从而异步去同步相关信息。

小结:

       由此我们可以得出,在众多的分布式事务模型中,没有一种是万能的,每一种都有自己的优点和缺陷。只有结合具体的场景,采用多种模型的结合,从而才能达到我们理想中的状态。

关于我们:

       我们是京东平台生态事业部负责用户营销的Team,我们是开放高效的扁平化团队,我们采用敏捷式开发进行产品的快速迭代。我们有着大型分布式系统,高流量接口,京东主站PC和App前端露出页,十亿级别的数据存储,TB级别的大数据批处理,实时计算,数据建模和挖掘以及最最火热的机器学习。

      1. 具有扎实的java基础
      2. 熟悉面向对象设计
      3. 具有一定的分布式系统架构经验
      4. 数据java web开发

     当然你还具有如下某项技能,会大大加分

     1. 使用hadoop,hive进行大数据处理的经验
     2. 能够利用storm,spark streaming进行实时数据处理
     3. 了解spark ML,并能进行数据建模和机器学习
     4. 熟悉前端开发,精通Vue.js等前端框架

以上是关于用户积分技术揭秘之分布式事务的主要内容,如果未能解决你的问题,请参考以下文章

彻底揭秘万亿级「分布式事务」架构设计之道!

来约 | TDSQL的架构和分布式事务处理技术大揭秘

揭秘蚂蚁金服分布式事务 Seata 的ATSaga和TCC模式

揭秘!阿里实时数仓分布式事务Scale Out设计

分布式事务内幕揭秘

自主研发平台POIN4.2揭秘系列 --分布式事务