系统设计中最重要的概念

标签: Uncategorized | 发表时间:2012-02-06 08:34 | 作者:flychen
出处:http://flychen.com

大约在一年前,我的 程序员生涯遇到了一次转折,起因是我阅读了Eric S. Raymond(后文简称ESR)写的《 Unix编程艺术》一书。虽然该书写作的时候Web应用程序还未开始流行,但是其中的原则至今仍然适用。ESR在书中试图以UNIX的设计思想与程序员交流,如果你读过之后能够理解,你会在那时发出“啊哈”的感叹,并且对所有的知识瞬间领悟。这种感觉就像你第一次使用烟雾弹发现所有人和物体都变成了微粒,或者像你第一次知道如何使用磁铁一样。

接下来,这种顿悟自然消失了,然后你花费很长时间试图重新找回这种感觉。

对于web程序员,如果你不喜欢阅读,你也可以直接采用 “ Single Point of Truth”(后文简称SPOT)规则,即“在系统中每个概念都必须具有唯一的、没有歧义的、权威的表示“。如果你设计的系统违反了这条原则,你会使自己陷入无尽的麻烦和灾难中。

你需要避免的做法

在Web开发领域,有一些违反了SPOT规则的情形,它们基本上都来自对数据库概念的误解。不,等一下,我突然想到了。我看到的几乎所有违反SPOT的情形,几乎都是以某种方式使用MySQL时遇到的错误。事实上,几乎所有的NoSQL灾难都是向MySQL输入错误SQL造成的后果,但这不是我这里要说的重点。

系统设计中最重要的概念

1. 使用Solr来搜索数据库 / Using Solr to Search a Database

我敢说你们肯定有过这样的想法,而我不止一次想过这么做。当你需要在web网站后台数据库进行搜索时会决定使用 Apache Solr。你会建立一个“索引管道”用做从数据库周期地提取信息并交给 Solr 处理,或者在为更新数据库建立“插入/更新”入口点的同时也为Solr提供一个入口点。

问题在于你的应用程序不知道到什么才是真实的数据。如果是 Solr 执行返回的结果,你会按照搜索索引的格式显示数据吗?你会用索引行ID查询数据然后显示数据库后台的数据吗?无论你如何试图解决这个问题,结果都是令人痛苦的。看在上帝的份上,如果你的索引连接程序发生错误结果又会怎样?你需要多长时间才能发现这样的错误已经发生在你的系统中呢?

解决办法:不要那么做。PostgreSQL本身就带有很好的全文搜索功能。你可以在此基础上根据你的要求进行调整;这并不违反SPOT规则。该死,如果 Solr 可以满足需求,你甚至可以将Solr作为数据库使用。

2. 将SQL查询结果预存到一个NoSQL系统 / Precaching SQL Results in a NoSQL System

这种情况不大常见,但还是会发生。你将一个很大的对象关系模型的所有数据存到了MySQL中,但是从你的Web应用程序查询这些数据需要3到4个JOIN操作,这会使MySQL遇到性能瓶颈。一直以来都没有好的解决办法。所以为了解决这个问题,你预先计算了一些数据结构并且存储在类似Memcached或者Redis这样的NoSQL系统。

如果数据发生变化要怎么办?你会在程序运行的同时重新计算这些数据结构吗?会在之后的某个时刻更新NoSQL以及SQL写操作队列吗?你可以通过配置来让这种机制奏效,但是当你的“同步”脚本失效的时候,你会发现事情搞糟了,因为你不能确定哪一种才是有效的数据表示。

解决办法:如果你授权的DB运行速度过于缓慢,请不要试图重新组织你的数据模型或者将数据库改变成需要的形式。如果你确实需要为你的应用程序添加一个数据缓冲层,最好加在Web服务器前面最外层。以我的经验来看,任何试图在表示层下面加上数据缓冲都会带来数据同步灾难。另外,在应用程序的边缘增加数据缓存也比较容易:你可以使用Squid或者某个商用的内容提交网络。

