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


声明:本文转载自https://my.oschina.net/samgege/blog/2873606,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

概述


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


临时处理


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


问题定位


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

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


解决方案


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

注意:

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

终极解决方案


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


补充


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


原文链接


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

本文发表于2018年11月08日 15:00
(c)注:本文转载自https://my.oschina.net/samgege/blog/2873606,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1746 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1