作者简介
小6,世界五百强产品出身,现任深圳某互联网公司IT负责人,<极客时间>课程讲师。
搭建IT团队让我有了丰富的面试经验,简历筛选超1000份,面试超200人,也让我意识到面试是有技巧的,关注小6,带你实战互联网求职面试!
马听老师给了三个方案:
1)方案一
首先就是建议研发把秒杀功能放到Redis上,比如把参与活动的所有用户id写到Redis某个列表里,然后选出最前面的100个,这100个就算是秒杀成功的。
第二步,再延迟去扣库存。
2)方案二
实在需要去MySQL里操作:
可以在客户端进行并发控制,不能让40w的QPS全打到MySQL上,因为MySQL会有死锁检测机制。
另外就是提前优化相关功能的SQL,看索引设计是否合适。
max_connections是可以适当调大一点,binlog_sync可以设到100。
还有一个可以优化的方法,就是把热点行分散到多行,比如某个商品,库存1000,原来在MySQL里是1行记录,库存1000,可以改成100行记录,每行记录库存10。
3)方案三
就是数据库层面排队,这个需要有内核开发能力,阿里就做过类似的改动,在数据库层上对单行记录做到并发排队。
当然,不管采用什么方案,都需要提前模拟业务场景的压测,看哪些地方需要优化的,比如笔者待过的一家公司,就遇到过上线之后,网络带宽不够的场景(虽然当时带宽已经相对上一次同类型活动,扩容了三倍)。
我们再看看星球大佬们的补充:
@冰美式:
db硬件资源高的话,调大innodb_thread_concurrency 有利于并发。
@马听 回复 @冰美式:
是的,这个参数表示InnoDB允许的最大线程数,一般建议设置为CPU核数的两倍。
@InnerCodeD 回复 @冰美式:
这个参数很坑人, 限制并发线程,QPS包含SELECT. 类似队列!
导致CPU和内存都使用不高,反而大量SLOW SQL出现!
要开启这个参数,需要做好读写分离.把大量SELECT转移到别的库上。
@Tonyhacks:
这种场景下程序的连接池该如何配置?
@马听 回复 @Tonyhacks:
最小空闲连接数,可以调高一点,可以方便快速响应突发的请求。最大连接数稍微调高点,但是需要确保不超过MySQL的处理能力。比如10台应用机器,每台最大连接数设置的100,那高峰可能到数据库的连接数就是1000了 连接超时时间可以适当缩短,避免无效的连接过多的占用资源。
@北在南方:
业务端 缓存,限流, 排队 数据库侧 如果开源数据库,可以关闭死锁检测, 调整 innodb 并发数 相关参数,但是还是会有 threads 飙高的情况发生 如果用云数据库,腾讯,阿里云都有 热点行更新的特性, 结合内核优化 ,性能比开源 MySQL 性能好很多。
@马听 回复 @北在南方:
这个可以,云上RDS 这个特性,确实很多人不知道。
可以看到,星球里不仅仅是老师分享,其他很多大佬都有自己的见解,也会有更好的处理方案。
我们的【DBA驿站】星球,目前已超过250人,270篇主题,在原先DBA面试的基础上,又增加了【DBA实战】专栏,后续还会开更多适合DBA学习的内容!
感兴趣的小伙伴可以领券加入,券后只要几十块钱!平均每天2毛钱!
星球详细介绍可以看看这篇文章:
运营一年!227人!268篇主题!DBA交流、学习、面试,看这里就够了!
1.回复“字节”,获取字节跳动终面(HRBP)10道精选面试题及分析
2.回复“小米”,获取小米(HRBP)10道精选面试题及分析
3.回复“HR”,获取精选20道精选HR面试题及分析
4.回复“DBA简历”,获取DBA简历模板
5.回复“产品经理”,获取20道精选产品经理面试题及分析
6.回复“数据库”,获取10道精选数据库面试题及分析
7.回复“星球”,获取【DBA驿站】知识星球最新优惠券
8.回复“简历修改”,获取简历修改方式
9.扫码加群(产品经理、DBA、AI)