以强大的数据一致性在规模上彻底改变货币运动

0.
以强大的数据一致性在规模上彻底改变货币运动

Uber作为一个平台邀请用户利用它,从中获得,并欣赏它。在10,000多个城市为每天提供超过1800万的要求,使人们能够自由地移动并在赚取生计的同时广泛思考。作为底层发动机之一,优步资金履行了人们在优步经验中参与的一些最重要方面。这样的系统不仅应该是强大的,而且应该高度可用,以便在我们的成功Mantra之后对停机时间提供零容忍度:准确和符合按时收集和抵销。

虽然我们扩展到多行业务,但是,策略策略下一个最好的,优步资金的工程师也在构建下一代的支付平台上,旨在扩展优步的增长。在这篇博客中,我雷竞技到底好不好用们向您介绍这个平台并向我们的学习提供见解。这包括在两个异步系统之间迁移数百万客户,同时维持数据一致性,目标一致性对我们的用户影响零影响。

介绍和动机

湾流,优步的第五代收集和支付支付平台,是我们最新的。它是一个单一,集成的SOX兼容系统,构建了双入口会计原则,可以协调自己。我们讨论了在本文中的新模型中修复的旧模型中的一些短暂转化。

遗留系统有两个内部系统。一个提供骑手和食客的收藏品,另一个提供给餐馆和伴侣司机的支付。这有很多缺点,例如没有完整的端到端货币运动的看法。它还放慢了建立了更多通用功能,如现金旅行,所以需要从其驱动程序合作伙伴那里收集佣金等。所以我们想建立一个角色无话可策,可以从任何用户收集和抵销资金。这使得能够更快地为多行业务销售。

新系统的优点建筑学

基于工作/订单系统

基于事务的系统很难扩展以用于运行余额并考虑用户实体。跟踪和执行零和原理很难。

我们的新架构现在使用基于作业/订单的系统。每个“工作”代表一次拼车旅行或送餐。由于调整、激励、小费等原因,可能有多个订单属于同一个工作。每个订单包含多个订单条目,每个订单条目表示进出用户帐户的金额。它共同代表了从支付方账户到收款人账户的资金流动。所有条目的总和为零(系统不能创造或销毁货币)。它从一个账户流向另一个账户。货币运动,基于订单的系统创造了一个类似于现实世界复式记账系统。

这个表格展示了一个简单的拼车旅行示例,总车费为20美元,其中包括2美元的服务费和18美元的车费。所有顺序项的和是零。

旅行费用 -18年 付款人托管
服务费用 -2 付款人托管
旅行费用 18. 收款人托管
服务费用 2 优步托管

我们通过利用消息队列系统来解耦创建订单并处理它:

  • 订单插入服务处理创建付款订单的请求。然后,它会创建付款订单,将订单数据发布到消息传递主题,并持续到ORDERSERE。

    图:创建订单的流水线

  • 订单处理服务使用和处理支付订单。该服务在处理初始支付订单时还生成后续订单。它还将收取和支付请求路由到相应的支付服务提供者。最后,它生成带有收款或支付的成功或失败状态的支付结果订单。

    图:订单处理管道

高可用性和活跃在所有区域

  • 服务在多个区域中可用的无损消息传递队列系统集群的服务交换订单消息。我们在部署池中有备用跨区域消费实例。如果一个区域下降,则其他区域中的服务实例仍然可以消耗和处理订单消息。
  • 我们的系统持续到具有多个区域仲裁的存储系统中的付款帐户和平衡数据。

我们如何实现IDEMPOTINGY?

  • 我们使用唯一标识符作为用户、作业和订单的标识符。我们确定地生成唯一标识符。
  • 处理的订单唯一标识符用于确保一旦订单处理一旦进行保证。
  • 货币运动是基于原子改变用户付款账户的订单处理。
  • 我们的系统保证订单是不可变的。
  • 我们持续后处理订单。

异步平台之间的数据一致性

由于遗留支付系统的复杂性,优步的用户基础和支付数据的规模,我们花了很多年才迁移到新的支付平台。在迁移过程中,我们需要维护两个平台以及它们之间的高数据一致性。为了实现这一点,我们将每个事务更改持久化到实体更改日志中用户的支付账户中,这样我们的系统就可以根据每个用户的实体更改日志的版本号序列化回写。我们对遗留系统中的每个事务进行双写,其中一个字段包含版本号。通过这种方式,回写永远不会失去顺序,并且最终结果总是一致的,即使我们对同一个作业有多个并发的调整。

图:实体更改登录处理

迁移和写作

通过我们在优步进行移民计划的经验,我们学会了:

  • 构建正确的仪表板以跟踪业务指标。
  • 策略推出,我们可以快速捕获和解决问题,而不会影响很多客户。
  • 监视系统之间的通信,以确认新系统的行为符合我们的预期,并且没有对客户产生影响。
  • 根据每个实体更改日志版本序列化从新系统到遗留系统的付款数据写入,以解决两个异步系统之间的竞争条件问题。

仪表板和指标

