在内容管理系统中引入版本控制
随着每天大量的大小编辑,跟踪所有内容变更对内容和网站管理员来说变得具有挑战性,这就是内容版本控制发挥作用的地方。版本控制是跟踪内容更新的不同版本的概念,用于回答简单的日常操作问题,例如:
- 进行了哪些编辑?
- 内容何时被更改?
- 谁进行了更改?
- 先前内容和更新内容之间有什么区别?
内容版本控制回答了所有这些问题,使日常操作高效且无缝。理解内容版本控制的最佳例子是Google文档。您可以查看版本历史记录、实时更改并无缝地回滚到文档的任何版本。
背景
由于我们是一个快速扩展的在线高等教育平台,我们的网站upGrad.com需要不断更改。直到几年前,网站上的内容编辑仍然由技术团队完成。这包括关于我们项目的信息,以及它们如何为个人职业增添价值。尽管这些数据大部分是JSON格式,但更新网站需要不断进行代码更改。为了解决这个问题,我们构建了Apollo,我们内部的内容管理系统(CMS)。Apollo使我们能够动态添加、更改和删除内容。在这两年中,内容编辑已经流程化,各个项目负责人现在负责各自的内容。但正如软件工程中的真理——你永远不会完全解决一个问题,你只会变得足够成熟来解决更大的问题。随着极大的灵活性,Apollo也带来了一些复杂性,最终提出了引入版本控制的需求。
为什么需要版本控制
如前所述,Apollo CMS允许我们的内部程序员和管理员无忧地编辑网站内容。但随着时间的推移,管理每个编辑的跟踪变得繁忙。当我们意识到使用Apollo编辑内容正在产生问题时,我们开始寻找解决方案,我们发现版本控制可能是一个合适的解决方案。但是,哪些问题使我们不断寻找像版本控制这样的解决方案呢?
我们过去在Apollo上为组件、布局和页面设置单独的集合。该CMS由使用MongoDB数据库的Nodejs服务器支持。初始设计更像关系型数据库。为了表示页面的数据,我们将组件的引用包含到布局中,然后将布局的引用包含到页面中。这导致了一个网状拓扑,其中每个文档都连接到多个组件、布局和页面。
随着数据大小和编辑频率的增加,使用这样的基础设施跟踪每个编辑具有挑战性。此外,删除或回滚到网站的任何先前点也很麻烦。例如,如果我们想删除任何特定文档,我们必须遍历整个网状拓扑,并查找与该集合关联的所有组件、布局和页面的引用。因此,从内容经理到我们开发人员,删除或恢复到任何先前更新的网页对每个人来说都很繁忙。
每个查询的响应时间也在增加,因为程序必须遍历整个数据库。慢响应时间影响了整个网站的性能,这是我们无法接受的。所有这些问题导致在Apollo中引入版本控制的紧迫性。
如何实现版本控制
我们通过消除实例引用步骤在Apollo中引入了版本控制;相反,我们开始在每个集合中存储实际实例。这降低了网状拓扑的复杂性,现在所有内容,包括实际实例,都保存在一个集合中。因此,一切:跟踪、更改、恢复和删除内容都变得更加简单。
我们的CMS现在存储关于谁在什么特定时间更改什么内容的数据。即使是微小的编辑也会创建整个集合的新版本。管理员和内部程序员现在可以选择并排比较更改,以查看它们将如何影响网站的整体布局。
我们创建了两组页面堆栈,一组仅存储最新页面版本,另一组保存最新和旧版本。每当调用查询以检索最新版本或有人访问网站时,程序将从具有最新版本的堆栈中获取代码并给出输出,以减少响应时间并提高性能。另一方面,如果管理员想比较两个版本,他只需转到版本控制界面并选择任意两个版本来查看它们之间的差异。
向内容版本控制的无缝过渡
让我们看一个基本示例来了解旧版Apollo和带有版本控制的新版之间的区别。下表展示了版本是如何制作的,以及集合如何随每次编辑而更改。
| 全局版本 | 内部版本 | 布局 | 组件 |
|---|---|---|---|
| 1 | 页面 | 布局 | 组件 |
| 2 | 页面 | 布局 | 组件1 |
| 3 | 页面 | 布局 | 组件2 |
| 4 | 页面 | 布局1 | 组件2 |
| 5 | 页面 | 布局1 | 组件3 |
| 6 | 页面 | 布局2 | 组件3 |
| 7 | 页面 | 布局2 | 组件4 |
| 8 | 页面 | 布局2 | 组件5 |
没有版本控制时,管理员必须传递查询以搜索整个网站代码来添加、更改、回滚或删除任何内容。有了版本控制,管理员只需选择特定的全局版本号即可找出该版本的所有详细信息。只需几次点击即可跟踪更改、回滚或删除内容,而无需担心相关的实例引用。
CMS版本控制如何帮助我们?
在CMS中引入内容版本控制的这一举措为我们提供了许多好处,最重要的有:
易于追溯:通过版本控制,我们可以跟踪甚至微小的更改和细节,例如谁进行了更改、进行了哪些更改以及何时进行了更改。它还允许我们通过高亮显示所做的更改来比较两个版本上的数据。
增强的性能:网站的速度和整体性能得到了改善。例如,要导航具有3个布局和15个组件的页面,程序必须运行1×3×15=45个查询来提供结果,因为每个集合都存储了实例引用。但现在,有了版本控制,由于所有内容都在一个集合中,程序只需运行单个查询即可获得输出。这导致了性能的增强。
高效的内容管理:版本控制允许我们的内部程序员、内容经理和管理员高效地管理整个网站。从添加、更新、更改、恢复到删除网站上的内容,一切都变得无忧且简单。
在Apollo中引入版本控制帮助我们克服了高效管理网站的障碍。这不仅增加了可追溯性,还使回滚到旧版本变得容易,并提高了内容稳定性。作为工程师,这是一个有趣的问题来解决,从像git这样的版本控制系统中获得灵感。