Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >商城首页卡爆了!!!

商城首页卡爆了!!!

作者头像
苏三说技术
发布于 2023-12-28 07:06:26
发布于 2023-12-28 07:06:26
2910
举报
文章被收录于专栏:苏三说技术苏三说技术

大家好,我是苏三,又跟大家见面了。

前言

最近我们的商城系统出现了一个线上问题,用户访问商城首页的时候要差不多20秒,才返回数据,可以说卡爆了。

到底怎么回事呢?

1.案发现场

上周四晚上,我们有一个正常的迭代版本按照预期的时候上线。

本次迭代,我所涉及的功能,很快上线,并且测试通过了。

但没法下班,因为项目组其他同事,还有线上问题在紧急处理。

我过去了解了一下情况,用户访问商城首页的时候响应太慢了,要20秒才返回,有用户投诉过来了。

进一步了解之后发现,造成这个问题的根本原因是redis服务器挂了。

为什么会挂呢?

是因为一次性往redis中存储的数据太多了,导致内存不足。

这个商城系统部署到了阿里云上,当时购买了1G的内存空间。

但由于这次上线,有个新功能,需要在商城首页上,按不同的地区,推荐不同的商品。商品还要按不同的分类做区分。

原本商品只有几十万其实不多,但是按地区和分类做区分之后,保存的数据量乘以了几百倍,一下子占用了大量的内存。

redis挂了为什么会导致首页慢呢?

答:因为代码中有业务逻辑,如果从redis中没有获取到数据,或者访问redis失败了,会从数据库中获取。虽说当时是晚上,用户并发量不大,但是直接访问数据库,响应时间一下子下降了很多。

2.如何快速解决问题?

目前的这套方案,先从redis中获取数据,如果失败了,再从数据库中获取。

现在的问题是:redis内存不足,临时解决问题,只能加内存资源了。

因为加内存是最快的,直接加到了4G。如果要改代码,这个功能今天晚上可能没法上线,之前购买的1G的资源确实有点小。

在阿里云上redis加了内存之后,这个问题很快解决了,首页访问速度一下子提升。

但这不是问题的本质。

3.复盘

第二天,我们开始复盘问题。

发现之前的方案有点问题:

  1. 这次新增的推荐商品功能,保存到redis的数据量太大了,把有些为null值的字段,或者前端用不到的字段也保存到redis中了,数据结构设计不合理。
  2. redis出现问题之后的兜底方案有点问题,如果redis挂了,就直接访问了数据库,导致了用户访问慢的问题。如果是白天用户并发量上来,可能会直接导致数据库挂掉。

那么,如何优化呢?

4.如何优化?

数据结构不合理的问题,可以通过调整数据结构解决,非常容易。

但如果redis挂了该如何处理呢?

4.1 页面静态化

其实对于商城首页,最好的方案是做页面静态化处理。

但由于目前商城的用户并发量,还不算很大,而且如果改成页面静态化,前后端的改动都太大了。

因此,这个方案最先被我们否定了。

4.2 加本地缓存

为了防止后面再次出现商城首页访问慢的问题,可以在应用服务增加本地缓存。

这样不管redis以后能否正常运行,都不影响商城首页的功能。

但需要考虑一个事情:应用服务的内存是否够用?

显然如果将所有推荐的商品数据,都保存到应用服务的本地内存中,同样可能会导致应用服务的内存不足的问题。

因此,直接加本地内存是不行的。

4.3 改成MongoDB

使用MongoDB替代Redis保存数据。

Redis:数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据。

MongoDB:数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。

显然MongoDB更适合保存大批量的结构化的文档数据。

由于我们之前在做其他功能时,使用过MongoDB,它的性能也是挺不错的。

但如果直接改成从MongoDB中获取数据,商城首页的访问速度可能会有所下降。

4.4 本地缓存 + MongoDB

上面说到过的加本地缓存,和使用MongoDB都有各自的优缺点。

为什么不把两种方案结合一下呢?

在本地缓存中保存热点数据,每隔5分钟更新一次。

用户的请求过来,先从本地缓存中获取推荐商品数据,如果有则直接返回。

如果没有,则从MongoDB获取数据。

这样可以解决性能的问题,也可以解决保存大量的数据。

5.兜底方案

