内容管理系统的版本控制之旅:从复杂到高效

本文详细阐述了在自研的内容管理系统 Apollo 中引入版本控制的完整过程,涵盖了面对数据网状引用带来的管理混乱和性能挑战,如何通过重构数据存储架构(将引用替换为实际实例)来简化系统、提升查询效率和实现内容的便捷追溯与回滚。

在内容管理系统中引入版本控制

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

  • 进行了哪些编辑?
  • 内容何时被更改?
  • 谁做出了更改?
  • 新旧内容之间有何差异?

内容版本控制解答了所有这些问题,使日常运营高效且顺畅。理解内容版本控制的最佳例子是 Google 文档。你可以查看版本历史、实时更改,并无缝地回滚到文档的任何版本。

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

原因

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

我们过去在 Apollo 中为组件、布局和页面分别设立独立的集合。该 CMS 后端是一个使用 MongoDB 数据库的 Node.js 服务器。初始设计更像是一个关系型数据库。为了表示一个页面的数据,我们在布局中包含了组件的引用,然后在页面中又包含了布局的引用。这导致了一种网状拓扑结构,每个文档都连接到来自各个组件、布局和页面的多个引用。

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

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

实现方法

我们通过消除实例引用这一步骤,在 Apollo 中引入了版本控制;取而代之,我们开始在每个集合中存储实际的数据实例。这降低了网状拓扑的复杂性,现在所有包含实际实例的内容都保存在一个集合中。因此,跟踪、修改、恢复和删除内容都变得更加直接。

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

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

无缝过渡到内容版本控制

让我们看一个简单的例子来理解旧版 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 这样的版本控制系统中获得了灵感。如果你对解决类似和其他有趣的问题感兴趣,请查看我们的招聘页面。我们一直在寻找有抱负、有才华的人!

欢迎访问 upGrad.com,查看我们完全在线的项目!

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