《大型网站技术架构》学习笔记-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.

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏chenssy

阿里P8十年Java架构师是如何规划职业生涯以及架构体系的呢

高可用SpringCloud微服务与docker集成实现动态扩容实战

15130
来自专栏FreeBuf

iOS最新漏洞可实现“以假乱真”的iCloud密码钓鱼

近日安全研究人员发布了一份漏洞利用代码。这份代码表明,攻击者可以通过足以以假乱真的钓鱼,轻易窃取使用最新iOS版本的iCloud密码。 漏洞原理 这个概念验证性...

21880
来自专栏杨建荣的学习笔记

初识JMeter

今天在地铁上,一直在琢磨高可用测试的一些补充场景,除了功能之外,就是一些异常场景的考虑,总之,能想到可能发生的任何场景,然后和实际应用场景结合起来,给出...

46490
来自专栏云技术

腾讯云存储专家深度解读基于Ceph对象存储的混合云机制

  毫无疑问,乘着云计算发展的东风,Ceph已经是当今最火热的软件定义存储开源项目。如下图所示,它在同一底层平台之上可以对外提供三种存储接口,分别是文件存储、对...

9.1K140
来自专栏IT技术精选文摘

将单体应用重构为微服务

微服务重构概述 将单体应用程序转换为微服务的过程是应用程序现代化的一种形式。这是几十年来开发人员一直在做的事情。因此,在将应用程序重构为微服务时,有一些方法可以...

26180
来自专栏杨建荣的学习笔记

压测工具swingbench和sysbench对比(r12笔记第13天)

今天来说说两款压测工具sysbench,swingbench,早些时候傻傻分不清楚,其实两个差别大了去了。 swingbench 先来说说swingb...

42590
来自专栏Python小白进阶之旅

Python爬虫很难,那是你没有掌握爬虫的思想,看看年薪百万的大神如何来分析

79330
来自专栏社区的朋友们

漫谈分布式集群的负载均衡—口水篇

为了理解分布式集群这个概念,我们先说说这两个概念:“集群”和“分布式”。艺术来源于生活,计算机科学亦是如此。

1.2K00
来自专栏知晓程序

小程序的 AppID 怎么找 / 小程序手势缩放怎么做 / 不费流量的小程序推荐 | 小程序问答 #13

每次,看到那些名字长得让人记不住的小程序,你内心是否都会暗暗吐槽:起名的人究竟是怎么想的。

21710
来自专栏Rainbond开源「容器云平台」

少打一局王者荣耀就能上手Spring Cloud?!

17130

扫码关注云+社区

领取腾讯云代金券