上面的说的本地缓存 + MongoDB,基本可以解决redis挂了的问题。

但如果MongoDB挂了该怎么办呢?

这就需要有一套更好的兜底方案。

5.1 使用Apollo配置

如果MongoDB挂了,则直接返回Apollo配置中默认数据,默认是北京市东城区的推荐商品数据。

该配置由于在Apollo中,我们可以根据实际情况动态调整。

我们都知道Apollo可以配置成集群模式,是高可用的,一般不容易挂掉。

但它有一个硬伤,就是如果数据并更了,需要人手动调整数据。

没法保证数据的实时性。

5.2 再从数据库访问数据

如果从MongoDB中获取数据失败了,则直接从数据库中获取数据。

该方案从业务的角度来说,确实没有问题。

但万一真的出现这种情况,同样会出现商城首页访问很慢的问题。

5.3 再从redis访问数据

如果从MongoDB中获取数据失败了,则直接从redis中获取数据。

Redis中只保留热点商品数据。

这也是一种方案,不过要维护两份数据:MongoDB一份,Redis一份。

可能会存在数据不一致的问题。

5.4 再加一个本地缓存

在从数据库获取数据之后,再加一个本地缓存,保存默认的数据,即:北京市东城区的推荐商品数据。

这个本地缓存,只有在第一次访问数据库时写入,并且有效期是24小时。

相当于在MongoDB和数据库之间,再加了一层默认的本地缓存。

这样就能解决数据库访问慢的问题。

6.最终方案

经过激烈讨论之后,我们最终选择的方案是:本地缓存+MongoDB+本地默认缓存+数据库。

有时候选择的某一个技术方案,是根据当前的业务发展,或者公司现状,资金,资源,人手,技术能力等多方面考虑的。

很多技术问题都没有最完美的解决方案,只有最适合的方案。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 苏三说技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大型电商网站的页面静态化方案是如何支撑亿级流量的?
我们小伙伴们在访问淘宝、网易等大型网站时有没有考虑到,网站首页、商品详情页以及新闻详情页面是如何处理的?怎么能够支撑这么大流量的访问呢?
lyb-geek
2019/11/21
1.4K0
大型电商网站的页面静态化方案是如何支撑亿级流量的?
千万级高并发秒杀系统设计套路!超详细解读~~
曾经有一家巨头公司和我们公司进行战略合作,经过双方的不懈努力及精诚合作,双方公司决定共同举办一场秒杀活动,我们公司提供优质商品和强有力的吸引价格以及使用场景,对方公司提供巨大的用户流量,再加上我们公司自己的用户流量,粗略估算下来有5000万的用户流量。
架构师修炼
2022/12/13
3.4K0
千万级高并发秒杀系统设计套路!超详细解读~~
如何设计一个高并发系统?
如果并发访问系统的用户非常多,每次用户访问页面的时候,都通过服务器动态渲染,会导致服务端承受过大的压力,而导致页面无法正常加载的情况发生。
苏三说技术
2023/09/10
1.1K0
如何设计一个高并发系统?
缓存中的这7个坑,把我坑惨了!!!
这篇文章总结了我工作中使用缓存遇到过的7个坑,还是非常有参考价值得,希望对你会有所帮助。
苏三说技术
2024/05/01
2130
Java电商系统商品详情页存储方案设计
不管什么电商系统,商品详情页一定是整个系统中日均访问次数最高的页面之一.不难理解,用户购物,看商品详情不一定买,一定会看好多商品详情页货比三家.如果在设计存储时,没有考虑到并发,on sale 时,支撑商详页的商品系统必然是第一个被流量冲垮的系统
JavaEdge
2020/05/27
2.9K0
Java电商系统商品详情页存储方案设计
互联网项目架构之基于服务的分布式架构
  随着互联网电商项目的发展,越来越多的购物平台等都使用SOA分布式来作为系统主要架构。为什么有那么多的电商项目都选择SOA作为系统架构呢?这肯定是存在一定原因的,因为电商行业的项目它大概存在以下特点
