当前位置:首页 > 科技  > 软件

通用详情页的打造,你学会了吗?

来源: 责编: 时间:2024-07-12 17:22:30 59观看
导读背景介绍图片大家都知道,详情页承载了站内的核心流量。它的量级到底有多大呢?我们来看一下,日均播放次数数亿次,这么大的流量,其重要程度可想而知。在这样一个页面,每一个功能都是大量业务的汇总点。作为用户核心消费场景,详

背景介绍

svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

图片图片svC28资讯网——每日最新资讯28at.com

大家都知道,详情页承载了站内的核心流量。它的量级到底有多大呢?svC28资讯网——每日最新资讯28at.com

我们来看一下,日均播放次数数亿次,这么大的流量,其重要程度可想而知。svC28资讯网——每日最新资讯28at.com

在这样一个页面,每一个功能都是大量业务的汇总点。svC28资讯网——每日最新资讯28at.com

作为用户核心消费场景,详情页不仅需要承接各种业务的转化,还要负责展示各业务在播放页的功能。svC28资讯网——每日最新资讯28at.com

可以说,播放页的代码复杂度属于客户端最高的代码之一,这不仅因为播放页本身的功能复杂,还因为它需要融合大量外部业务功能。svC28资讯网——每日最新资讯28at.com

复杂的功能自然会带来较高的代码复杂度,而高代码复杂度往往意味着高代码维护成本。svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

明确需求

svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

图片图片svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

我们来看一下没有做这个项目之前的状态。如图所示,他们分别为三个业务团队各自维护。页面间相互独立。能力无法复用。svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

图片图片svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

通过这个项目,我们要将他们融合成了一个页面。产品的诉求就是将他们融合为一个,来达到多业务形态统一的目标。svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

图片图片svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

但是,这三个详情页并不像产品想象的那么简单。svC28资讯网——每日最新资讯28at.com

每个业务都有自己的特殊形态,如大型活动态、主客态、播单态、PUGV/OGV态等一系列业务形态。svC28资讯网——每日最新资讯28at.com

每种形态都有自己的特殊逻辑,而且这些业务形态间还可以互相切换。svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

需求分析

svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

为了更好地达成目标,我们需要进行如下思考:svC28资讯网——每日最新资讯28at.com

  • 从业务角度:

要解决多业务形态不统一的问题。例如,产品既想要UGC大型活动的能力,又想要OGV的多视角功能。svC28资讯网——每日最新资讯28at.com

但这两个能力在之前分别是两个业务团队各自开发的,无法复用,产品在业务选择上无法兼得。svC28资讯网——每日最新资讯28at.com

  • 从效率角度:

要解决迭代方式不统一的问题。例如,进度条体验优化需求,产品在给UGC团队提需求的同时,还要复制一份给OGV团队。svC28资讯网——每日最新资讯28at.com

两个业务方的开发和测试都需要进入这个项目,并且双方的开发进度和排期可能不一致。如果产品强烈要求同一版本上线,还需要协调各方资源。svC28资讯网——每日最新资讯28at.com

  • 从质量角度:

要解决如何保障稳定性的问题。例如,多团队协作,之前都是组内同事协作开发,现在融入了两个新的业务团队,我们该如何保障稳定性。svC28资讯网——每日最新资讯28at.com

  • 从团队角度:

要解决如何让新人快速上手的问题。正常情况下,新人想要进入开发必须对这个系统足够了解后才行。svC28资讯网——每日最新资讯28at.com

更何况现在变成了三个业务融合的页面。有没有一种手段,让新人无需关心复杂的业务形态和业务逻辑,只需要关注自己的需求?svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

具体方案

svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

针对以上问题,我们可以总结出通用详情页框架必须满足以上三点,分别为:复用性,灵活性,稳定性svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

图片图片svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

接下来我们继续对多业务形态进行分析。svC28资讯网——每日最新资讯28at.com

首先我们从横向上进行拆解,通过对比,我们可以发现svC28资讯网——每日最新资讯28at.com

多业务形态间其实有很多的相同模块。如互动,弹幕发送框,相关推荐等。svC28资讯网——每日最新资讯28at.com

