大型电商网站详情页是如何支撑亿级流量访问的?

前言

我们小伙伴们在访问淘宝、网易等大型网站时有没有考虑到,网站首页、商品详情页以及新闻详情页面是如何处理的?怎么能够支撑这么大流量的访问呢?

很多小伙伴们就会提出他们都采用了 静态化 的方案,这样用户请求直接获取静态数据html,就不需要访问数据库了,性能就会大大提高;而且提高网站SEO优化。

那今天就带着大家聊一下静态化。把之前工作场景中静态化方案遇到的问题,以及如何演变的,分享给小伙伴。

方案一:网页静态HTML化

这个方案是最早使用的方案,我们就拿CMS系统举例,类似网易的新闻网站

核心流程图:


上图的核心思想:

  1. 管理后台调用新闻服务创建文章成功后,发送消息到消息队列
  2. 静态服务监听消息,把文章静态化,也就是生成html文件
  3. 在静态服务器上面安装一个文件同步工具,此工具的功能可以做到只同步有变动的文件,即做增量同步
  4. 通过同步工具把html文件同步到所有的web服务器上面

这样的话就达到了,用户访问一些变化不大的页面时,是直接访问的html文件,直接在web服务器那边直接返回,不需要在访问数据库了,系统吞吐量比较高。

这个方案的问题:

1、网页布局样式僵化,无法修改

如果产品经理觉得新闻详情页面的布局要调整一下,现在的不够美观,或者加个其他模块,那就坑爹了

我们需要把所有的已经静态html化的文章全部重新静态化。这个是不现实的,因为像网易这么大的体量,新闻量是很大的,会被搞死。

2、页面会出现暂时间不一致

会出现用户刚刚再看最新的新闻,刷新一下又不存在了。这个是因为同步工具在同步到web服务器是要有时间的,同步到web服务器A上面了,但web服务器B还没有来得及同步。

用户在访问的时候通过 nginx进行负载均衡,随机把请求分配给web服务器 的导致的。当然可以调整nginx负载均衡策略去解决。

3、Html文件太多,无法维护

这个是很明显的问题,html文件会越来越多,对存储空间要求很大,而且每台web服务器都一样,浪费磁盘空间;将来迁移维护也会带来很大的麻烦。

4、同步工具的不稳定

因为文件一旦多之后,同步工具稳定性就出现了问题

这个方案应该是比较传统的 (不推荐)

方案二:伪静态化

什么是伪静态?

一般我们可以采用nginx对url进行rewrite。小伙伴如何有兴趣可以自行了解,比较简单。之所以是伪静态其实也是需要动态处理的。

针对方案一上面问题,方案进一步的演化,如下图:


此方案的核心思想

  1. 管理后台调用新闻服务创建文章成功后,发送消息到消息队列
  2. 缓存服务监听消息,把文章内容缓存到缓存服务器上面
  3. 用户发起请求,web服务器根据id,直接查询缓存服务器
  4. 获取数据返回给用户

此方案就解决了方案一的一个大问题,就是html文件多的问题,因为不需要生成html,而且用缓存的方式,解决不需要访问数据库,提升系统吞吐量。

不过此方案的问题:

  1. 网页布局样式维护成本比较高 ,因为此方案照样是把所有的内容放到了缓存中,如果需要修改布局,需要重新设置缓存。
  2. 分布式缓存压力比较大,一旦缓存故障就导致所有请求会查询数据库,导致系统崩溃

还有个小问题,就是实时数据处理,就是页面中如价格,库存需要到后台读取的。

当然小伙伴也许就会说,也可以处理啊,用户把商品内容请求到后,然后在用浏览器发送异步的ajax请求获得商品数量就好了啊。这样就是无形的增加了一次请求。(此问题可以忽略)

此方案类似很多公司都在使用,如:同程旅游等

方案三:布局样式模板化

针对方案二的问题,我们可以采用openresty技术方案进行,利用http模板插件lua脚本进行解决

如下图:


这里说明一下上图中我们小伙伴不需要全部都要了解,这个是比较全的商品详情页的解决方案,涉及到了三级缓存这个概念

我们主要看的是上面怎么会有两层ngnix,分发层和应用层,这个是什么意思?

应用层nginx

应用层nginx是什么意思?nginx一般被用做负载均衡,其实nginx还有很多的功能,尤其他的openresty扩展 + lua脚本语言结合起来可以完成很多功能

小伙伴可以理解为lua脚本语言就是类似java语言,可以动态处理业务,如:本地缓存处理,远程http访问,访问redis等。

应用层nginx就是利用了http模板 + 缓存通过lua脚本完成的网页渲染

