京东购物车如何提升30%性能

京东,购物车,如何,提升,性能 · 浏览次数 : 107

小编点评

**背景购物车面临的挑战:** 1. **新业务:**随着业务形态的丰富,购物车在不断支持各种新业务,依赖的外部接口也随之增加; 2. **下沉:**一些前端调用的接口下沉到购物车中台; 3. **前置:**结算流程很多业务前置到购物车中,如优惠券、京豆; 4. **扩容:**为改善用户体验购物车可容纳的商品数量在不断增长; **全异步化改造方案:** 1. **不同RPC并行购物车依赖接口达几十个,各接口间存在复杂依赖关系。** - 分解原有代码拆分为RPC异步请求和结果处理,按照依赖关系,让RPC最大限度并行执行,减少在结果处理阶段异步响应等待时间。 2. **批量接口多分页并行购物车依赖接口多为批量接口,且单次调用有数据量限制。** - 将数据拆分为多个分页调用,并封装了异步分页工具,使业务层对分页逻辑无感知,异步工具自动将超过接口上限的数据拆分为多个分页并行调用,提升单接口响应速度。 3. **底层采用JSF异步调用异步调用基于京东RPC框架JSF,推荐使用1.7.5以后版本,支持CompletableFuture。** **问题及解决异步化改造的总体方案:** 1. **异常重试:**改为异步后重试会失效,因为在调用时一般不会报错,需要在结果处理阶段获取异步响应超时后,再进行重试。 2. **分页异步结果不能合并:**因为分页调用不是并发执行的,结果不能直接合并到一起的响应中,需要通过包装类原样返回给上层。 3. **分页异步结果需单独控制:**由于分页调用是顺序进行的,获取后边的分页时,前边分页等待的时间也应计算在内,以保证整个获取结果的时间不超过单个分页的最大超时时间。 **收益改造后的结果:** 1. **购物车核心接口耗时减少30%,保证用户体验,节省大量服务器资源。** 2. **新增新的RPC接口时,只要处在调用拓扑的非关键路径上,对购物车性能没有太大影响。**

正文

1、背景

购物车面临的挑战:

1)新业务:随着业务形态的丰富,购物车在不断支持各种新业务,依赖的外部接口也随之增加;

2)下沉:一些前端调用的接口下沉到购物车中台;

3)前置:结算流程很多业务前置到购物车中,如优惠券、京豆;

4)扩容:为改善用户体验购物车可容纳的商品数量在不断增长;

这些导致购物车依赖的RPC接口数量及分页调用次数都在不断增加。购物车作为交易流程开端,本身流量较大,在业务复杂化的背景下,如何提高性能保证用户体验,成为购物车面临的较大挑战。

2、全异步化改造方案

通过增加服务器资源虽然能在一定程度上解决问题,但会带来较大的成本开销,也与工匠精神相悖。能否通过技术手段提升性能呢?通过分析,异步化改造成为解决这一问题的有效手段。

1)不同RPC并行

购物车依赖接口达几十个,各接口间存在复杂依赖关系。必须先梳理各接口间依赖,识别哪些可以并行。然后将原有代码拆分为两部分:RPC异步请求和结果处理,按照依赖关系,让RPC最大限度并行执行,减少在结果处理阶段异步响应等待时间,从而达到提升性能的目的。

2)批量接口多分页并行

购物车依赖接口多为批量接口,且单次调用有数据量限制,需将数据拆分为多个分页调用。那么多个分页间也可以并行,改造中封装了异步分页工具,使业务层对分页逻辑无感知,异步工具自动将超过接口上限的数据拆分为多个分页并行调用,提升单接口响应速度。

3)底层采用JSF异步调用

异步调用基于京东RPC框架JSF,推荐使用1.7.5以后版本,支持CompletableFuture。

3、问题及解决

异步化改造的总体方案并不复杂,但是在实际落地过程中,遇到了很多细节问题:

1)异常重试需精细化

同步调用时,如果超时会重新调用。改为异步后重试会失效,因为在调用时一般不会报错,需要在结果处理阶段获取异步响应超时后,再进行重试。

另外,多分页并行时,当某一页请求超时后,应该只重试出错的分页。底层对分页调用进行了封装,上层业务代码在获取数据时无法感知是哪一页超时,所以必须在异步调用时将现场信息保存在包装类中,一起返回给业务层,在Get数据超时后,单独重试出错的分页。

发生异常时,并不是所有情况都需要重试,当遇到限流等异常时,不能进行重试。底层工具需要自动过滤限流异常,当然也支持自定义规则。

2)异步RPC监控更复杂

底层RPC耗时监控需要拆分为两部分,在分页调用时记为开始时间,在异步结果到达后,记为结束时间。如果调用异常或Get超时,需要标记本次调用失败。对于重试同样需要记录调用耗时,且正常调用与重试调用需分开记录。

除了需要监控RPC耗时外,还需要监控结果处理阶段Get等待时长,这个时间才是真正对应用性能有影响的时间。由于底层是分页调用,所以业务调用次数和底层RPC调用次数并不相同。

