第18章 大浏览量系统的静态化结构设计

18.1 淘宝大浏览量商品详情系统简介

  HTTP请求经过负载均衡设备分配到某个域名对应的集群,经过Nginx代理到JBoss或者Tomcat容器,由他们负责具体处理用户请求。目前这些大浏览量的系统大部分需要读取的数据都已经直接走

K/V 缓存了,不会直接从DB获取数据。

18.2 系统面临哪些挑战

  突发的流量冲击; 攻击和恶意请求;

18.3 淘宝前台系统的优化历程

  系统拆分,静态文件合并,前段页面异步优化和JSON化

  去DB依赖、引入缓存、提升单机的QPS,关注用户体验。

  Velocity, BIgPipe

  静态化改造

  统一cache, CDN化, 网络协议

18.4 大浏览量系统的静态改造

  18.4.1 什么是静态化系统

  • URL能唯一标识一个页面
  • 页面中不包含与浏览者相关的因素
  • 页面中不包含时间因素,页面的DOM不能随时间而变化。
  • 页面不包含地域因素
  • 不能包含cookie等私有因素。

  18.4.2 为什么要进行静态化架构设计

  在web层可以直接返回结果,不用到达系统后端。

  静态化优点:

    改变了缓存方式:直接缓存HTTP连接而不仅仅缓存数据,WEB代理服务器根据请求URL直接取出对应的HTTP响应头和响应体直接返回,这个响应连HTTP都不用重新组装,同样,HTTP请求头也不一定需要解析,所以获取数据最快。

    改变了缓存的地方:不是在JAVA层面做缓存,而是直接在web服务器层上做,而web服务器(如Nginx, )都擅长处理大并发的静态文件请求。    

  18.4.3 如何改造动态系统 

  如何将动态页面改造成适合缓存的静态页面呢?改造方法就是前面说的去掉那几个影响因素。解决办法就是将这些因素单独分离出来,也就是动静分离。

  动静分离:

    URL唯一化,detail页面就可以通过商品ID来唯一标识一个URL .

    分离与浏览者相关的因素。登录信息可以单独拆分出来,通过动态请求获取。

    分离时间因素。服务器输出的时间也通过动态请求获取。

    异步化地域因素。把detail系统上与地域相关的做成异步方式来获取。

    去掉Cookie。 

  动态内容结构化:

    分离出动态内容后,如何组织这些内容页很关键,这些动态内容会被页面中的其他模块用到,例如判断该用户是否登录、用户ID等。将这些信息JSON化可以方便前端获取,

  如何组装动态内容:

    知道如何分离那些内容后,又如何组织呢?现在的问题时如何获取它们,并和静态文件组装在一起。获取动态内容有两种方式:ESI和CSI

    ESI:

    CSI:

  18.4.4 几种静态化方案的设计以及选择

  一致性hash:

  方案一: Niginx + Cache + java

  方案二:

  方案三:

  18.4.5 如何解决失效问题

  被动失效:处理时效性不敏感的数据,采用设置Cache时间长度这种自动失效的方式,同时也要开发一个后台管理界面,手动失效。

  主动失效:

    Cache失效中心监控数据库表变化,发送purge失效请求;

    装修时间戳比较失效装修内容;

    JAVA系统发布,请求Cache

    VM模板发布,清空Cache;

  18.4.6 服务端静态化方案的演进:CDN化

    将Cache前移到CDN上,因为CDN离用户最近。但是有几个问题:

    失效问题:CDN分布全国,要在秒级时间内失效这么广泛的Cache,对CDN的失效系统要求很高。

    命中率问题:命中率是Cache的重要指标,Cache分散,命中率降低。

    发布更新问题:

  解决失效问题:

       

       解决命中率问题:

    

    

  

时间: 2024-10-19 01:47:05

第18章 大浏览量系统的静态化结构设计的相关文章

大数据量数据存储分表实例(企业级应用系统)附原码

随着数据不断增长,数据库中单表无法满足大数据量的存储,所以我们就提出按照自然时间.单站点信息分表来存储大量秒级数据. 例如:大气.水利.交通(GPS)信息监测系统中的实时数据进行存储,一般时按照开始时间.结束时间.单站点.多站点.监测项目等方式进行数据查询.分析.图表. 如 按5分钟单站点的数据12*24(小时)*365(天)*(监测项)10=100W ,也就是一个站点一年数据量 100w条,100站*100W =1亿条这样的数据是无法满足快速查询. 所以我们就按照 "tb_5M_年_站号&qu

第18章 SysTick—系统定时器

本章参考资料<Cortex?-M7内核编程手册>-4.4 章节SysTick Timer(STK),和4.38章节SHPRx,其中STK这个章节有SysTick的简介和寄存器的详细描述.因为SysTick是属于CM7内核的外设,有关寄存器的定义和部分库函数都在core_cm7.h这个头文件中实现.所以学习SysTick的时候可以参考这两个资料,一个是文档,一个是源码. 18.1  SysTick简介 SysTick-系统定时器是属于CM7内核中的一个外设,内嵌在NVIC中.系统定时器是一个24

Python 自动刷博客浏览量

哈哈,今天的话题有点那什么了哈.咱们应该秉承学习技术的角度来看,那么就开始今天的话题吧. 思路来源 今天很偶然的一个机会,听到别人在谈论现在的"刷量"行为,于是就激发了我的好奇心.然后看了下requests模块正好对我有用,就写了一个简单的测试用例.神奇的发现这一招竟然是管用的.那还等什么,开刷咯. 前奏 思路很简单,就是一个发送请求的实现,就可以了.代码如下: headers = { 'referer':'http://blog.csdn.net/', 'User-Agent':'M

大数据量高并发的数据库优化

一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. 在一个系统分析.设计阶段,因为数据量较小,负荷较低.我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程. 所以在考虑整个系统的流程的时候,我们必须

MySQL性能调优与架构设计——第 18 章 高可用设计之 MySQL 监控

第 18 章 高可用设计之 MySQL 监控 前言: 一个经过高可用可扩展设计的 MySQL 数据库集群,如果没有一个足够精细足够强大的监控系统,同样可能会让之前在高可用设计方面所做的努力功亏一篑.一个系统,无论如何设计如何维护,都无法完全避免出现异常的可能,监控系统就是根据系统的各项状态的分析,让我们能够尽可能多的提前预知系统可能会出现的异常状况.即使没有及时发现将要发生的异常,也要在异常出现后的第一时间知道系统已经出现异常,否则之前的设计工作很可能就白费了. 18.1 监控系统设计 系统监控

大数据量高并发访问的数据库优化方法

一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. 在一个系统分析.设计阶段,因为数据量较小,负荷较低.我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程. 所以在考虑整个系统的流程的时候,我们必须

(转)大数据量高并发的数据库优化与sql优化

大数据量高并发的数据库优化 一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. 在一个系统分析.设计阶段,因为数据量较小,负荷较低.我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程. 所以在考虑整

大数据量数据库优化 - CodeMain - 博客园

一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. 在一个系统分析.设计阶段,因为数据量较小,负荷较低.我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时再来考虑提高系统性能则要花费更多的人力物力,而整个系统也不可避免的形成了一个打补丁工程. 所以在考虑整个系统的流程的时候,我们必须

大数据量高并发的数据库优化(转)

参考:http://www.cnblogs.com/chuncn/archive/2009/04/21/1440233.html 一.数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据库模型的设计是必须的. 在一个系统分析.设计阶段,因为数据量较小,负荷较低.我们往往只注意到功能的实现,而很难注意到性能的薄弱之处,等到系统投入实际运行一段时间后,才发现系统的性能在降低,这时