草庐IT

上线效率提升8倍,携程门票活动直连平台实践

Harry Li 2023-03-28 原文
​作者|Harry,携程资深后端开发工程师,负责直连平台建设,关注系统高可用、数据驱动等领域。

一、前言

携程门票活动供应商直连平台(以下简称“直连平台”)通过API对接多个供应商的订单和商品系统,实现自动化信息同步和状态流转。

随着业务的高速发展,供应商的对接需求与日俱增,这不仅对直连平台接入供应商的上线效率提出更高的要求,同时供应商系统的物理网络限制、稳定性参差不齐等情况也给直连平台带来不小的挑战。

本文将从提高供应商接入效率和增强系统稳定性两个方面分享直连平台的实践经验。

二、背景

2.1 系统介绍

直连平台作为供应商与携程内部系统的适配层,主要支持两条通路:一是同步供应商的商品信息到商品系统,如价格、库存、内容等;二是同步订单信息,如订单状态、凭证信息等。直连平台针对不同供应商提供对应的适配逻辑,以匹配订单系统和商品系统的接口。开放平台为供应商提供方便快速接入的OpenApi和沙箱工具。

图1 直连平台系统介绍

2.2 挑战

随着供应商接入需求越来越多,不同供应商系统之间的差异也愈加明显,在供应商上线效率和系统稳定性上带来新的挑战。

2.2.1 效率

大量供应商通过OpenApi接入平台。每家供应商在上线前,平台需要投入约2人日的联调和验收。当接入中的供应商数量越来越多时,直连平台需要排期对供应商进行逐个处理,延长了供应商的上线周期,影响上线效率。

2.2.2 稳定性

不同供应商系统的物理网络、系统软件之间往往存在差异,承载能力不一。当直连平台的订单流量超过供应商系统的承载能力时,会造成其系统不稳定,甚至引起长时间系统故障,影响平台出票。对于已有限流策略的供应商,如果直连平台的QPS过大时,请求也会被其直接拦截,故需要平台适配不同供应商的承载能力。

当供应商系统出现停机升级、宕机或网络异常等情况,平台会产生大量异常或超时的订单,造成大量客人支付后退订,严重影响下单的对接成功率。供应商系统异常后,由人工介入处理,虽能在一定程度缓解该问题,但仍会出现费力度高和介入不及时等问题。

由于各供应商返回的错误信息不一致,平台难以根据失败原因进行预警或系统干预。

三、实践

直连平台学习借鉴行业通用方案,并结合平台实际情况,在提升效率和提高稳定性方面做了如下实践。

3.1 提升效率

供应商和直连平台均对OpenApi的测试环节有提升效率和降低成本的诉求,直连平台希望提供一个方便供应商自测,且能保证测试质量的工具。

3.1.1 方案

沙箱能对供应商提供自助测试的支持,可以节省人力和提高供应商上线效率,同时也能保护直连平台正式环境不受干扰,所以是开放平台的首选。

在网络安全方面,沙箱指在隔离环境中,用以测试不受信任的文件或应用程序等行为的工具。不明程序让它在沙箱内运行,程序无权修改沙箱外的程序及系统设置,保障了系统不会遭到恶意软件及病毒的篡改和入侵。

一般开放平台中的沙箱,仅能测试单个接口和显示接口日志。和同行业的其他沙箱相比,本文介绍的沙箱(以下简称“平台沙箱”)还支持测试业务场景、自动验收上线等功能,在提高上线效率的同时,还能提高对接质量。

图2  平台沙箱 vs 其他沙箱

3.1.2 平台沙箱简介

为了给供应商提供灵活易用的自助测试工具,平台沙箱支持供应商根据自身系统参数和业务类型进行相关配置。供应商在提交测试任务后,平台沙箱结合供应商配置和测试用例的匹配策略,从测试用例池中匹配所需的测试用例。测试用例的处理支持自动化,即便对于需要供应商主动推送通知的用例,平台沙箱也支持断点执行。平台沙箱接收到供应商推送的正确报文后继续完成后续测试任务,整个过程无需平台人工干预。全部用例执行成功后,即达到平台沙箱验收标准,系统将自动上线。

图3  平台沙箱处理流程

为了实现平台沙箱的全自动化,直连平台需要重点考虑以下4个核心环节:

图4  平台沙箱核心环节

3.1.3 用例定义