3)分页异步结果不能合并,否则无法获取异常Provider信息

底层异步调用结果,必须通过包装类原样返回给上层,除了上边提到的需要单分页重试外,另一个原因是必须保留异步结果,在分页超时后才能输出超时的Provider信息。这是由于Provider信息依赖JSF框架的JSFCompletableFuture,如果在底层合并结果,会导致信息丢失。

4)每页超时时间需单独控制

分页调用过程如上图所示,在结果处理时,每页Get超时时间需要单独控制,因为获取结果是顺序进行,获取后边的分页时,前边分页等待的时间也应计算在内,以保证整个获取结果的时间不超过单个分页的最大超时时间。计算公式如下:

超时=RPC超时时间 > (当前时间-异步调用开始时间) ? RPC超时时间 – (当前时间-异步调用开始时间) : 0

5)分页均衡

为避免最后一页数据过少造成数据倾斜,需要将请求数据均分到每一页,以最大限度提高整个请求的性能。

4、收益

改造完成后购物车核心接口耗时减少30%,保证用户体验,节省大量服务器资源。后续增加新的RPC接口时,只要处在调用拓扑的非关键路径上,对购物车性能没有太大影响。另外,容量增加时除少数不能分页调用的接口外,对性能影响已经比较小。

作者:京东零售 王利辉 梁奉龙

内容来源:京东云开发者社区

与京东购物车如何提升30%性能相似的内容:

京东购物车如何提升30%性能

本文主要介绍在业务复杂化背景下,京东零售购物车团队努力践行工匠精神,通过全异步化改造提升系统性能、提升用户体验。通过本文,读者可以了解购物车中台进行全异步化改造的总体方案,以及方案落地过程中遇到的问题及解决方法,读者可重点关注文中提到的多分页并行后,分页精细控制及底层RPC异常信息问题。

如何将使用中的域名平滑迁移到京东云?(以原域名注册、域名解析都在万网为例)

首先要了解的是,1、域名注册 2、域名解析,是两个独立的产品。一般情况下,域名服务商(万网、新网等)会提供一站式服务,既提供“域名购买注册”,又提供“域名解析服务”。 但实际上,域名和域名解析是可以分开部署的,域名服务商也支持相关的分离设置。比如:域名在万网进行管理,域名解析可以指向其他域名服务商的NS服务器。更进一步,域名也可以从原域名服务商(万网),迁移到新的域名服务商(新网)。

搞懂设计模式——代理模式 + 原理分析

举个栗子,众所周知,我们是可以在京东上购买机票的。 但机票是航司提供的,我们本质上是代理销售而已。 那为什么航司要让我们代理销售呢? 我们又是如帮他做代理的呢? 别急,本文将展开说说他们之间的关系。。。

[转帖]计算机为什么选用补码表示整数?

https://zhuanlan.zhihu.com/p/501536618 深入理解计算机系统(原书第3版) 京东 ¥91.80 去购买​ 整数主要有三种表示方法:原码、反码、补码,目前的计算机都采用补码表示方法。各种表示方法的定义如下: 原码 第一位表示符号,剩余位表示数值 反码 正数的反码是其

京东购物车分页方案探索和落地

随着京东购物车应用场景的丰富化和加车渠道的多元化,京东购物车的商品容量从2015年至今一直在逐步增加。

基于AIGC的京东购物助手的技术方案设想

随着AIGC的爆火,ChatGPT,GPT-4的发布,我作为一个算法工作者,深感AI发展的迅猛。最近,OpenAI的插件和联网功能陆续向用户公开,我也在第一时间试用了这些最新的功能。在OpenAI的插件市场上,我被一个可以帮助分析食谱,并生成购物清单的功能所吸引。

一种基于图片搜索视频的方案

随着移动互联网发展,手机端购物已成为人们生活的常态。人们在搜索商品时采用的手段也越来越丰富,当前的主要搜索方式是文本搜索与拍照搜索。

体验提升-一个“小技巧”彻底解决锦礼商品可见不可售

锦礼平台,作为一家企业级B2B2C电商平台,同时服务于企业客户和企业员工,因此需要遵循企业客户的政策规范,确保商城内商品符合规定,并提升员工购物体验。然而,这种独特的运营模式导致锦礼平台上商品的可见不可售问题较为突出,对最终消费者的购物体验和平台的产品和业务产生了较大的负面影响。

大型 3D 互动开发和优化实践

我们团队接到了食品频道的一个互动项目的开发需求,希望通过 3D 场景的展示和互动方式,作为对未来购物的一种尝试与探索,满足用户对未来美好新奇的一个需求。将购物场景化、娱乐化,给用户带来美好的购物感受。

618京东到家APP-门详页反爬实战

一、背景与系统安全需求分析 1. 系统的重要性 上图所示是接口所属位置、对电商平台或在线商店而言,分类查商品都是很重要的,通过为用户提供清晰的商品分类,帮助他们快速找到所需产品,节省浏览时间,提升购物效率,是购物结算产生GMV的核心环节。那么电商平台为什么都很看重商品信息的爬取? a. 数据收集和分