在我们将新系统放入生产之前,我们添加了各种不同的指标。这包括跟踪每个流的基于基于计数,结果,延迟和可观察性的度量标准。我们为生产而设立了各种警报与阴影流量。这有助于我们跟踪系统的业务指标。此外,我们设置了各种仪表板以验证我们的服务。我们还可以使用这些仪表板来了解我们每次活动用户执行的成功商业活动以及我们在不同系统之间检测到的异常。我们的Oncall工程师和卷展栏负责工程师每天追踪仪表板。

智能推出策略

我们设计了以多步骤方式迁移系统的展示。我们将首次推出的产品大致分为:

  • 团队内部服务卷展栏同步系统
    • 订单数据模型具有跨越整个支付流程的属性卷浦,我们使用它来决定新支付系统中的任何付款人或收款人是否主要是初级付款方式。Rolloutdata的结构看起来像这样:
  • 外部卷展栏实际上将整个功能迁移到新系统并弃用旧系统。
    • 实际卷展栏是具有多种策略的增量慢速推出。
      • 我们使用每组数百名用户和合作伙伴定义了对照组和实验组。
      • 我们选择了一个用户和合作伙伴数量有限的国家进行初步推出
      • 我们在每个国家的百分比上的推出,从1%开始,逐渐增加到5%,10%,20%,50%,100%。
      • 我们通过动态配置控制rollout,这样我们就不需要在rollout期间部署代码。

顺序写入

我们在处理每个订单时更新付款人和收款人帐户。我们的服务生成一个EntityChangelog,以反映帐户的顺序更改。每个变更词条都有一个版本号,我们每用户递增数字。该服务使用版本号来强制执行orders的回写序列。

写回服务从消息传递中使用EntityChangelog事件排队系统。如果它使用一个没有顺序的事件,我们的处理逻辑将识别出版本不匹配,并且我们将重试该事件多次。如果它仍然失败,我们将一个和解事件发布到另一个消息传递排队系统话题。消耗回写业务和解的服务摄取事件。它检查版本号是否在遗留系统中录制的内容。我们在胜过的差距中获取所有订单,并将其写回遗留系统,一个接一个地。

图 - 写入处理管道

验证和重试

我们的预推出阶段在系统中设置了各种验证策略:

  • 异步作业每24小时运行一次,该工作拆分为国家的工作运行,并将其分类为CityID。
  • End-End调试登录以便按顺序访问日志。
  • 我们对系统中订单状态执行验证,以检查我们是否处理了请求结束,以及是否在每个订单上收集和支付。

图:验证管道

在卷展栏期间,我们开始扩大到越来越多的国家,这是指数级地增加了所有服务的负荷。我们发现了遗留系统和新系统之间缺少的一个重要功能。具体来说,我们必须在汇编写入中展示我们在上面讨论的版本间隙中消耗的服务来消费和解重播订单。

随着验证,我们也设置了重播请求API,以便我们可以重新运行数据以更快地收集实时分析和调试问题。由于我们构建了系统是幂等的,这有助于我们从基于服务的失败恢复更快并快速录制数据。

由于这是必需的手动干预,我们很快为重试队列建造了一个钢板。这使能够在重放订单之前可以运行基本验证的延迟重播机制。这有助于防止使用错误的数据加载我们的队列。

经验教训

迁移是任何公司缩放的现实,并尝试扩展他们设计的产品的频谱。这个复杂的项目有多个方面,即:

  • 设计选择,以构建一个基于订单的系统,双重入口簿记。
  • 两个异步系统之间的无缝迁移,具有非常高的可用性。
  • 通过平台的重新设计,对我们的内部和外部客户都没有任何影响。

我们相信我们所学到的东西可以帮助全球工程师试图在规模上处理问题。因此,我们希望分享一些关键概念:

  • 版本控制对于促进两个异步系统的一致性至关重要。
  • 具有测试租赁和暂存环境的端到端集成测试,以便我们可以曝光和修复错误。
  • 持续验证对于迁移和推出是必不可少的。有了它,您就可以在推出开始后立即捕获问题。
  • 全面的监控和警报缩短了检测和减轻问题所需的时间。
  • 一个高度可靠的支付系统的基础包括在很长一段时间内多次出现暂时失败的支付。

致谢

该项目是2年的交叉团队努力,拥有40多名工程师,产品经理和运营团队在整个旅程中。在这里,我们正在借此机会承认从核心湾流团队的所有工程师承认,他们在成功完成项目的成功完成方面。

结论和接下来的内容

我们经历了广泛的建筑设计,实施和思考的旅程,通过推广和主动监控。我们成功推出了该平台,在所有国家的停机时间可以忽略不计。我们在新的业务线上,即优步运费,Nemo,无缝有效。

作为我们未来项目的一部分,团队已经在考虑将系统真正转变为平台。这将减少新用例的工程工作量,并将我们从收款人、支付者和LOB特定的模式转移到Uber的支付方式上。

我们希望这些做法和建筑设计对其他工程师和团队进行了有用,以便在规模上进行迁移。

注释

没有帖子展示