随着每日大量或大或小的编辑工作,跟踪所有内容变更对内容和网站管理员来说变得颇具挑战,这正是内容版本控制发挥作用的地方。它是一种跟踪内容更新不同版本的概念,用以回答简单的日常操作问题,例如:
- 进行了哪些编辑?
- 内容何时被更改?
- 谁做出了更改?
- 先前内容和更新后的内容之间有何区别?
内容版本控制回答了所有这些问题,使日常操作高效且无缝。理解内容版本控制的最佳示例是 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 这样的版本控制系统中获得了灵感。