《大型网站技术架构》学习笔记-03案例篇

时间:2022-04-24
本文章向大家介绍《大型网站技术架构》学习笔记-03案例篇,主要内容包括常见案例、典型故障、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

最后一篇案例篇,"愿站在巨人的肩膀上",加油熊二同学。

常见案例

淘宝网架构演进 2017年5月18日,阿里巴巴集团公布2016财年的全年业绩,集团收入为1582.73亿元人民币,同比增长56%,移动端月度活跃用户高达5.07亿,于此同时,阿里和腾讯的市值均站上了3000亿美元市值的全球企业第一梯队,不知道B大哥能不能通过人工智能和马大嫂重回巅峰。淘宝的技术是和业务一起成长起来的,其发展历程分为如下几个阶段。

  • 第一阶段2003-2004:从2003年老马花费3000美金购入C2C交易网站,基于LAMP架构,数据库进行简单读写分离。
  • 第二阶段2004-2006:模仿eBay开展业务,开始建立商品类目,同时使用Java替代PHP,Oracle替换MySQL,使用MVC框架Webx和ORM框架iBatis,并开发Antx用于项目构建,应用服务器使用WebLogic。
  • 第三阶段2006-至今:放弃EJB,引入spring,用免费的JBoss替代Weblogic,再之后用Jetty替代了JBoss更加简化,截止到2012年,其使用Tair缓存,TFS分分布式文件系统,OceanBase分布式数据库系统,支持千亿级别的读写事务,TDDL对应用透明的分库分表层和具有众多特性的动态数据源。

维基百科 维基百科wikpedia与2012已成为流量排名全球第六的大型网站,其建立于2001,属于高性能架构的代表,由于成本原因,一直使用LAMP架构,其主要组件如下所示。

  • GeoDNS:基于开源名服务器软件BIND的增强版,可将域名解析到离用户最近的服务器
  • LVS:基于Linux的开源负载均衡服务器
  • Squid:基于Linux的开源反向代理服务器
  • Lighttdpd:开源应用服务器,比Apache更轻量,常用于图片服务器
  • PHP+MySQL:Web开发的两大神器
  • Memcached:无中心高性能的开源分布式缓存系统,历久弥新
  • Lucene:基于java的开源全文搜索引擎

前台优化策略:由于百科实时数据请求低的特点,8成以上用户请求可以直接通过前端服务返回,不会到达应用服务器,前端服务包括DNS服务、CDN服务、反向代理服务和静态资源等服务。其和核心是反向代理服务器Squid集群,请求通过LVS分发到每台Squid服务器,热点词条被缓存于此处,同时将关键词条发在CDN服务器上,其准则是内容页面不包含动态信息,具有唯一REST风格url,便于CDN快速查询并避免重复缓存,在HTML响应头中写入缓存控制信息。 中台优化策略:集中最好的服务器资源,使用APC加速PHP代码执行,使用imagemagick进行图片处理和转化,使用Tex进行文本格式化,特别试讲科学计算公式转换为图片等。 后台优化策略:主要手段是使用缓存,将热点最集中的数据直接缓存在应用服务器本地内存,缓存内容尽量使用html等直接可用格式,使用缓存服务器存储session对象,相比数据库,memcached的持久化连接更廉价。在使用MySQL时,使用较大的服务器内存,使用RAID0加速磁盘访问,将事务一致性设置在较低水平,如果Master宕机,直接切换到Slave并关闭写服务,进行服务降级。

网购秒杀系统 秒杀是电商网站常见的营销手段,通过少量低价商品吸引人气,引导用户购买其他高价商品,最终提高收益。 秒杀系统的技术挑战和对策

  • 对现有业务的冲击:独立部署秒杀系统
  • 高并发下的应用,数据库负载:秒杀商品页面静态化
  • 突然增加的网络和服务器带宽:租用秒杀活动网络带宽
  • 直接下单的url泄露:动态生成随机下单页面URL Tip: 如何控制秒杀商品页面购买按钮的点亮?使用javascript脚本控制,在秒杀商品静态页面加入一个js文件应用,该js文件加入秒杀是否开始的标志和下单页面url的随机数参数,当秒杀开始时生成新的js文件并被用于加载,控制秒杀页面的展示。该文件使用随机版本号,不被浏览器、CDN和反向代理服务器缓存。 如何只允许第一个提交的订单被发送到订单子系统?需要检查是否已经有订单提交,比如最终只能有一个用户提交成功,为了减少下单页面的压力,可以控制进入下单页面的入口,只有少数用户能进入下单页面,其他用户进入秒杀结束页面。

典型故障

  • 写日志也会引发故障:对于本地log,如果不做好策略配置,log文件夹的体积就会迅速增大,消耗磁盘空间,这个算是常见错误。
  • 高并发访问数据库引发的故障:首页最好是静态的,且不应该访问数据库,需要的数据一定要从缓存服务器或者搜索引擎服务器获取。
  • 高并发情况下锁引发的故障:程序中某个单例对象中多次使用了synchronized(this),由于this对象只有一个,所有并发请求都要排队,因此使用锁时需要谨慎。
  • 缓存引发的故障:当缓存不仅仅是改善性能,而是成为网站架构重要组成部分是,对缓存的管理就需要提升到和其他服务器一样的级别。
  • 应用启动不同步引发的故障:比如Web环境中使用Apache+JBoss模式,用户请求通过Apache转发JBoss,发布时,两者同时启动,由于JBoss需要加载数据启动慢,而Apache快速,那么Apache就会提前接受大量用户请求,大量请求阻塞与JBoss进程,最终崩溃,因此需要配置好启动脚本并监控JBoss的是否Up。
  • 大文件读写独占磁盘引发的故障:图片一般要用专门的存储服务器,尤其不要和大文件在一起存储。
  • 滥用生产环境引发的故障:数据库生产环境的任何修改一定要有流程,比如DBA审核。
  • 不好的变成习惯引发的故障:加强code review,控制好代码质量,比如java的空指针异常的判断。

参考资料

  1. 李智慧. 大型网站技术架构[M]. 北京:电子工业出版社, 2013.