人工联调测试时,测试人员需要依据供应商接口类型及业务场景编写不同测试用例,用例类型常包含功能测试、异常测试、边界测试等。这种基于业务场景的测试用例可以保证测试质量。平台经调研其他公司的沙箱后发现,绝大多数的沙箱仅能给用户提供单接口测试的页面,有的页面虽然能组装报文或查看接口日志,但由于没有约束业务场景和校验点,故测试的质量高低不一,为上线后的对接质量带来隐患。 

而平台沙箱通过把一个或多个接口组织在一个有明确测试目的的场景中,让供应商的测试流程更清晰,也更容易把握校验点。

图5  单接口测试 vs 场景化测试

3.1.4 用例匹配

不同供应商的产品形态、接口处理方式会有不同,故所需的测试用例集合也不同。为了实现供应商与测试用例的自动匹配,平台在维护测试用例时会为每个测试用例设置不同的匹配规则。匹配规则包含供应商是否接入指定接口、指定接口是同步或异步处理以及具体业务参数,如:是否检验底价、是否校验库存、是否需要证件等。

图6   用例匹配过程

3.1.5 用例执行

匹配得到测试用例集合之后,平台沙箱会自动执行每一个测试用例。每个测试用例包含的多个接口,可能是平台调用供应商的接口(如下单接口),也可能是供应商调用平台的接口(如下单确认通知接口)。以“用例定义”章节中的case#1和case#3为例,分别介绍普通执行流程和断点执行流程,如下图:

图7  用例执行流程(普通执行流程、断点执行流程)

3.1.6 自动验收

每个测试用例都是独立的、可重复执行的,所以允许供应商进行重复测试,直至执行成功。平台沙箱自动统计测试用例的结果。测试用例涵盖了几乎全部的业务场景,全部测试用例都执行成功,则认为供应商根据直连平台OpenApi开发的对接系统达到验收标准。达标后,供应商需要在平台沙箱上主动通知直连平台。平台将自动为供应商做上线配置,完成从平台沙箱测试到验收上线的全部流程。

3.1.7 成果

平台沙箱上线后,供应商测试和验收不再受制于平台人力,对接OpenApi的供应商每月平均上线数量相较于上线前提高了8倍以上,供应商平均接入总耗时从平均23人日下降到6人日。

图8  沙箱上线前后比较

3.2 提高稳定性

系统稳定性是指系统要素在外界影响下表现出的某种稳定状态。在节假日或营销活动期间,订单量会是平常的几倍或几十倍,这会给供应商系统的稳定性带来很大风险。直连平台需要控制流量,提高供应商系统的稳定性。

3.2.1 方案

对于承载能力低于直连平台的供应商系统,直连平台需要控制流向供应商的请求速度,一般会通过限流机制来实现。限流的作用是控制在单位时间向提交不超过一定阈值的请求量,即使用削峰填谷的思路,解决突发流量的问题,保证直连平台整体的出票成功率。

图9  限流策略(削峰填谷)

当供应商系统的指标连续出现异常时,为了减少或阻断持续的影响,常见的做法是采用熔断机制。若系统检测到熔断发生,一般会采取降级处理。在直连平台中,熔断分系统熔断和业务熔断。系统熔断是当直连平台检测到供应商系统持续异常时会通过一定时间的禁售等降级操作来减少出票失败量;而业务熔断则是通过分析并标准化供应商接口返回的错误信息,并进行相应降级操作。

图10  熔断降级

3.2.2 限流

常见限流算法

常见的限流算法有计数器算法、令牌桶算法和漏桶算法。 

计数器算法是限流算法里最简单、最容易实现的一种算法,通过控制一段时间的总请求数实现限流;令牌桶算法则是使用一个存放固定容量令牌的桶,并按照固定速率向桶中添加令牌,请求是否被处理需要看桶中令牌是否足够;漏桶算法是始终按照固定速率处理请求。 

计数器算法和令牌桶算法控制处理请求的平均速度,会存在一定程度的突发流量,而漏桶算法是固定速度,所以直连平台采用漏桶算法来解决不同供应商的限流需求。

漏桶限流

用户订单产生后,直连平台需要从队列中批量读取数据,向供应商批量分发,常常会出现瞬时流量影响对方系统的稳定性。通过漏桶限流方案,实现匀速分发,保证供应商系统的平稳处理。

图11  漏桶限流前后对比