3.  Frankendatabases 问题

是的,我已经说了很多关于MySQL的事。最近我遇到了这样的设计难题:你希望在一个数据库中进行查询,但这些数据却分散在多个数据库中。如果你和老式系统打过交道,你应该能理解我在说什么。编写同步脚本实现从数据库A和数据库B中提取数据然后更新到你的数据库中,这样的工作只会让你的脾气变得糟糕。

你会让自己陷入这样的逻辑:

my_record = query("SELECT * FROM records WHERE id = x")
if not my_record:
  insert_into_my_db(their_record)
elif their_record != my_record:
  update_my_db(their_record)

此外,这会给你带来数据一致性的梦魇。假设同步的脚本运行中断,诸如此类,这时你往数据库里写入新的记录,如果接下来有人需要做和你类似的事情,情况会变得更糟。当然,通常这会在数据更新时触发大批查询操作。

解决办法:你已经猜到了:请不要那么做。尽量规范地整理数据库。有些情况并不适合老式系统,所以请你尽可能地避免合并数据库–直接查询数据库A和数据库B。如果你不那么去做,那么就不要怕难堪。

事情已出错的迹象

总而言之,如果你发现自己在编写一些跨越多个应用层的代码,或者“更新”脚本,后者你的crontab脚本超过了10行代码,你很有可能已经犯了错误并且在架构的某个地方违反了SPOT规则。写出那样的代码是枯燥和痛苦的,这种痛苦往往预示着你不能再继续下去了。所以,停下来不要继续犯错。

原文: Ted Dziuba  编译: 伯乐在线 –  唐尤华

【如需转载,请标注并保留原文链接、译文链接和译者等信息,谢谢合作!】

相关文章

from 博客 – 伯乐在线 http://blog.jobbole.com/10084/?utm_source=rss&utm_medium=rss&utm_campaign=%25e7%25b3%25bb%25e7%25bb%259f%25e8%25ae%25be%25e8%25ae%25a1%25e4%25b8%25ad%25e6%259c%2580%25e9%2587%258d%25e8%25a6%2581%25e7%259a%2584%25e6%25a6%2582%25e5%25bf%25b5

您可能也喜欢:

解剖Twitter:Twitter系统架构设计分析

检索系统的下游管理

建设一个靠谱的火车票网上订购系统

pc安装XP和MAC双系统
无觅

相关 [系统 设计 概念] 推荐:

系统设计中最重要的概念

- - 搜索引擎技术博客
大约在一年前,我的 程序员生涯遇到了一次转折,起因是我阅读了Eric S. Raymond(后文简称ESR)写的《 Unix编程艺术》一书. 虽然该书写作的时候Web应用程序还未开始流行,但是其中的原则至今仍然适用. ESR在书中试图以UNIX的设计思想与程序员交流,如果你读过之后能够理解,你会在那时发出“啊哈”的感叹,并且对所有的知识瞬间领悟.

从绘画看设计“层”的概念

- - 网易用户体验设计中心博客
在历代的视觉风潮中,绘画与设计在方方面面有着关联(“设计”为外来词,在传统中国中,对应的词是“经营”),很多时候都是你中有我我中有你的局面,西方美术史上的文艺复兴、新艺术运动就是其中最好的例子. 身为插画师以及设计师,在这两者之间游走,有着许多体会. 其中对于画面“层”的认知,尤为深刻. 一般在视觉中“层”无论在画面抑或设计手法上都呈现出明显而重要的作用,用“层”的概念去看待作品,不需要过多的分析,都能很直观的感受得到画面的逻辑,直接获得视觉上的冲击.

ZOMMA 概念店空间设计 / 汉诺森设计机构

