序我为什么要写这本书
我想写一本关于网站架构方面的书源起于2011年年末至2012年年初发生的两件事。
2011年末,京东网图书促销,在打5折的基础上再满一百送一百,作为一个爱买书胜过爱读书的人,我对这种促销活动根本没有免疫力,于是兴致勃勃地在活动当天登录www.360buy.com,准备将收藏夹里的图书一网打尽。
往购物车里尽情地塞了一堆书后,点击“购买”按钮,但是浏览器迟迟没有响应,预感到京东的服务器可能因为并发访问量过高,超过了系统的最大负载能力,果然过了一会,浏览器页面显示“Service is too busy”。我不甘心,返回购物车页面继续点击“购买”按钮,浏览器继续显示“Service is too busy”。
于是我猜测:能够正常访问购物车,却不能成功购买,问题应该是出在订单系统,B2C网站生成一个订单需要经历扣减库存、扣减促销资源、更新用户账户等一系列操作,这些操作大多是数据库事务操作,没有办法通过缓存等手段来减轻数据库服务器负载压力,如果事前没有设计好数据库伸缩性架构,那么京东的技术团队将遇到一个大麻烦。
当天晚上,我登录新浪微博,看到京东的大老板刘强东发布了一条微博:“我已经紧急采购了10台服务器,增强网站后台,明天继续促销一天,一定让大家买到书”。即使在有成熟数据库伸缩性架构设计的前提下,进行一次数据库扩容也是件棘手的事,而京东只需要一个晚上就能搞定,让我对京东的技术实力刮目相看。
第二天一上班,我的第一件事就是登录www.360buy.com,点击“购买”按钮后悲剧地发现页面还是“Service is too busy”。当天晚上,刘强东又发布了一条微博:“请信息部的同事喝茶”。还配了一张照片:一张大桌子,只有一杯茶,旁边放了一把刀……
我想京东信息部的同事绝对不是有意要捉弄他们的老板和客户,很可能是他们错误地判断了系统的瓶颈及伸缩性架构的困难,对老板做出了过度承诺,而这背后折射出的是他们对网站架构的本质缺乏了解。
另一件事发生在2012年年初,当时的中国铁道部官方售票网站www.12306.cn在春运期间因为大量用户访问而崩溃,无法有效访问。12306作为一个运营不久的网站,缺乏大规模并发访问处理的经验,遇到一些问题其实不奇怪,不管花多少钱,经验教训都需要经历时间和挫折才能得到。奇怪的是,12306的架构师似乎对这种可能发生的大规模并发访问产生的问题完全没有一点概念,系统好像根本没有经过任何高并发场景下的性能评估和性能测试,就那么干脆利落地崩溃了,趴在那里长时间起不来。
这两件事情促使我想写一本关于网站架构的书,阐述网站技术架构最基本的驱动力,基础的架构设计原理,以及架构方案选择的价值观。希望软件工程师们在解决问题之前,能够认真思考自己面对的真正问题究竟是什么,有哪些技术方案可以选择,其基本原理是什么。所以这本书里没有高深的算法和聱牙诘屈的公式,也很少有程序代码。读者可以把本书当作网站架构设计的科普书,即使对网站架构没有什么了解,也能够比较轻松地阅读。
在本书的写作过程中(2012年下半年),没有再看到京东促销宕机的新闻,12306也逐渐稳定成熟。我们虽然无法猜测京东“信息部的同事”和12306网站的工程师们付出了多少努力,但能在相对比较短的时间里解决这些技术问题,也说明了网站架构其实并不难,真正能解决问题的技术一定是简单的。
本书致力于把这些简单的技术和道理呈现给读者。
如何阅读本书
我自己读书不求甚解,遇到看不懂的地方就跳过去,但是希望作者对难点和重点能换个角度和方式在后面章节再叙述,以帮助我重新思考和认识前面不能理解的重要知识。
机械制图的时候,通常使用三视图描述一个机械零件,从正视、侧视、俯视三个角度对一个零件绘图,从而全面描述一个零件的结构。软件架构设计中常用的4+1视图模型,也是一种多角度描述软件系统设计的手段。
本书中,重要的架构原理和技术方案都采用多角度描述的方法。
第1篇,从演化、模式、要素三个维度描述网站整体架构。
第2篇,从性能、可用性、伸缩性、扩展性、安全这五个要素方面详细描述网站架构核心原理,其中重要的负载均衡、异步处理、分布式缓存等技术方案又在不同章节从多角度进行描述。
第3篇,通过几个具体案例再一次从整体和局部描述网站架构方法。
第4篇,从架构师做事的角度回顾网站技术架构,读者在阅读前面技术章节感到枯燥的时候,也可以跳到本篇休闲放松下。
阅读本书过程中有任何问题和建议,请联系作者。新浪微博:@大型网站技术架构。