具体步骤:根据限流策略,从数据队列中获取指定数量的订单,根据间隔时间计算提交时刻,最后执行分时提交。

图12  漏桶限流实现逻辑

平台的订单对接供应商有几千家。在配置限流策略时,无需为每一家配置限流策略。平台的做法是对于有限流诉求的供应商、订单量较大的供应商和临时有营销活动的供应商配置即可,而其他供应商可以使用一个公共的限速适中的限流策略即可。这样可以保证重点供应商系统的稳定性,又可以减少维护限流策略的费力度。

效果展示

下图为限流后的流量请求结果。从图中可明显看出,支持限流后的直连平台可以很平稳的控制处理请求的速度。

图13  限流效果

3.2.3 系统熔断

熔断监

系统熔断的监控采用30分钟长监控和5分钟短监控结合的方式。长监控用于计算熔断时长,而短监控的目的是为了补充长监控的不足,防止把系统已经恢复的供应商再次进行熔断。

熔断时长

熔断时长在基础时间的基础上,综合考虑了异常或超时率和连续熔断次数。在对供应商历史异常时长的统计后得到异常均值时长在30分钟左右,故平台设置熔断单次时长最长不超过60分钟。计算熔断时长的公式为:

  • t:基础时间(5分钟)。
  • p: 过去30分钟内的异常或超时率。
  • L(p):由p计算出的熔断时长等级。异常或超时率越高,则熔断时长等级越高。
  • n:连续熔断次数,首次熔断n=1。资源上线超过24小时,则n重置为0。

3.2.4 业务熔断

错误信息多样性

直连平台对接的供应商非常多且不同供应商接口契约、对接流程和错误描述也不尽相同。对于因“库存不足”而失败的下单响应报文,直连平台可能是根据供应商返回的不同code区分的,也有可能是需要通过错误描述来区分的,如“库存数量不足”、“余票不足”、“没有库存”、“还剩0张”、“已售罄”等等。

图14  库存不足”对应的供应商错误信息

接口的错误信息有很多用途,如监控供应商系统的稳定性、归纳对客失败话术、反映商品设置错误、反映用户错误输入、提醒补库存、关闭班期或下线资源等。基于供应商接口错误信息的分析和处理对于商品力、系统监控、用户体验等方面都有非常重要作用。

错误分类

直连平台把业务错误分为6个大类,分别是系统问题、游客信息问题、限购问题、库存问题、产品设置问题和账户余额问题。每个大类有分为若子类,在子类上可以配置通知接收人、通知方式、资源操作方式、对客话术code等。比如对于下单接口,只需要把不同供应商下单接口错误信息中的关键词关联到相应的二级分类上,平台即可基于分类进行统一的操作。

图15  错误分类演示

为了关键词更加精确地识别指定供应商的错误信息,关键词的配置工作必须要人工进行。相同的错误描述对于不同供应商可能有着不同的含义,如:“处理错误”或某个具体的错误码等。

直连平台会监控关键词匹配率,并每日拉取增量的未匹配关键词的供应商错误信息,由运营进行补充到供应商的关键词策略中。

降级方式

目前降级方式仅支持禁售,禁售包括关闭班期和下线资源。供应商返回“库存不足”、“日期不可售”等错误时,平台将会对资源操作关闭班期,供应商返回“预存款不足”、“价格设置错误”等错误时,平台将下线资源。

3.2.5 成果
通过系统熔断和业务熔断,有效的规避了因供应商系统异常、库存不足、账户余额不足等等问题造成出票失败的问题,异常或超时失败率从0.34%下降到0.05%。

图16  系统熔断效果

四、结语

引入沙箱后,接入OpenApi的供应商不再受制于直连平台的人力,上线效率明显提升,但由于目前沙箱文档中对沙箱页面使用流程和常见问题的介绍仍不够详尽,还需要平台人力为供应商解答诸多类似问题,故需要进一步完善。

熔断监控能有效减少出票失败率,但熔断监控只依赖下单接口的状态,由于部分供应商已接入可定检查或预下单等实时接口,所以增加监控更多接口数据能更加有效地提高监控的实时性。而且除了禁售,熔断策略还可以补充其他操作,如变更确认方式等。

此外,随着供应商数量和业务逻辑复杂度的增加,现有监控和预警机制有待进一步完善。当前预警手段还比较依赖邮件,而告警邮件数量增多,会增加告警触达率低和响应不及时的风险。故需要基于平台现有逻辑埋点,通过公司成熟且完善的一系列组件对监控和预警做进一步升级。