从纵向上进行拆解,我们也可以发现很多相同模块,如弹窗管理器,主题组件,转场组件等。svC28资讯网——每日最新资讯28at.com

那么从横向和纵向上我们发现,多种业务形态间其实有很多可以复用的能力。svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

图片图片svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

基于前面的思考,我们设计了一套通用详情页的框架。将其分为三层:svC28资讯网——每日最新资讯28at.com

  1. 业务层:将业务模块分为两类,能够在多业务间复用的模块抽象到通用业务,业务独有模块则由各业务自行负责。
  2. 组件层:抽象出各种通用组件,业务方可自由选取和组装。
  3. 框架层:抽象生命周期管理、数据管理等核心逻辑,以此来保证整个详情页的稳定性。

这样我们就初步解决了复用性的问题,但是随之而来的就是灵活性问题。svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

图片图片svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

我们以实际场景为例,相关推荐模块在课堂态不展示,但是在ugc和ogv下需要展示,另外他的点击事件在ugc和ogv下还会出现差异。svC28资讯网——每日最新资讯28at.com

同时相关推荐模块还强依赖简介模块。因为简介模块也是一个通用组件,业务方可以自由替换。svC28资讯网——每日最新资讯28at.com

如果哪天业务方替换了了简介模块,那相关推荐模块将无法正常运行。svC28资讯网——每日最新资讯28at.com

从相关推荐这个例子我们可以得出如果想让业务模块复用,必须满足两个条件。svC28资讯网——每日最新资讯28at.com

  1. 支持业务异化,即允许业务能插入自定义逻辑,否则现在抽象的通用模块在迭代的过程一定会变成非通用,或者里面掺杂各种if else逻辑来支持异化。
  2. 必须保证模块间相互独立,因为所有业务逻辑在此框架下都变成了模块,模块是可以由业务方自由选择的。

svC28资讯网——每日最新资讯28at.com

图片图片svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

引入依赖注入

svC28资讯网——每日最新资讯28at.com

因此,我们需要在流程和模块中加入依赖注入的能力,用于业务方实现差异化逻辑。svC28资讯网——每日最新资讯28at.com

业务方可自行插入自己的业务逻辑,并选择或替换业务模块。来解决模块间的耦合。svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

定义依赖注入容器svC28资讯网——每日最新资讯28at.com

public class BlocStore {    typealias StoreLock = RecursiveLock    typealias StoreTable = [String: BlocTable]     private let lock: StoreLock = StoreLock()    private lazy var storeTable: StoreTable = [:]} extension BlocStore {    public func register<Service>(service: Service.Type = Service.self, to: Bloc.Type) {        let key = "/(service)"        lock.lock()        defer { lock.unlock() }        serviceTable[key] = to    }     @discardableResult    public func optional<Service>(service: Service.Type = Service.self) -> Service? {        let key = "/(service)"        lock.lock()        defer { lock.unlock() }        let service = resolve(bloc)        return s    }} // Bind and unbindextension BlocStore {    public func bindBloc(bloc: Bloc) {     }     public func unbindBloc<T: Bloc>(_ blocType: T.Type) {     }} // BlocLifeCycleextension BlocStore {    func onStart(bloc: Bloc?) {        bloc?.onStart()    }     func onPause(bloc: Bloc?) {        bloc?.onPause()    }     func onResume(bloc: Bloc?) {        bloc?.onResume()    }     func onStop(bloc: Bloc?) {        bloc?.onStop()    }}

svC28资讯网——每日最新资讯28at.com

组件注册svC28资讯网——每日最新资讯28at.com

// 业务方根据业务逻辑可以注入不同的实现register(service: XXXProtocol.self, to: ABloc.self) // A业务形态register(service: XXXProtocol.self, to: BBloc.self) // B业务形态

svC28资讯网——每日最新资讯28at.com

组件解析svC28资讯网——每日最新资讯28at.com

let s: XXXProtocol = store.optional()

svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

引入scope

svC28资讯网——每日最新资讯28at.com

scope分为页面级和业务级两种scope:svC28资讯网——每日最新资讯28at.com

class VDScope {    public static let core = "store.core.scope"    public static let biz = "store.biz.scope"}

svC28资讯网——每日最新资讯28at.com

