从巡课项目总结项目重构经验

什么是巡课?

巡课是会议场景与教育场景结合的产品,其主要功能是帮助学校或者教育机构更好的巡视各班级教室的上课情况。巡课分为两场不同的场景,一种是巡课,即通过画面聚合结合轮询提升巡视效率;另一种事监课,即参与到教室的会议中,查看教室上课的详细场景。

巡课的功能?

巡课包括如下的功能:按照组织部门巡课、多画面、自动或手动轮询、全屏巡课、特殊巡课、声音管理等等。

巡课的三个重点

调度效率

调度具有高成本的特点

巡课的核心成本在于终端调度,包括终端媒体、声音等调度,加之巡课的规模问题,调度的成本是相对较高的。调度的过程链路较长,从页面到SDK到信令到媒体,在媒体端的成本是最高的。提升巡课效率的关键在于提升调度的效率。

如何从终端页面降低调度的成本:

  • 精准调度:过滤掉无效的调度请求,尤其在于切换部门的场景。
  • 增量调度:舍弃全量调度,通过DIFF两次调度的结果实现增量调度。
  • 分时调度:对调度的命令进行归并和分时发送,将开始调度和结束调度的命令分开来以提升稳定性。
  • 缓冲调度:对将要结束调度的终端进行缓冲,加入到延时队列,并且可以通过不同的规则设置延时优先级,在需要重新调度该设备时直接激活设备。、

应用于不同规则的过滤器

终端设备在核心循环中应用不同规则的过滤器进行处理,提升循环下游模块的处理效率,应当保证PageManager、LayoutManager足够的高效。

渲染和请流的效率

请流可能会触发重新渲染,按照正常的请流节奏即可。渲染函数必须被节流,并且能够被 React 调度器所调度。

安全性和稳定性

触发分页器重新分页的来源有两种,一种是调度请求,一种是调度更新。调度更新主要来源于成员状态的更新。成员最新的状态来源有两种,信令通知和服务器通知,来源比较分散。成员的更新会触发重新渲染,因此必须使用任务队列进行调度,不然容易产生安全性问题,比如状态变化泛洪。巡课必须守住每一个渲染的入口,以解决消息通信的同步问题,提升应用的安全性。

任务队列是节流的很好的方法,可以通过调整任务的处理规则实现不同的任务处理场景,比如:

  • 成员更新任务队列。简单的分时处理任务。
  • 调度任务队列。优先处理首个任务,只关注最新的任务。
  • 信令调度任务队列。优先处理首个任务,对分时内的任务进行归约、拆分。

队列可以保证在各种极端场景中,任务都能够根据应用的处理效率、处理规则正确的被处理,极大的提升安全性和稳定性。

灵活性

模块与门面模式

在巡课中,不同的模块具有不同的职责,应该保持模块间的独立性和低耦合。模块的更新使用发布订阅的消息机制,同时可以将消息分发能力暴露给外部,使整体具有更好的可定制性。

另外,采用PatrolManager作为模块间的门面,隐藏内部复杂的处理过程,将统一的API暴漏给外部使用。

消息机制

消息机制为相互独立的模块之间提供了通信渠道,成为模块间沟通的桥梁。同时消息机制也可以给外部提供更容易扩展的定制能力。

视图与逻辑分离

视图与逻辑分离是提升代码可复用性的重要手段。高可复用的代码应该与视图解耦合,提过工具的方式为视图提供数据和渲染支持。在巡课设计中分成如下几层:

  • 核心层:提供巡课的核心功能。
  • 视图组件层:提供灵活的业务组件提升构建视图的效率。(与框架相关)
  • 视图层:与具体业务高度相关的视图。

抽离业务

具体的业务代码不应该耦合到核心代码中。如果非核心代码或者与具体业务高度耦合的逻辑,应该从切面灵活嵌入。

巡课的架构

巡课架构图:

巡课架构图

重构的方式

  • 理解需求:充分理解项目需求,对需求发展的时间线有一定的了解。梳理核心功能和功能细节,针对重构进行标记。不可漏掉功能,也不可弄错功能。
  • 梳理代码:阅读理解旧代码,梳理那些代码需要重构,以什么方式重构,那些代码则需要保持不变。
  • 方案与计划:形成重构的架构方案和时间排期,评估风险。
  • 充分自测:完善自测系统,对核心功能做充分的自测。
  • 提前提交QA:提前让QA了解重构的版本,以提早的发现问题。
  • 充分测试与回归:全面测试,对容易出现问题的场景做重点测试。