最后,希望本文中提到的解决方案能给大家带来帮助和启发。

有关上线效率提升8倍,携程门票活动直连平台实践的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  3. ruby-on-rails - Rails 中同一个类的多个关联的最佳实践? - 2

    我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来

  4. ruby-on-rails - 向 Rails 3 添加 Ruby 扩展方法的最佳实践? - 2

    我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion

  5. ruby-on-rails - Ruby .each 效率 - 2

    我这样做(在我看来):#myUserisaUserinActiveRecordwith:has_many:postsmyUser.posts.eachdo|post|end如果用户有10个帖子,这会调用10次数据库吗?这些循环应该像(不那么漂亮)吗?:myPosts=myUser.postsmyPosts.eachdo|post|endHere是我测试的ruby​​文件的粘贴箱。编辑修改了粘贴箱。这让我想起了Java中的代码for(inti=0;i应该是(除非数组被修改)for(inti=0,len=someExpensiveFunction();i我错过了什么吗?我看到一堆Rails

  6. ruby-on-rails - 如果条件与 &&,是否有任何性能提升 - 2

    如果用户是所有者,我有一个条件来检查说删除和文章。delete_articleifuser.owner?另一种方式是user.owner?&&delete_article选择它有什么好处还是它只是一种写作风格 最佳答案 性能不太可能成为该声明的问题。第一个要好得多-它更容易阅读。您future的自己和其他将开始编写代码的人会为此感谢您。 关于ruby-on-rails-如果条件与&&,是否有任何性能提升,我们在StackOverflow上找到一个类似的问题:

  7. Ruby 最佳实践 : working with classes - 2

    参见下面的示例,我想最好使用第二种方法,但第一种也可以。哪种方法最好,使用另一种的后果是什么?classTestdefstartp"started"endtest=Test.newtest.startendclassTest2defstartp"started"endendtest2=Test2.newtest2.start 最佳答案 我肯定会说第二种变体更有意义。第一个不会导致错误,但对象实例化完全过时且毫无意义。外部变量在类的范围内不可见:var="string"classAvar=A.newendputsvar#=>strin

  8. ruby catch 和效率 - 2

    catch在Ruby中是为了跳出深度嵌套的代码。在Java中,例如Java用于处理异常的try-catch可以实现同样的效果,但它被认为是糟糕的解决方案,而且效率也很低。在用于处理异常的Ruby中,我们有begin-raise-rescue,我认为将它用于其他任务也很昂贵。Ruby的catch-throw真的是比begin-raise-rescue更有效的解决方案吗?或者还有其他原因可以使用它来打破嵌套block而不是begin-raise-rescue? 最佳答案 除了是摆脱控制结构的“正确”方式之外,catch-throw也明显

  9. ruby - 存储外部 API 的密码 - 最佳实践 - 2

    如果我构建了一个应用程序来访问来自Gmail、Twitter和Facebook的一些数据,并且我希望用户只需输入一次他们的身份验证信息,并且在几天或几周后重置,那会怎样是在Ruby中动态执行此操作的最佳方法吗?我看到很多人只是拥有他们客户/用户凭证的配置文件,如下所示:gmail_account:username:myClientpassword:myClientsPassword这看起来a)非常不安全,b)如果我想为成千上万的用户存储此类信息,它就无法工作。推荐的方法是什么?我希望能够在这些服务之上构建一个界面,因此每次用户进行交易时都必须输入凭据是不可行的。

  10. 映宇宙2022年营收63亿元:同比下降三成,毛利率提升4.3个百分点 - 2

    3月26日,映宇宙(HK:03700,即“映客”)发布截至2022年12月31日的2022年度业绩财务报告。财报显示,映宇宙2022年的总营收为63.19亿元,较2021年同期的91.76亿元下降31.1%。2022年,映宇宙的经营亏损为4698.7万元,2021年同期则为净利润4.57亿元;期内亏损(净亏损)为1.68亿元,2021年同期的净利润为4.33亿元;非国际财务报告准则经调整净利润为3.88亿元,2021年同期为4.82亿元,同比下降19.6%。 映宇宙在财报中表示,收入减少主要是由于行业竞争加剧,该集团对旗下产品采取更为谨慎的运营策略以应对市场变化。不过,映宇宙的毛利率则有所提升

随机推荐