内容管理系统的版本控制:构建高效追踪与管理机制

本文详细介绍了在一个快速发展的在线教育平台中,如何为其自研的内容管理系统Apollo引入版本控制功能。文章深入探讨了版本控制的必要性、实施的具体技术方案(包括调整数据结构、优化查询性能)以及最终带来的可追溯性、性能提升和内容管理效率等核心益处。

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

每日大量的微小到重大的编辑,使得内容和网站管理员难以跟踪所有内容变更,这正是内容版本控制发挥作用的地方。它通过跟踪内容更新的不同版本来回答简单的日常操作问题,例如:

  • 进行了哪些编辑?
  • 内容何时被更改?
  • 谁进行了更改?
  • 先前内容与更新后的内容之间有何差异?

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

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

为何需要版本控制

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

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

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

由于程序必须遍历整个数据库,每个查询的响应时间也在增加。缓慢的响应时间影响了整个网站的性能,这是我们无法接受的。所有这些问题都迫切需要为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 设计