如何以MLOps保障时效表达稳定性|得物技术

一、背景

背景1.jpg
站外商详,功能较为单一

站外商详(H5/小程序)一直以来采用detailV3老接口数据,在样式和功能上,不能与最新版的客户端同步对齐,各个端之间的使用体验之间存在差异。

从唤端数据可以看出来,App商品详情页分享后的唤端成功率非常高,能够达到75%以上,代表着这些用户都是带有明确目标和意愿来App内部进入购买商品,ROI好的高净值用户:

背景2.jpg

而对于日均pv占据站外流量的TOP3的站外商详来说,唤端价值相对比较高的同时,uni-app多端同构方案的SPA架构限制了H5与小程序页面性能体验天花板,长期以来站外商详的性能指标在前端平台的性能统计大盘下比较靠后:

背景3.jpg
背景4.jpg

从上面的性能数据监控并对比源码搭建页面的性能数据可以看出来,旧版的商详性能数据并不理想,对用户在站外商详页的转化率有一定影响:

  • 平均fmp:2.75s;
  • 75分位平均fmp:2.74s——对比源码搭建大盘1.29s多了1.45s;
  • 平均lcp:3.29s;
  • 75分位平均lcp:4.06s——对比源码搭建大盘1.46s多了2.6s;

综上背景,我们决定重构站外商详,一方面可以接入得物后台最新版本的商详数据API,便于后续需求迭代,避免站外商详和App商详体验的持续割裂现象;另一方面可以同时提高站外商详的前端性能,带给用户更好的使用体验。

二、技术方案

我们本次站外商详升级到创新商详版本,放弃了原项目的uni-app多端同构方案,同时采用营销侧的技术基建——源码搭建;提高了站外秒开性能和用户体验,同时又保证了代码层面的同构开发,本文将详细介绍本次站外商详的重构与优化。

源码搭建

源码搭建是得物前端平台基于SSR架构的C端基建,本次商详重构采用源码搭建来完成重构任务,以下是源码搭建的简要介绍:

源码搭建.jpg

源码搭建介绍:

源码搭建是利用页面搭建器现有开发组件能力快速生产页面的开发方式,业务开发不需要关心公用组件、体验、性能和稳定性基础建设,只需要在建立好的页面仓库中开发业务代码即可,集成了流水线构建会自动帮助开发构建上传。

首屏性能保障方案

  • 本次重构有一个核心诉求:提高前端页面加载性能,而提高秒开体验的核心即SSR:在Node端请求服务端数据并渲染出HTML结构直出给到浏览器;
  • 但同时商详数据是电商平台的核心数据,尤其是得物出价相关数据一直都被各种黑产爬虫关注,所以风控侧要求商详接口数据需要做加密处理。

此时就有用户体验 & 数据安全的矛盾存在:

  • 数据加密的情况下,Node端无法解密数据,此时便无法直出HTML结构,相当于降级为SPA,用户体验相较于SSR大打折扣;
  • 如果数据不加密,Node端可以解析数据做到HTML直出,但是数据安全又无法得到保障。

那么这之间的矛盾和冲突我们是如何解决的呢?

  • 将首屏数据(即对用户体验影响最大的fmp、lcp元素渲染涉及到的数据)从完整接口中拆分出来,这一部分数据跟需要加密的敏感数据无关,所以不需要加密处理;
  • 拆分出首屏数据接口,然后在SSR阶段只请求首屏数据接口,并渲染HTML结构返回到浏览器;
  • 浏览器端运行时(即用户已经在浏览器端打开了页面的时机),再通过风控请求完整的加密数据接口,并渲染到页面;
  • 通过拆分首屏接口和分离首屏数据渲染和完整数据渲染,这样就能同时保障首屏渲染速度与风控侧的加密需求。

简要流程如下图所示:

性能保障方案.jpg

同构与多环境运行

我们重构的主要目的是为了提高性能以及对接最新版服务端接口,但是又不能因为重构而放弃了以往uni-app架构下的多端同构优势,所以需要设计一套新的运行流程来适配SSR下的新商详。

H5环境下我们可以直接访问SSR架构下的新商详,但是小程序运行环境该如何运行呢?

  • 小程序的开放组件包含了webview组件,所以我们可以依靠小程序环境中的webview组件来替换原本的小程序原生页面,以下设计图大致描述了我们是如何保障一份代码,如何多环境运行的:

同构与多环境运行.jpg

风险控制/止损策略

对于pv较高且包含完整交易链路的站外商详来说,冒烟点和阻塞线上购买流程的故障是不可接受的,因此我们设计了相对来说比较完备的止损策略。

故障降级页面——旧版商详

新版商详上线后,旧版页面暂时不会下线,路径和代码依旧保持不变;因此可以作为降级页面,能够保障在新版商详出问题后无缝将流量切回旧版商详。

SSR故障降级

如果SSR侧的请求出现了不可用现象,只会影响简版数据接口的渲染,因此即便失败了也只是影响秒开性能,而不会中断正常业务流程。

灰度策略

结合前端配置中心,我们可以通过逐步灰度放量方式对命中灰度的用户采取跳转新版商详策略,同时灰度配置也可以作为紧急的回滚手段,在遇到故障时及时将灰度放量关闭,引导所有用户跳转旧版商详。

三、一些针对性重构

在商详页面的整体重构过程中,我们识别出了一些关键模块需要进行针对性的重构。这些模块的重构目标是确保它们能够有效地适配商详页面的整体架构变化,同时提升可拓展性。这些针对性重构帮助我们解决了现有迭代中的瓶颈,并在保证系统稳定性的同时,加速开发的迭代过程。

接下来我们详细介绍其中请求拦截器与业务埋点Hook的重构设计。

请求拦截器的重构

因为新版商详需要在多种场景(Node.js / 微信小程序 / 移动端浏览器)运行代码,同时可以预见的是后续会有更多场景(如:支付宝小程序等)加入运行环境。

为了保障后续更多运行环境拓展性和可维护性,我们重构了请求拦截器模块:

1、RequestInceptor类型定义:

通过从定义层面区分不同环境,可以有效保障拦截器运行在有效环境,也从逻辑底层避免了一些可以前置避免的类型错误(比如在node环境下访问window等):

export interface RequestInceptor<T = InternalAxiosRequestConfig<unknown>> {
   
  (): {
   
    // node环境的请求拦截
    nodeEnv: (config: T, runtimeConfig?: RunTimeConfig) => Promise<T> | T;
    // 浏览器环境的请求拦截
    clientEnv: (config: T, runtimeConfig?: Pick<RunTimeConfig, 'query') => Promise<T> | T;
  };
}

2、RequestInceptor的具体实现:

每个RequestInceptor都是一个函数,根据环境返回不同的处理逻辑,示例代码:

const h5CommonHeaders: RequestInceptor = () => 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值