文档章节

一条慢SQL导致购物车服务无法使用

Sam哥哥聊技术
 Sam哥哥聊技术
发布于 2018/11/08 14:46
字数 848
阅读 1048
收藏 13

概述


之前处理过一个购物车故障,觉得还挺经典的,在这里跟大家分享一下。这个故障直接导致前端添加购物车、获取用户购物车列表等操作都失败了。购物车是入口,一旦出现问题,影响极其严重。


临时处理


购物车服务所有接口,是有打印响应时间的,发现比平时慢了很多。由于情况已是十万火急了,我只能先重启购物车,缓冲一下,然后利用这段缓冲时间,赶紧定位问题。


问题定位


之前对购物车应用基于Spring Cloud微服务化了,已经稳定运行了几个月了,且当时上线前也经过压测,接口性能是没问题的。怎么突然之间就有问题了呢?基于以往的经验,大部分故障都是SQL语句引起的,因此首先导出数据库的所有慢SQL(腾讯云有导出慢SQL的工具)语句,发现大部分慢查询都是来自库存查询的SQL语句,有些甚至是10秒钟才执行完。

后来仔细一看,库存慢查询语句,要查询库存的商品比平时多很多。商品个数少的话,这条语句还是非常快的,一旦多了就开始慢了。


解决方案


由于库存计算体系的历史原因,这条SQL是很难优化的。情况又是十万火急的,大老板一直在问咋回事。因此临时改代码,将商品库存放到Redis缓存起来。购物车服务的话,是允许库存数据不实时的,因为后面的结算和支付会实时计算库存,库存不足的时候,会提示用户的。

注意:

  • 由于购物车是入口,流量很大,而从购物车到结算页再到支付,由于有一个操作步骤,因此结算页和支付页的流量是没有购物车那么大的;
  • 部分用户购物车上的商品数据是非常多的,但是未必都会买,用户也可以勾选要买的商品,然后下单;
  • 部分用户没有清理购物车失效商品的习惯,导致购物车上的商品非常多。

终极解决方案


将库存服务独立出去,将商品库存数据放置到缓存,并引入实时刷新缓存中库存数据的机制,让缓存中的数据尽量保证新鲜。这样的话,查询库存的时候,大部分都可以从缓存中获取,不会穿透到数据库上。


补充


我们对接口进行压测的时候,部分场景下,要考虑入参的个数,不能简单的用几个数据压测,觉得性能OK就不管了。


原文链接


一条慢SQL导致购物车服务无法使用

© 著作权归作者所有

共有 人打赏支持
Sam哥哥聊技术
粉丝 78
博文 12
码字总数 13949
作品 0
广州
高级程序员
私信 提问
加载中

评论(2)

Sam哥哥聊技术
Sam哥哥聊技术

引用来自“不能告诉你我的名字”的评论

“引入实时刷新缓存中库存数据的机制"
,请问,这是啥机制,实时同步mysql和redis的么?
第一种办法是:由一个定时任务去扫描,将库存数据同步到缓存里;
第二种办法是:监听库存表的binlog,然后将数据变化发消息到kafka里,再由消息消费者去消费这条消息,刷新缓存中的库存数据。
不能告诉你我的名字
不能告诉你我的名字
“引入实时刷新缓存中库存数据的机制"
,请问,这是啥机制,实时同步mysql和redis的么?
Innodb索引和锁的学习笔记

附录:前段时间学习了下innodb锁的相关知识,对锁和事务有了大体理解,这里做个小总结。 1.Innodb事务和锁的关系。 Innodb区别于MyISAM的两个特点就是Innodb对于事务的支持和对行锁的支持。事...

天天顺利
2015/09/18
80
0
实例解析MySQL性能瓶颈排查定位

实例解析MySQL性能瓶颈排查定位 时间:2016-02-06 14:05来源:未知 作者:最模板 点击:129次 收到线上某业务后端的MySQL实例负载比较高的告警信息,于是登入服务器检查确认。 1. 首先我们进行O...

tantexian
2016/05/18
42
0
关于Mysql CPU占用过高的问题排查与优化

今天中午公司App出现网络错误无法请求数据的情况,登上阿里云看cpu使用率居然一直高达90+%,于是上服务器看究竟是哪个程序占用的,top一下,发现是mysql,下面就开始针对为什么会占用这么高的...

拼客顺风车
2018/04/13
0
0
Java软件开发中可能出现几个错误观点

原文:http://blog717171.blog.163.com/blog/static/250603111201511904934806/ 越来越多人开始使用Java,但是他们大多数人没有做好足够的思想准备(没有接受OO思想体系相关培训),以致不能很...

学习环境
2015/12/13
114
3
mysql日志总结

第1章 Mysql日志 1.1 错误文件的配置方式 1.1.1 方法1:在my.cnf配置文件中调整 注意,是在[mysql_safe]模块下面进行配置 [root@mobanji logs]# vim /etc/my.cnf [mysqld_safe] log-error =...

CC丶Okay
2017/06/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

乱入Linux界的我是如何学习的

欢迎来到建哥学Linux,咳!咳!咳!开个玩笑哈,我是一个IT男,IT界的入门选手,正在学习Linux。 在之前,一直想进军IT界,学习IT技术,但是苦于没有人指导,也不知道学什么,最开始我自己在...

linuxprobe16
34分钟前
1
0
OSChina 周日乱弹 —— 没时间 没头发 但有钱

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @开源中国总经办主任 :分享齐一的单曲《这个年纪》 《这个年纪》- 齐一 手机党少年们想听歌,请使劲儿戳(这里) @肿肿卷 :我真的可以睡一天...

小小编辑
今天
45
4
Django进阶 1.1 ORM基础—ORM 1.2.1 增删改查之查询 1.2.2 删改增 (1) 1.2.3 删改增 (2)

ORM基础 ORM是Django操作数据库的API,Django的作者将sql语句封装在里面供我们使用。 我们前面还提到过Django提供一个模拟数据库的工具,sqlite,供我们学习测试使用。 如果我们想使用mysql...

隐匿的蚂蚁
今天
3
0
Windows 上安装 Scala

在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了。 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法。 接下来,我们可以从 ...

honeymose
今天
3
0
数据库篇多表操作

第1章 多表操作 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系...

stars永恒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部