在内容管理系统中引入版本控制:从复杂拓扑到高效管理

本文详细阐述了在线教育平台upGrad如何为其自研的内容管理系统Apollo引入版本控制功能。文章深入探讨了原有基于网状引用拓扑架构的性能瓶颈与管理难题,并系统介绍了通过重构数据存储模型、分离版本栈等技术方案实现高效追踪、回滚与内容管理的过程及其带来的显著收益。

随着每日大量或大或小的编辑工作,跟踪所有内容变更对内容和网站管理员来说变得颇具挑战,这正是内容版本控制发挥作用的地方。它是一种跟踪内容更新不同版本的概念,用以回答简单的日常操作问题,例如:

  • 进行了哪些编辑?
  • 内容何时被更改?
  • 谁做出了更改?
  • 先前内容和更新后的内容之间有何区别?

内容版本控制回答了所有这些问题,使日常操作高效且无缝。理解内容版本控制的最佳示例是 Google 文档。您可以查看版本历史记录、实时更改并轻松回滚到文档的任何版本。

由于我们是一个快速发展的在线高等教育平台,我们的网站 upGrad.com 需要不断进行更改。直到大约两年前,网站上的内容编辑工作仍然由技术团队完成。这包括有关我们课程的信息,以及它们如何为个人职业增添价值。尽管这些数据大部分以 JSON 形式存在,但更新网站需要不断的代码更改。为了解决这个问题,我们构建了 Apollo,这是我们内部的内容管理系统(CMS)。Apollo 使我们能够动态地添加、更改和删除内容。在这两年中,内容编辑流程得到了简化,现在各个项目负责人拥有他们各自的内容管理权。但正如软件工程中的常理——你永远不会完全解决一个问题,你只会变得足够成熟去解决更大的问题。在带来极大灵活性的同时,Apollo 也带来了一些复杂性,这最终引发了引入版本控制的需求。

为何需要版本控制

如前所述,Apollo CMS 允许我们的内部程序员和管理员无忧地编辑网站内容。但随着时间的推移,管理每一次编辑的记录变得繁重。当我们意识到使用 Apollo 编辑内容正在产生问题时,我们开始寻找解决方案,并且我们发现版本控制可能是一个潜在的解决方案。那么,是哪些问题让我们不断寻找像版本控制这样的解决方案呢?

我们过去在 Apollo 中为组件、布局和页面设置独立的集合。该 CMS 由一个使用 MongoDB 数据库的 Nodejs 服务器支持。初始设计更像是一个关系型数据库。为了表示一个页面的数据,我们将组件的引用包含到布局中,然后将布局的引用包含到页面中。这导致了一个网状拓扑结构,每个文档都与多个组件、布局和页面相连。

随着数据量和编辑频率的增加,在这样的基础设施下跟踪每一次编辑具有挑战性。此外,删除或回滚到网站任何先前的时间点也很麻烦。例如,如果我们想删除任何特定文档,我们必须遍历整个网状拓扑结构,查找与该集合关联的所有组件、布局和页面的引用。因此,从内容经理到我们开发人员,要删除或恢复到任何先前更新的网页,对每个人来说都很繁重。

每个查询的响应时间也在增加,因为程序必须遍历整个数据库。缓慢的响应时间影响了整个网站的性能,这是我们无法接受的。所有这些问题都促使我们在 Apollo 中引入版本控制变得迫切。

如何实现版本控制

我们在 Apollo 中引入了版本控制,方法是消除了实例引用的步骤;相反,我们开始在每个集合中存储实际的实例。这降低了网状拓扑的复杂性,现在所有内容(连同实际实例)都保存在一个集合中。因此,一切操作:跟踪、更改、恢复和删除内容都变得更加直接。

我们的 CMS 现在存储着关于谁在何时更改了什么内容的数据。即使是微小的编辑也会创建整个集合的新版本。管理员和内部程序员现在可以选择并排比较更改,以查看它们将如何影响网站的整个布局。

我们创建了两个页面栈,一个仅用于存储最新页面版本,另一个用于保存最新和旧版本。每当调用查询以检索最新版本或有人访问网站时,程序将从具有最新版本的栈中获取代码并输出结果,以减少响应时间并提升性能。另一方面,如果管理员想要比较两个版本,他只需进入版本控制界面,选择任意两个版本来查看它们之间的差异。

向内容版本控制的无缝过渡

让我们看一个基本示例,来理解旧的 Apollo 与支持版本控制的新 Apollo 之间的区别。下表展示了版本是如何创建的,以及集合如何随着每次编辑而改变。

全局版本 内部版本 (页面) 内部版本 (布局) 内部版本 (组件)
1 Page Layout Component
2 Page Layout Component 1
3 Page Layout Component 2
4 Page Layout 1 Component 2
5 Page Layout 1 Component 3
6 Page Layout 2 Component 3
7 Page Layout 2 Component 4
8 Page Layout 2 Component 5

在没有版本控制的情况下,管理员必须通过查询来搜索整个网站代码,以添加、更改、回滚或删除任何内容。有了版本控制,管理员只需选择一个特定的全局版本号,即可找出该版本的所有详细信息。只需点击几下,就可以跟踪更改、回滚或删除内容,而无需担心相关的实例引用。

CMS 版本控制如何帮助我们?

在 CMS 中引入内容版本控制的这一举措为我们带来了许多好处,最重要的有:

  • 易于追溯性:借助版本控制,我们可以跟踪甚至微小的更改和细节,例如谁进行了更改、更改了什么以及何时进行的更改。它还允许我们通过高亮显示所做的更改来比较两个版本的数据。
  • 增强的性能:网站的速度和整体性能得到了改善。例如,要导航一个包含 3 个布局和 15 个组件的页面,在原来存储实例引用的每个集合模式下,程序必须运行 1 x 3 x 15 = 45 个查询来提供结果。但现在,有了版本控制,由于所有内容都在一个集合中,程序只需运行一个查询即可获得输出。这带来了性能的提升。
  • 高效的内容管理:版本控制使我们的内部程序员、内容经理和管理员能够高效地管理整个网站。从添加、更新、更改、恢复到删除网站上的内容,一切都变得轻松无忧。

在 Apollo 中引入版本控制帮助我们克服了高效管理网站的障碍。这不仅增加了可追溯性,还使恢复到旧版本变得容易,并提高了内容的稳定性。作为工程师,这是一个有趣的问题解决过程,我们从像 git 这样的版本控制系统中获得了灵感。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计