赵小忠
2018/01/24
1.4K0
项目的亮点和难点及问题解决
在高并发情况下的秒杀优化,我们知道当并发数达到一定量的时候,会对数据库服务器带来很大的压力,那么如何缓解这些压力以及提高并发的QPS就是整个项目的解决重点,也是我们优化系统的目标。
golangLeetcode
2022/08/02
1.6K0
技术 | 热数据探测技术及架构设计
今天某公众号推送了一篇文章,标题为“京东的热点key探测系统发布,单机 QPS 提升至 37 万”。后台开发同学都知道,单机QPS 37万是什么概念,多么充满噱头的标题啊(老营销号了)。果然吸引我点了进去。
程序员鱼皮
2020/11/25
1.3K0
技术 | 热数据探测技术及架构设计
4918字,详解商品系统的存储架构设计
电商的商品系统所包含的主要功能就是增、删、改、查商品信息,业务逻辑比较简单,支撑的主要页面就是商品详情页。尽管如此,在设计商品系统的存储架构时,仍然需要着重考虑如下两个方面的问题。
IT阅读排行榜
2022/04/14
1.1K0
4918字,详解商品系统的存储架构设计
vivo 全球商城:商品系统架构设计与实践
随着用户量级的快速增长,vivo官方商城v1.0的单体架构逐渐暴露出弊端:模块愈发臃肿、开发效率低下、性能出现瓶颈、系统维护困难。
2020labs小助手
2021/11/08
1K0
从2s优化到0.1s,我用了这5步
我们的网站使用了SpringBoot推荐的模板引擎:Thymeleaf,进行动态渲染。
苏三说技术
2024/09/29
1660
从2s优化到0.1s,我用了这5步
分类树,我从2s优化到0.1s
我们的网站使用了SpringBoot推荐的模板引擎:Thymeleaf,进行动态渲染。
苏三说技术
2023/08/17
3060
分类树,我从2s优化到0.1s
高并发之降级
在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流。之前已经有一些文章介绍过缓存和限流了。本文将详细聊聊降级。
lyb-geek
2018/07/26
2K0
亿级流量架构之服务降级思路与方法
1 什么是服务降级? 如果看过我前面对服务限流的分析,理解服务降级就很容易了,对于一个景区,平时随便进出,但是一到春节或者十一国庆这种情况客流量激增,那么景区会限制同时进去的人数,这叫
iginkgo18
2021/12/01
7640
页面静态化,让你的系统快的飞起来
静态化就是指把原本动态生成的html页面变为静态内容保存,用户客户端请求的时候,直接返回静态页面,不用再经过服务渲染,不用访问数据库,可以大大的减小数据库的压力,显著的提高性能。
故里
2020/12/08
8270
页面静态化,让你的系统快的飞起来
BAT 大厂的大型网站页面静态化你了解吗?
我们小伙伴们在访问淘宝、网易等大型网站时有没有考虑到,网站首页、商品详情页以及新闻详情页面是如何处理的?怎么能够支撑这么大流量的访问呢?
业余草
2019/10/24
1.1K0
如何设计一个秒杀系统?
这篇分享源自之前购买的极客时间课程《如何设计一个秒杀系统》,以及书籍《亿级流量网站架构核心技术》。
BookSea
2024/06/18
3790
如何设计一个秒杀系统?
你了解大型网站的页面静态化吗?
我们小伙伴们在访问淘宝、网易等大型网站时有没有考虑到,网站首页、商品详情页以及新闻详情页面是如何处理的?怎么能够支撑这么大流量的访问呢?
猿天地
2019/06/19
5.9K0
美多商城商品部分(三)
Our greatest weakness lies in giving up. The most certain way to succeed is always to try just one more time.
小闫同学啊
2019/07/18
4740
美多商城商品部分(三)
电商网站详情页系统架构图_连连跨境电商
小型电商网站的页面展示采用页面全量静态化的思想。数据库中存放了所有的商品信息,页面静态化系统,将数据填充进静态模板中,形成静态化页面,推入 Nginx 服务器。用户浏览网站页面时,取用一个已经静态化好的 html 页面,直接返回回去,不涉及任何的业务逻辑处理。
全栈程序员站长
2022/11/10
1.9K0
电商网站详情页系统架构图_连连跨境电商
相关推荐
大型电商网站的页面静态化方案是如何支撑亿级流量的?
更多 >
领券
一站式MCP教程库,解锁AI应用新玩法
涵盖代码开发、场景应用、自动测试全流程,助你从零构建专属AI助手
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档