文档章节

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

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

概述


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


临时处理


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


问题定位


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

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


解决方案


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

注意:

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

终极解决方案


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


补充


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


原文链接


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

© 著作权归作者所有

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

评论(2)

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

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

“引入实时刷新缓存中库存数据的机制"
,请问,这是啥机制,实时同步mysql和redis的么?
第一种办法是:由一个定时任务去扫描,将库存数据同步到缓存里;
第二种办法是:监听库存表的binlog,然后将数据变化发消息到kafka里,再由消息消费者去消费这条消息,刷新缓存中的库存数据。
不能告诉你我的名字
不能告诉你我的名字
“引入实时刷新缓存中库存数据的机制"
,请问,这是啥机制,实时同步mysql和redis的么?
Java软件开发中可能出现几个错误观点

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

学习环境
2015/12/13
114
3
Innodb索引和锁的学习笔记

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

天天顺利
2015/09/18
80
0
常见并发问题

重复添加购物车 背景 购物车中同一商品只能有一条记录 添加购物车时,如果商品已经存在,则在原来的数量上增加;如果不存在,则insert一条数据 错误逻辑    添加购物车流程图 时间线示意图...

齐晋
2017/04/12
0
0
Java编程语言在软件开发中的几个认识误区

越来越多人开始使用Java,但是他们大多数人没有做好足够的思想准备(没有接受OO思想体系相关培训),以致不能很好驾驭Java项目,甚至 导致开发后的Java系统性能缓慢甚至经常当机。很多人觉得这...

一堆BUG
2012/02/27
0
0
实例解析MySQL性能瓶颈排查定位

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

tantexian
2016/05/18
42
0

没有更多内容

加载失败,请刷新页面

加载更多

php获取客户端IP

php获取客户端IP 首先先阅读关于IP真实性安全的文章:如何正確的取得使用者 IP? 「任何從客戶端取得的資料都是不可信任的!」 HTTP_CLIENT_IP头是有的,但未成标准,不一定服务器都实现。 ...

DrChenXX
14分钟前
0
0
. The valid characters are defined in RFC 7230 and RFC 问题

通过这里的回答,我们可以知道: Tomcat在 7.0.73, 8.0.39, 8.5.7 版本后,添加了对于http头的验证。 具体来说,就是添加了些规则去限制HTTP头的规范性 参考这里 具体来说: org.apache.tom...

west_coast
32分钟前
1
0
刷leetcode第704题-二分查找

今天双十一买的算法书到货了,路上刷到有人说的这个题,借(chao)鉴(xi)一下别人的思路,这个是C++标准库里面的经典方法,思路精巧,优雅好品味 int search(int* nums, int numsSize, in...

锟斤拷烫烫烫
57分钟前
1
0
【分享实录】BANCOR算法详解及代码实现

1 活动基本信息 1)主题:【区块链技术工坊22期】BANCOR算法详解及代码实现 2)议题: BANCOR算法的特点和优劣势 BANCOR算法和举例 如何加入BANCOR.NETWORK交易所 如何开发自己的BANCOR去中心...

HiBlock
今天
2
0
微信小程序(2)

开始看微信小程序的教程了。刚刚看完官方教程的视图层部分。这里摘录一些自己认为的部分关键点。 1.直接修改数值无法重新渲染,需要使用setData()方法; 2.列表渲染中:wx:key用于保持项目在...

MKjy
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部