- miyizs - 60designwebpick
在仿制成风的当下,几乎没有一个店面设计真正拥有原创精神. 但对于 ZOMMA 这样的年轻原创设计师品牌,无论是设计师导向还是外缘空间形式,汉诺森 Hallucinate 都赋予其原创的活力以及无限衍伸成长的生命力. 在店面设计上,ZOMMA 的门面设计上,汉诺森为其精挑了白色烤漆铁网作为主体,为纷杂的街面注入一份明净,在周围的店面设计中一跃而出.

程序员必知的 89 个操作系统核心概念

- - IT瘾-dev
☞【干货】 嵌入式驱动工程师学习路线☞【干货】 一个可以写到简历的Linux物联网综合项目☞【干货】 Linux嵌入式知识点-思维导图-免费获取☞【干货】 我的新书《从零开始学ARM》正式上线. 来自:Java 建设者. 操作系统(Operating System,OS):是管理计算机硬件与软件资源的系统 软件,同时也是计算机系统的 内核与基石.

会说故事的概念照片设计创意

- ma - Jackchen Design 1984
概念照片里都描绘一个想法,数字艺术设计师想要传达给观看着的一个可能. 照片用概念里的各种手法夸大或者奇幻了生活中的各种可能,让你可以直观的发散画面里想要表达的结果. 这些寓意明了,给人超现实主义或者幽默搞怪的感觉. The ink represents the fluidity of imagination and creativity through which the artist creates fish, birds, butterflies and the world of his own.

维基百科概念版Logo设计欣赏

- 谢小兔 - Rologo 标志共和国
应英国杂志Viewpoint之邀,著名的品牌设计公司Moving Brands为维基百科(Wikipedia)设计了一款概念版的标识. 这个标识由五条线组成“Wikipedia”的首字母“W”,象征维基百科的五大办站原则(官方称为“维基百科五大支柱”),同时这些线上有九个等长的节点代表维基媒体基金会(Wikimedia)旗下的九个姐妹网站.

数据库设计概念模型要不要建?

- - 博客园_首页
      记得上学时,学习数据库相关课程中要求我们一步一步按照“需求”-->概念结构设计-->逻辑结构设计-->物理结构设计的步骤完成. 但来到公司实际项目中时,我却发现几乎没有一个项目是完全按照这个步骤来建立数据库的. 很多项目基本就是从需求中直接获取信息,然后进入逻辑结构设计阶段最后到片面的物理结构设计阶段,直到数据库可以使用,反复迭代该过程.

评价系统设计篇

- - 互联网 - ITeye博客
评论系统大家都见得非常多了,大到京东、淘宝、亚马逊,小到个人网站、博客都有评论系统,小型网站采用传统PHP+Mysql方式就能很快将系统搭建起来,同时采用单库单表方式就能轻松解决数据存储、数据查询等问题,但是对于上述中大型网站而言,已经远远不能支撑系统正常运行了. 接下来将从系统架构、数据存储、高性能服务等方面来揭示京东的评价系统在面对海量数据、海量请求的情况是如何处理的.

系统吞吐量(TPS)、用户并发量、性能测试概念和公式

- - 服务器运维与网站架构|Linux运维|X研究
PS:下面是性能测试的主要概念和计算公式,记录下:.   一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联. 单个reqeust 对CPU消耗越高,外部系统接口、IO影响速度越慢,系统吞吐能力越低,反之越高. 系统吞吐量几个重要参数:QPS(TPS)、并发数、响应时间.

网站可用性设计中 不容忽略的30个基础概念

- 马克叔叔 - 互联网的那点事
你不必在每件事情上取得别人的同意. 作为一个专业的Web开发人,你是你访客爱好和需求的倡导者;你必须坚持你对良好的用户体验的理解,确保在复杂的网站架构下你的访客仍可能找到他们的路径. 这意味着在与用户和同事讨论时,你必须能够坚持你的立场,有效地传达自己的想法. 事实上,你的工作就是妥协处理错误的思想和误导的概念,而不是盲从它们.