http模板


  1. 应用层nginx通过lua脚本语言先获取本地商品数据,然后和http模板进行渲染,形成最终商品详情页返回给用户
  2. 如果应用层nginx本地的缓存没有此商品数据,就通过lua脚本发起http请求访问web服务器,获取商品数据。
  3. web服务器会向redis或本机的ehcache请求商品数据(这里涉及三级缓存概念),如果存在此商品数据,直接返回给用户;如果不存在则请求微服务访问数据库

这个思路就是通过http模板,解决了方案二中的布局样式的问题,如果需要调整布局,只要改一下模板就行了,非常方便。也解决了实时性问题。

这边涉及到的nginx本地缓存其实就是为了保证不需要访问数据库,提升系统吞吐量。小伙伴只要了解一下思路,如果不了解openresty和lua可以自行上网了解

分发层ngnix

为什么上面还有一层分发层呢?这个是因为大型网站的商品数太多了,应用层nginx的本地缓存是有限的,不可能把所有的商品数据缓存在同一个服务器的本地缓存

一台应用层nginx只能缓存部分商品数据,说到这里小伙伴是不是应该就知道为什么了吧?就是利用hash一致性算法,根据商品id路由分发到同一个应用层ngnix服务器。


分发层ngnix的作用就是 hash策略的负载均衡 ,保证了商品id路由到固定的应用层服务器。

三级缓存保证了系统的稳定性,即使redis缓存崩溃,还有其他2个缓存保障。

总结:

  1. 方案三是比较完整的方案,很多大厂都在使用,能够承受亿级流量,但系统比较复杂。
  2. 如果对实时性要求不高,布局样式调整不频繁,可以考虑方案二,系统比较简单
#java##互联网#
全部评论
特别佩服这些电商,双11仍然杠杠的啊
点赞 回复 分享
发布于 2022-08-18 21:19 陕西
flink或者clickhouse的功劳
点赞 回复 分享
发布于 2022-09-16 18:22 美国

相关推荐

