商品准时达,购物不抓瞎,快来学习转转履约时效新姿势

开发 前端
转转履约时效系统的构建,是对用户体验的高度重视与不懈追求的体现。从精准的预计送达时间计算逻辑,到应对高并发的巧妙技术方案,再到不断优化的次日达等筛选功能,转转始终致力于为用户打造一个高效、可靠的购物环境。

1 履约时效是什么?

履约时效,简称Promise,对于消费者来说,可以让他们更好地规划自己的时间和需求,知道自己购买的商品能够在特定时间内到达,有助于消费者做出合理的决策,并减少等待的焦虑。现在各大电商平台都有展示,形式如下:

图片图片

2 转转履约时效的落地方案

如下图,在转转 APP 的商品列表页、商品详情页、确认下单页、商品筛选项等等都会有履约时效的身影,由此可见,日常获取商品的预计送达时间的QPS很高,大促时足以破万。

图片图片

2.1 预计送达时间是怎么设计的 ?

为了方便大家理解,拿小王举个例子,假设小王假期要从北京回趟老家郑州,当天从北京到郑州的高铁只有三趟,分别是以下三个车次。

图片图片

如果小王想要赶上在家吃晚饭,那就必须要坐上13:10从北京西站出发16:20到郑州东站的G521次列车,那小王怎样才能坐上这趟车呢 ?如下图:

图片图片

小王只要在11:20之前开始做午饭,就可以赶上13:10的高铁。

对于用户在转转看到的“某一时间点前支付,某天送达”是一样的道理,先看一张用户在转转下单到签收的全流程的简图(如下):

图片图片

分为订单、OMS、WMS和TMS四个模块:

  • 订单模块:用户支付后会产生订单,订单会下发给OMS创建出库单。
  • OMS模块:产生出库单后,OMS会根据策略下发不同的仓储系统(WMS),创建WMS发货单。
  • WMS模块:产生发货单后,仓储人员会操作商品出库,等待揽收。
  • TMS模块:转转跟其他物流公司合作,每天在仓库有几个固定的时间点进行揽收。

综上所述,转转预计送达时间的计算逻辑为:

  1. 根据支付后每个系统节点的流转时间,计算出用户支付后多久被物流揽收。
  2. 根据揽收时间,调用物流公司获取预计送达时间(这一步类比小王回家的故事中的高铁)。

举个例子:

图片图片

得出:

  • 今日7:30前下单,明天14:00送达。
  • 今日12:00前下单,明天22:00送达。
  • 今日 16:30前下单,后天11:00送达。

2.2 如何支撑万级QPS

首先看一次不做任何策略的获取预计送达时间的接口的耗时情况,如下图:

图片图片

很明显耗时最高的地方是根据揽收时间获取预计送达时间,其逻辑如下:

图片图片

如果用户每次请求都这么处理,显然是有很大问题的,所以我们选择了一个稳妥的方案处理这个点,那就是预热,如下图:

图片图片

每天T+1根据每个仓的每个揽收时间计算到全国任意一个区的预计送达时间,存入自己的Redis中,那么新的根据揽收时间获取预计送达时间的逻辑如下:

图片图片

然后我们将其他耗时的地方通过增加一二级缓存优化,如下表格:

查询描述

优化方案

说明

用户地址转换

本地缓存

城市名称和code 的映射关系发放入本地缓存

商品寻仓

Redis

请求一次放入Redis

仓库信息填充

本地缓存

仓库信息为低频变化数据,数据量少,可以放入本地缓存

匹配揽收时间

Redis

配置修改是次日生效,每天定时刷入Redis


最终,一次获取预计送达时间的接口耗时如下:

图片图片

2.3 次日达、隔日达以及三日达的筛选底层逻辑以及技术实现

想要筛选有哪些商品支持次日达的含义就是筛选哪些仓支持次日达,所以我们要做两件事如下图:

  1. 在商品标记上每个商品所在的仓库站点。
  2. 提供到全国任意地址支持次日达的仓站点的能力。

图片图片

如上图,到北京能够支持次日达的商品为SKUA、SKUE、SKUF。

难点

  • 我们可以想像一下,对于用户小王来筛选次日达的时候,系统不可能实时计算每个仓到小王所在地址的送达时间,判断是否次日达,假设我们有3000个仓,每个仓有三个揽收时间,那么每次筛选就要计算9000次预计送达时间,肯定不可行。

如何解决

结合上文预热预计送达时间,在其预热任务基础上增加预热时效类型,如下图:

图片图片

那存储结构怎么做?

如下图,以全国所有的省市区作为每个key,value是list对象存到redis中。

图片图片

当前存储结构检索效率有提升但非最优,从redis拿list后需内存过滤次日达或隔日达。可将时效类型抽取到key上为:省市区 + 时效类型,虽key数量增加但value元素减少,能使用户检索时响应更快,如下图:

图片图片

细心的同学应该发现了,这样仍需内存过滤,因有时间条件。如当前 11 点,上图首个次日达中仅青岛中心仓支持,此存储结构欠佳,需进一步改进,如下图。

图片图片

变动点:

  • 存储结构由原来的key-list转变为key-zset,把所有仓的所有批次(最晚支付时间)聚合成一个zset,最晚支付时间作为score,仓库信息作为value生成倒排索引。
  • 原本的存储结构是针对某个收件区的次日达,每个仓下有哪些最晚支付时间支持;现在的存储结构是针对某个区的次日达,每个时间下有哪些仓支持。

这样做的好处:用户来筛选的时候定位到key,通过当前筛选时间,range一下当前zset,取出所有比当前筛选时间大的score,然后内存里去重一下即可直接获得当前支持的仓,并且避免了大key的问题,每次操作redis只是range一个范围,不取全量。

3 结语

转转履约时效系统的构建,是对用户体验的高度重视与不懈追求的体现。从精准的预计送达时间计算逻辑,到应对高并发的巧妙技术方案,再到不断优化的次日达等筛选功能,转转始终致力于为用户打造一个高效、可靠的购物环境。

在电商行业飞速发展的当下,履约时效已成为关键竞争力之一。未来,我们有理由相信,转转将持续完善履约时效系统,以更优质的服务满足用户日益增长的需求,在电商舞台上绽放更加耀眼的光芒。

责任编辑:武晓燕 来源: 转转技术
相关推荐

2023-03-02 08:54:32

2023-03-02 08:32:41

2024-07-17 21:02:42

2024-10-28 07:10:00

scroll标记前端网格布局

2024-04-30 11:49:16

浏览器前端开发折叠屏应用

2023-06-02 11:55:02

jvm多线程并发

2021-05-26 08:21:43

@Autowired项目@Resouce

2024-01-18 15:17:56

谷歌云计算三星

2018-02-25 11:24:02

APPiPhone手机

2024-06-25 12:10:26

2019-02-27 09:08:20

Java 8StringJoineIDEA

2022-10-20 08:34:09

图像算法商品

2023-07-18 09:00:00

ChatGPT文本转语音

2024-07-12 07:08:06

2018-03-06 17:24:57

2016-09-29 22:36:40

2016-09-07 09:20:54

2017-01-06 09:25:47

2024-03-20 08:13:10

程序开发App
点赞
收藏

51CTO技术栈公众号