01 | 设计秒杀系统时应该注意的5个架构原则
01 | 设计秒杀系统时应该注意的5个架构原则
讲述:秭明
时长12:09大小5.56M
架构原则:“4 要 1 不要”
不同场景下的不同架构案例
总结
赞 43
提建议
精选留言(101)
- 黄金的太阳2018-10-01希望老师可以分别从1W QPS,10W QPS ,100WQPS在架构升级前遇到的性能瓶颈做为讲解入口点,为什么这样设计之后就能解决问题的方式,为什么切分点是1万,10万和100万,瓶颈的分析方式等等,感觉效果更好,否则看到一堆架构,但并不清楚为什么要这样做还是很难平移到自己的系统设计中,一点拙见,希望老师能够解惑
作者回复: 架构升级的逻辑要具体问题具体分析的 例如秒杀的场景来说,不同QPS量级下瓶颈也会不一样,10w级别可能瓶颈就在数据读取上,通过增加缓存一般就能解决,如果要到100w那么,可能服务端的网络可能都是瓶颈,所以要把大部分的静态数据放到cdn上甚至缓存在浏览器里 所以要做架构升级,还是主要要分析在预估的QPS下,整个系统的瓶颈会在什么地方,要针对这起瓶颈来重新设计架构方案
共 3 条评论276 - Mr.钧👻2018-10-02高并发系统的几大方向 1.请求数据尽量少,从而减少cpu消耗 2.访问路径尽量短,减少节点消耗 3.强依赖尽量少,减少加载时间 4.不要有单点,要有备份 5.减少额外请求,减少加载时间展开
作者回复: 👍
共 2 条评论84 - 小喵喵2018-10-011 .本地cache用什么实现好呢? 2. 通过什么方式往本地cache 写数据呢? 3. 秒杀系统的及时性非常高,把库存写进cache ,怎么及时更新呢?
作者回复: 1.本地cache一般就是用内存实现,用java集合类型就行 2.用订阅的方式,在初始化时加载到内存 3.有两种方法,一是定时更新取3秒,二是,主动更新,数据库字段更新后发消息更新缓存,这个需要用到一个组件阿里叫metaq就是就是数据库字段更新会产生一条消息。另外cache里库存不需要100%和数据库一致,这个在后面的文章也有介绍
共 3 条评论48 - 酱了个油2018-10-09库存不会放在localcache,localcache只放静态数据。 库存是放在独立的缓存系统里,如redis,库存是采用主动失效的方式来失效缓存
作者回复: 👍
28 - Edward2018-10-01数据缓存在机器内存中的话,集群内如何实现多台机器数据一致性?
作者回复: 在内存的数据是静态数据,不会更新,没有一致性问题
共 4 条评论26 - 王永旺2018-10-01单点的概念是啥意思,不太明白
作者回复: 单点就是没有备份,挂了系统没法正常服务了
共 4 条评论17 - MeazZa2018-10-01请问一下减库存的结果分别是如何更新到公共缓存和本地缓存的呢?
作者回复: 缓存的更新一般都是没命中时再填充更新 没命中的原因一种是主动失效,一种是定时失效 公用缓存主动失效较多,本地缓存,定时失效更常用
16 - 王虹凯2018-10-02能不能给一些你认为的关键知识点在文章最后加一些对这些点的外链。这样可以更详细,当然更具系统性。 极客时间也可以考虑这样的一个功能,整个当前专栏共用这些链接。 当然,作者不加这些也没问题,只是觉得那样是不是更权威些。不过要求作者太多了!
作者回复: 你想了解那块内容,我可以单独发给你😊
14 - 云飞2018-11-28老师你好,刚才说要设计时候尽量做到4要1不要,1不要就是不要用单点,也就是因为没有数据备份,想问这个单点和单点登录系统的单点有什么关系吗?希望老师有时间可以解答一下。
作者回复: 这里的单点有两层含义 一是本身的系统是单点系统,比如你说的登录系统,所以其他系统需要验证登录状态时都需要调用他,那他就是一个单点,怎么解决?解决的办法就是尽量让这个系统简单,减少更改保持稳定。 另外一种是状态单点或者叫数据单点,也就是状态一旦丢失比较难恢复,这个就比较麻烦,比如保存登录状态的session保存在一台机器内存中,一旦这台机器挂掉,状态丢失就比较难恢复,这个单点就比较严重
共 2 条评论12 - 10242018-11-25阅读5分钟,留言中回复看了半个多小时;感觉从读者讨论中收益更大,许神加油!
作者回复: 😊
11 - broken_open2019-02-15老师你好,减库存操作,update count = count-1 where count>0,这种做法不会多卖吧?
作者回复: 😉
共 12 条评论10 - 李海凡2018-10-05想了解系统性能和架构升级背后的逻辑是什么,这样设计系统解决了具体什么瓶颈,例如您举的例子中,qps只能到10w、为什么只能到10w,瓶颈在什么地方,如何分析,如何解决
作者回复: 架构升级的逻辑要具体问题具体分析的 例如秒杀的场景来说,不同QPS量级下瓶颈也会不一样,10w级别可能瓶颈就在数据读取上,通过增加缓存一般就能解决,如果要到100w那么,可能服务端的网络可能都是瓶颈,所以要把大部分的静态数据放到cdn上甚至缓存在浏览器里 所以要做架构升级,还是主要要分析在预估的QPS下,整个系统的瓶颈会在什么地方,要针对这起瓶颈来重新设计架构方案
8 - Lugyedo2018-10-01缓存中的热点数据在高并发情况下如何保证一致
作者回复: 减库存一章会有介绍
7 - 潘政宇2018-10-01每经过一个节点,一般都会产生一个新的 Socket 连接。什么意思啊,不是一个tcp连接就有一个socket吗,从客户端到server就是一个tcp连接啊?
作者回复: 就是每经过一个节点会产生一个新的tcp连接
共 3 条评论7 - Mine2019-04-18库存cache的更新为什么要通过mq去处理呢,感觉直接在操作数据库之后更新下缓存就可以了啊~ 为什么还要发一条消息呢~
作者回复: 发消息就是为了更新缓存啊
共 8 条评论6 - 小黄鸡2019-06-29想问下许老师, 1. 基于canal同步mysql的数据到redis中,如果是更新操作,redis有延时怎么办呢? 2. 从mysql同步主mysql,如果有延时,怎么办呢? 这两个问题一直困扰着我共 7 条评论5
- 南琛一梦2018-10-09文中讲的原则在后续给出的架构演变例子中,并没有很好的进行说明,看完之后,并没有对此有深刻体会
作者回复: 😊,可以看看后面的文章,会有更一些详细的介绍
5 - 猎户星座2018-10-01请问秒杀的时间是怎么控制的,比如十点开始,十点十分结束。各个客户端、客户端与服务器、以及集群内的服务器之间。时间如何精确同步?
作者回复: 都是以服务端的时间为准,服务端的时间同步需要依赖一个时间同步组件完成如ntp 当然当前的服务器时间同步还是有一定的时间延时,但是也不是太影响
6 - xiaoxiangran2019-03-29我对秒杀系统有个最大的疑惑,就是从页面发出的请求用同步还是异步?如果用同步的话:1,后端服务必然是分布式的,需要经过多个节点,时间可能会被拉的很长,同时失败的可能性也会增大;2,基于1的情况,会有一个长连接长时间存在,这样随着请求的增多,连接资源越来越少,系统吞吐量会是瓶颈。如果用异步的话:不断的轮询必然会增加系统的请求量,对连接资源也是一种浪费。所以,这应该怎么选择呢?
作者回复: 各有利弊,就看你最在意什么:)
共 2 条评论4 - 机遇号2019-03-14您好, 关于这个没搞懂。 把远程过程调用(RPC)变成 JVM 内部之间的方法调用。 这个怎么解释一下吗
作者回复: 几句话很难解释清楚,建议看看《大型网站技术架构演进》的合并部署一章有详细的解释
4