08-30 17:16
门头沟学院 Java
全程40min,无手撕,面试官态度挺好,最后甚至主动介绍组里的项目和情况,搞得都不知道该反问什么了#软件开发笔面经#首先自我介绍1.讲讲List的底层数据结构2.ArrayList的容量和扩容机制了解吗3.讲讲map的底层数据结构和增删的逻辑4.红黑树相比于链表有哪些优点5.多线程中,除了synchronized关键字,还有哪些能确保线程安全6.操作系统中,线程和进程有什么异同点7.java的内存分配是什么样的,哪些在堆上,哪些在栈上?8.讲讲常见的垃圾回收算法和垃圾回收器9.除了socket,还有哪些进程之间的通信方式?10.多线程环境下,对于共享内存有什么机制确保线程安全11.讲讲对线程池的理解,还有哪些数据结构和机制能实现?12.高并发环境下,设计线程池参数时你是怎么考虑的13.讲讲http1.0,http1.1,http2以及http3的发展以及变化14.https是如何建立安全的链接,整个流程?15.对称加密和非对称加密的原理?都有哪些算法实现16.redis的单线程体现在哪,为什么单线程但效率很高17.讲讲mysql的innoDB引擎18.你的项目中有哪些难点,怎么解决的,有多少人参与19.结合项目,讲讲spring,redis,mysql,rabbitMQ这几个组合起来的运行架构和流程20.如何保证数据一致性?redis宕机了怎么办,高并发下如何处理数据21.rebbitMQ怎么确保消息被消费?消费失败了怎么办22.讲讲AOP的原理,在项目中怎么实现的23.日常怎么学习新技术的,对go了解吗,对大模型了解吗24.反问
点赞 评论 收藏
分享
实在智能(小厂-见习python开发工程师)-2024.9.2 一面(20min)1.python的数据类型中哪些是可变的哪些是不可变的2.为什么不可变3.讲一下多进程,多线程,多协程(协程没答出来、、、、)多进程(multiprocessing):在一个操作系统中同时运行多个进程,每个进程都有自己的内存空间和资源,进程之间相互独立优点:充分利用多核cpu,提升计算性能进程独立,内存隔离使得一个进程的崩溃不会影响到其他的进程缺点:创建和销毁的开销比较大多线程:一个进程中同时运行多个线程,线程共享进程的内存空间和资源优点:开销小,信息共享通信速度快缺点:由于内存共享,线程之间的竞争可能导致数据不一致,需要使用锁等机制保证线程安全python中,由于全局解释锁(GIL)的存在,cpu密集型任务的性能提升有限协程:协程是一种轻量级的用户级线程,允许在单个线程中进行并发操作,协程通过yield或async、await语法实现,可以在执行过程中挂起和恢复优点:开销非常小,适合处理大量并发任务由于协程是单线程,避免了线程中的竞争和锁的问题缺点:协程的调度是由程序员控制的,可能导致复杂的控制流单线程运行导致的性能问题4.多进程之间的数据能否共享不能,但是python可以通过一些机制实现数据共享:共享内存:multiprocessing模块提供了共享内存的功能,可以使用value和array来创建共享数据进程间通信(IPC):使用队列queue或者管道pipe实现进程间的通信,这些机制允许一个进程将数据发送到另一个进程5.python装饰器属于一种特殊的函数,用于在不修改函数代码的情况下,增强或者改变函数的行为,通常用于日志记录,权限检查,缓存,装饰器以函数作为参数,并返回一个新函数,通常用@什么什么的语法装饰器链,可以应用于同一个函数装饰器将从内到外依次执行:内置装饰器:@staticmethod、@classmethod和@property,用于定义类中的静态方法、类方法和属性。6.讲一下restfulapi7.如何判断两个对象是不是同一个使用is运算符,比较的是内存中的地址是否相同8.私有属性能否被继承能被继承,但是访问受到名称重整(name mangling)的影响。具体来说,私有属性在子类中不能直接通过其原始名称访问,而是要加一个<_父类名称>在使用的属性之前9.属性能否被修改能被修改可修改性取决于它们的定义方式和访问权限。1.公共属性:如果属性是公共的(没有前缀下划线或双下划线),则可以直接在类的实例中修改2.受保护属性:单下划线,可以在类外部访问和修改3.私有属性:双下划线开头,不能直接在类外部访问,但可以在类内部修改10.讲一下你在实习项目中负责哪些模块11.项目是前后端分离吗12.数组和链表的不同点相同点,各自的优势和劣势相同:1.都是存储数据2.都是线性结构,存在顺序关系3.都可以用来实现其他数据结构不同:数组长度不可变,链表长度可变13.flask的生命周期1.请求创建2.请求上下文创建3.路由匹配4.视图函数调用5.响应生成6.响应上下文创建7.响应发送8.请求结束(清理请求上下文,响应上下文,释放相关资源)9.错误处理(如果在请求处理之后发生错误)(面试官人不错,没有太为难我,期待二面ing)14.python的垃圾回收机制1.引用计数:每个对象都有一个引用计数器,记录有多个引用指向该对象,当对象的引用计数为零时,表示没有任何引用指向该对象,python会立即释放对象占用的内存2.循环垃圾回收:为了处理引用计数无法解决的循环引用问题,定期检查对象之间的引用关系,识别并回收哪些形成循环引用的对象实在智能(小厂-见习python开发工程师)-2024.9.3 二面(20min)自我介绍做了哪些项目项目中遇到的难点,有遗憾的地方反问环节(不知道问啥。。。):现在在做的项目,团队有几个人这两次面试时间都好短,感觉在赚kpi
查看11道真题和解析
点赞 评论 收藏
分享
点赞 评论 收藏
分享
09-02 15:55
已编辑
门头沟学院 Java
第一次发面经,希望能攒点人品!1.介绍一下hashmap2.hashmap是线程安全的吗?3.为什么在8的时候树化?4.介绍一下垃圾回收算法5.请介绍一下ZSet底层数据结构6.ZSet适用于什么场景?7.如何确保线程安全?8.乐观锁和悲观锁的区别9.不使用锁如何确保线程安全10.Syncronized底层原理11.索引底层的数据结构12.B+树和B树的区别13.B树能应用在什么场景14.TCP粘包问题八股好像就这么些,基本上都答出来了算法题如下:public class Item {    public int id;    public int parentId;    private String name;    public Item(int id, int parentId, String name) {        this.id = id;        this.parentId = parentId;        this.name = name;    }    public Item() {    }}public class CategoryRsp extends Item {    public List<CategoryRsp> child;    // 构造方法    public CategoryRsp(int id, int parentId, String name, List<CategoryRsp> child) {        super(id, parentId, name);        this.child = child;    }    public CategoryRsp(){        super();    }}写一个函数,输入一个parentId,获取CategoryRsp,(要求成员变量里面的列表包含这个parentID的子节点及子节点的子节点)括号里面的这句话是我自己加上去的,一开始看这个题目一直看不懂什么意思,直接写错,浪费了很多时间,后面面试官讲解了下,一开始说给我30分钟时间,结果我做了45分钟都没做出来,知道用递归做,没做出来,讲了下思路。我辛辛苦苦刷了100道力扣,他竟然不给我手撕力扣,还是自己太菜了。下午收到邮件已挂
点赞 评论 收藏
分享
点赞 3 评论
分享
牛客网
牛客企业服务