文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

抖音 iOS 推荐 Feed 容器化总结

2024-12-01 17:40

关注

Feed 容器多场景下承载业务

Feed 容器承载了基础功能、直播、登录、登出、性能监控、预加载等多个功能。

由于之前没有做好管控,导致容器中业务相互耦合严重,业务边界不清晰,开发过程中稍有不慎,就会对其他业务造成影响。

而且随着业务迭代,逐渐呈现劣化趋势,尤其是对于新业务接入,面对负责的代码无从下手。

业务迭代效率低

由于代码都在容器类中直接修改,一个版本经常会有多个业务在容器中进行修改导致冲突的情况,此时就需要多方进行 review,保证改动不出问题,往往还要平台业务的同学进行支持,业务的整体迭代效率比较低。

防劣化&监控缺失

业务耦合,对代码改动没有监控,导致 FeedViewController 越来越膨胀。因为没有合理架构导致无法做拆分,代码劣化越来越严重,而且基于现状无法进行防劣化。

目标方案

为了解决上述问题,首先设定好目标,然后根据目标提出解决方案,最终落地实现,验证目标是否达成。

目标

思路

根据上述的目标,从下面四点进行思考和设计:

方案

针对 Feed 容器内部多场景、多业务耦合导致整体维护困难,新业务接入成本高的问题,首先按照场景、业务和功能维护进行拆分梳理。在拆分完成后为了方便各个业务进行维护,设计了 ControlerKit 工具实现了生命周期方法的分发,并且通过 Context 进行状态管理,实现了各个业务间的通信和状态维护。

整体架构

基础容器

Feed 基础容器,采用组件化框架,支持基础组件和业务组件的动态组合和扩展,由业务无关、统一的列表形态组成,通过数据驱动页面展现。同时对外暴露生命周期事件,方便组件进行监听。其中基础容器由平台方进行统一维护,并提供了完善的监控体系,方便进行问题的定位和追查。

基础组件

Feed 容器的基础组件部分,采用的方式是平台方统一进行维护。目前的基础组件,主要包括播放控制、播放策略优化、列表预加载以及页面管理等。

其中,全屏 Feed 相关的基础组件,为多业务共用,具备可复用、可扩展等优势。

业务组件

业务组件是和业务强相关的组件,业务方可以根据自身的需要进行灵活定制,组件本身可插拔,由各业务方进行维护。

应用场景

业务方基于 Feed 容器,组合业务组件和基础组件构建的页面,在构造过程中可以基于配置文件实现容器的定制,比如推荐和关注。

容器化工具

多个业务耦合在同一个容器中,导致容器类越来越臃肿,一方面造成各方同时维护越来越困难,另一方面对于新业务和新同学接入十分不友好,需要花费很多时间熟悉上下文以避免改动对其他业务造成影响。

为此设计了 ControllerKit 库,该库实现了复杂页面的分发,解决 ViewController 臃肿问题,规范代码拆分标准,提供分发方法的能力。各个接入方按照规则注册后,实现自己关心的生命周期方法,并在方法中实现对应的逻辑即可。

ContainerViewController

ContainerViewController 是容器 ViewController,实现了 ContainerProtocol,保存了上下文环境,负责了各个生命周期方法的分发。

ContainerProtocol

声明了容器对外提供的属性和方法,方便各个 SubController 进行访问。

ControllerProtocol

声明了基础的声明周期和共有的方法。

Controller

Controller 是将 ViewController 中的代码拆分出来的子模块,可以接收分发出来的 viewDidLoad、viewWillAppear 等生命周期及自定义方法调用,还可以向 ViewController 中添加子 View。

ControllerManager

ControllerManager 负责 Controller 的注册、管理、方法分发。通过 classNameArray 返回 Controller 的字符串类名数组即可,可以支持 Controller 在其他仓库的能力

Manager 需要声明分发的 Controller 协议,只需要声明,不需要实现,Manager 内部会通过消息转发机制统一分发。

各角色之间的关系

ContainerViewController 实现了 ContainerProtocol,并持有 ControllerManager,各个子 Controller 注册到 ControllerManager 中,各个 Controller 可以通过 ContainerProtocol 访问容器的能力,ControllerManager 通过 ControllerProtocol 里面声明的方法进行分发。

比如:ContainerViewController 初始化后调用 viewDidLoad 时,会通过 ControllerManager 依次分发到实现该方法的 controller 中,各个 Controller 在自己的 viewDidLoad 方法中实现自己的逻辑即可。

Controller 优先级

Feed 容器的实现

根据 ControllerKit 对 Feed 容器的类结构改造如下所示

基于 ControllerKit 的设计和实现

各个类和协议的介绍:

FeedContainerProtocol

FeedControllerProtocol

Context 与 ContainerProtocol 的定位和区别

业务组件定义

重构后业务迭代方式

防劣化建设

为了防止随着业务的迭代,Feed 容器逐渐劣化,需要进行防劣化建设。首先进行框架和业务分仓:

新方案优势

接入示例

以下以兴趣选择和业务为例,介绍新老业务的接入。

新功能接入 - 兴趣选择

兴趣选择是新的类型的卡片,需要进行卡片注册并处理相关逻辑。

历史方案

FeedViewController 直接进行修改,包括如下内容:

新方案

抽取单独的业务 Controller

Controller 注册到 ControllerManager

在对应的 Controller 中进行自己的业务处理即可,不需要了解容器本身的其他业务逻辑

存量功能拆分 - Feed 监控

Feed 监控功能在 FeedTableVC 中处理了很多业务,而且这些逻辑也其他业务存在着耦合。

采用新方案进行拆分

首先创建 FeedMonitorController,增加业务相关的属性、生命周期方法中实现对应的逻辑,之后抽取单独的业务 controller 在生命周期方法中处理熟人相关逻辑。同时注册到 controllerManager 中,并设置 AB、原有代码判断 AB。上线验证,全量后删除容器老代码。之后业务自闭环,再进行迭代时直接在 FeedMonitorControlle r 内容修改即可。

当前进展&后续规划

规划和节奏

1

2

3

4

梳理现状;

重构方案设计和评审;
组件化框架设计和开发;
Feed 能力的设计和定义

新增功能基于新组件开发;
存量业务组件拆分和验证

业务接口合理化:Feed 容器对外暴露能力,业务调用;
基础能力接口合理化:Feed 容器暴露给组件的能力,播控、数据操作等

组件化框架横向应用,详情页 Feed 等使用新架构

重构后的收益

老容器

新容器

因为业务耦合,需要了解 Feed 的结构和多业务的细节,新同学熟悉的时间需要 2 天左右;在实现过程中,由于多个业务同时进行迭代,相互影响,质量无法保障

只需要在自己的业务 Controller 开发即可,无需关心容器的结构以及其他业务方,极大的提高了开发和迭代效率;改动不影响其他业务线的代码,保障了代码的稳定性

版本进行了映射

版本

新方案 MR

老方案 MR

老方案占比(老 MR/(新 MR+老 MR))

1.7 - 2.0

39

19

32.8%

1.3 - 1.6

31

18

46.15%

0.9 - 1.2

25

13

34.21%

0.5 - 0.8

16

23

58.9%

0.1 - 0.4

12

19

61.2%


来源:字节跳动技术团队内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