定义 Scope 管理来管理模块的生命周期:svC28资讯网——每日最新资讯28at.com

  • Page scope的生命周期与页面保持一致,Biz scope与业务形态的生命周期保持一致。
  • 即在页面形态发生变化时,框架层会自动将bizscope下的所有模块进行销毁。
public class BlocStore {    typealias ScopeTable = [String: String]    ...     func bizTypeDidChanged() {        // 销毁上一个bizscope下所有模块        xxxx        // 初始化新bizscope下模块        xxx    }}

svC28资讯网——每日最新资讯28at.com

这样,新人进入开发时无需关注当前业务形态或业务形态切换的问题,达到快速上手的目的。svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

如何保障吞吐速度和质量稳定?

svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

在开发资源和测试资源不变的情况下,业务范围扩大了,我们该如何保障吞吐速度和质量的稳定呢?svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

图片图片svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

我们可以将策略分为三个阶段:svC28资讯网——每日最新资讯28at.com

1.开发阶段:

对于核心流程添加全链路日志,如果发现不符合预期的数据则直接抛出异常。svC28资讯网——每日最新资讯28at.com

同时进行技术埋点上报。如果是对于核心流程的修改,强制添加AB降级方案。svC28资讯网——每日最新资讯28at.com

2.测试阶段:

有些bug非常隐蔽,在用户体验上可能没有任何差异,但内部流程或数据可能已经发生异常。svC28资讯网——每日最新资讯28at.com

对于类似问题,测试根本无法发现。导致此类问题流入线上的风险。我们可以通过添加监控和告警,让我们及时发现问题。svC28资讯网——每日最新资讯28at.com

3.灰度/线上阶段:

我们可以通过添加监控和告警,让我们及时发现问题。svC28资讯网——每日最新资讯28at.com

具体实施方案:svC28资讯网——每日最新资讯28at.com

首先,我们对通用详情页里核心流程添加了全链路日志,并为日志服务添加了两项额外能力:svC28资讯网——每日最新资讯28at.com

如果发现日志类型为Error,内部自动触发DEBUG弹窗提醒,并上报技术埋点,达到对线上稳定性的监控。svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

图片图片svC28资讯网——每日最新资讯28at.com

svC28资讯网——每日最新资讯28at.com

同时,搭建离在线数据报表和异常告警,进一步保障稳定性。svC28资讯网——每日最新资讯28at.com

至此,搭建了通用详情页从发现问题到定向拉取再到快速定位的闭环。svC28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-100716-0.html通用详情页的打造,你学会了吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 使用 Docker 搭建 NodeJS 开发环境是一种什么体验?

下一篇: 一文搞懂 @Async 注解原理

标签:
  • 热门焦点
  • 三言两语说透设计模式的艺术-简单工厂模式

    三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • 深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    深度探索 Elasticsearch 8.X:function_score 参数解读与实战案例分析

    在 Elasticsearch 中,function_score 可以让我们在查询的同时对搜索结果进行自定义评分。function_score 提供了一系列的参数和函数让我们可以根据需求灵活地进行设置。近期
  • 只需五步,使用start.spring.io快速入门Spring编程

    只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • 虚拟键盘 API 的妙用

    虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • JVM优化:实战OutOfMemoryError异常

    JVM优化:实战OutOfMemoryError异常

    一、Java堆溢出堆内存中主要存放对象、数组等,只要不断地创建这些对象,并且保证 GC Roots 到对象之间有可达路径来避免垃 圾收集回收机制清除这些对象,当这些对象所占空间超过
  • 2天涨粉255万,又一赛道在抖音爆火

    2天涨粉255万,又一赛道在抖音爆火

    来源:运营研究社作者 | 张知白编辑 | 杨佩汶设计 | 晏谈梦洁这个暑期,旅游赛道彻底火了:有的「地方」火了&mdash;&mdash;贵州村超旅游收入 1 个月超过 12 亿;有的「博主」火了&m
  • 大厂卷向扁平化

    大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    三星获批量产iPhone 15全系屏幕:苹果史上最惊艳直屏

    按照惯例,苹果将继续在今年9月举办一年一度的秋季新品发布会,有传言称发布会将于9月12日举行,届时全新的iPhone 15系列将正式与大家见面,不出意外的话
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
Top