马丁·福勒,ThoughtWorks首席科学家,一位软件开发方面的著作者和国际知名演说家,专注于面向对象分析与设计,统一建模语言,领域建模,以及敏捷软件开发方法,包括极限编程。他在2001年创作了“敏捷软件开发宣言”,写就五本软件开发方面的书籍。

分析模式:可复用的对象模型(英文版)

重构:改善既有代码的设计

企业应用架构模式(英文版)

马丁·福勒作序推荐:持续交付:发布可靠软件的系统方法

原文来自:Martinfowler.com

在与ThoughtWorks项目团队在去年一年的沟通中,有一个主题变得越来越具有影响力,那就是内容管理系统(CMS)。这个系统经常不太管用,令人担忧的是,它们变得越来越有侵略性——人们使用这个系统的方式已经偏离了它的核心目的,于是它变成了项目开发的阻碍。

在众多讽刺之中,一个常见的问题就是人们会保留文章的备份。对这个备份的编辑已经变成了创造内容的一部分,并且发布给了读者(通常伴有状态改变的标识)。

保留某些数据的单独备份只是一个很平常的概念。标准化的关系概念背后的逻辑,以及企业架构师经常会保证重要数据有一份权威备份。

但是对于CMS来说有一个明显的缺陷——编辑和发布的数据访问模式是差之千里的。编辑意味着一小群人经常访问一个文章,要读也要更新。发布意味着更多的人访问这个文章,但是只是读而已。在发表过的文章中可以有一些编辑,但是数量要远远少于对其的阅读量,而且这些编辑是通过一些很有秩序的人完成的。

对于如此不同的两种访问轨迹,有一些CMS保留了若干分开的备份,并被控制在相对独立的模块中。编辑模块是以频更新为基础的,它支持编辑,追踪变更,并且监控编辑程序的工作流。一旦文章发表,就被复制到发布模块中。

enter image description here

发布模块对待文章的方式大部分是只读,很少有更新,而且只在编辑模块中完成。最终,发布模块变成了把文章提供给大量读者的装置。发布模块可以在集群的多处节点中被随意复制,而对于编辑模块来说最好还是集中在一个节点上。针对不同数据存储技术也有很多的争议,这也让每个模块都可以找到适合自己的访问模式。

文章可以存储成不同格式。通常文章在编辑时是一个形式,而发表时是另一个形式,比如用markdown编辑用html发表。这样的话,编辑模块应该存储markdown格式,而发布模块存储html格式。发布模块还可以在存储的备份上做一些页面排布的工作。所以如果你有一个静态头,就可以在文章发布的时候添加到存储的html文章中,就不用在每次读的时候都重写一遍。

把这些模块分开也有助于编辑的工作流。人经常需要在发布前预览即将公诸于世的变更,分离使其更简单,因为你可以发布成一个私人发布模块。这样就可以巧妙地避免“从单一存储中发布什么”的尴尬逻辑了。

用户产生内容确实增加了这个方法的问题。一个完全由用户产生的wiki,相比于管理下的站点,会有更多、更没有秩序的编辑者。与此相似的是,读者评论也是从范围更大的写作者中来的。但就算是用户产生的内容也会有数量超过写作者的阅读者,所以把处理更新和提供发布页面分开也是很有道理的。

使用支持编辑-发布相分离系统的少数人会发现其运转地很好,而其他没有使用这种工具的团队也认为这种方式会提高性能。如果你在评估CMS,或者正在建造你需要的系统,最好把这种编辑-发布相分离的特性作为关键点来考虑。