美文网首页
如何设计秒杀系统学习笔记.md

如何设计秒杀系统学习笔记.md

作者: jack_fd | 来源:发表于2020-01-02 13:18 被阅读0次

    秒杀系统架构设计都有哪些关键点

    秒杀其实主要解决两个问题

    1. 一个是并发读
    2. 一个是并发写;

    架构上的高可用、一致性和高性能的要求

    1. 高性能。 秒杀涉及大量的并发读和并发写,因此支持高并发访问这点非常关键。从设计数据的动静分离方案、热点的发现与隔离、请求的削峰与分层过滤、服务端的极致优化这 4 个方面重点介绍。
    2. 一致性。 秒杀中商品减库存的实现方式同样关键。可想而知,有限数量的商品在同一时刻被很多倍的请求同时来减库存,减库存又分为“拍下减库存”“付款减库存”以及预扣等几种,在大并发更新的过程中都要保证数据的准确性,其难度可想而知。因此,我将用一篇文章来专门讲解如何设计秒杀减库存方案。
    3. 高可用。 虽然我介绍了很多极致的优化思路,但现实中总难免出现一些我们考虑不到的情况,所以要保证系统的高可用和正确性,我们还要设计一个 PlanB 来兜底,以便在最坏情况发生时仍然能够从容应对。专栏的最后,我将带你思考可以从哪些环节来设计兜底方案。

    设计秒杀系统时应该注意的5个架构原则

    架构原则:“4 要 1 不要”

    1. 数据要尽量少
    2. 请求数要尽量少
    3. 路径要尽量短
    4. 依赖要尽量少
    5. 不要有单点

    1w/s 请求量

    1.把秒杀系统独立出来单独打造一个系统,这样可以有针对性地做优化,例如这个独立出来的系统就减少了店铺装修的功能,减少了页面的复杂度;
    1.在系统部署上也独立做一个机器集群,这样秒杀的大流量就不会影响到正常的商品购买集群的机器负载;

    1. 将热点数据(如库存数据)单独放到一个缓存系统中,以提高“读性能”;
    2. 增加秒杀答题,防止有秒杀器抢单。

    100w/s 请求量

    1. 对页面进行彻底的动静分离,使得用户秒杀时不需要刷新整个页面,而只需要点击抢宝按钮,借此把页面刷新的数据降到最少;
    2. 在服务端对秒杀商品进行本地缓存,不需要再调用依赖系统的后台服务获取数据,甚至不需要去公共的缓存集群中查询数据,这样不仅可以减少系统调用,而且能够避免压垮公共缓存集群。
    3. 增加系统限流保护,防止最坏情况发生。

    1W QPS,10W QPS ,100WQPS在架构升级前遇到的性能瓶

    1. 10w级别可能瓶颈就在数据读取上,通过增加缓存一般就能解决
    2. 100w那么,可能服务端的网络可能都是瓶颈,所以要把大部分的静态数据放到cdn上甚至缓存在浏览器里

    二八原则:有针对性地处理好系统的“热点数据”

    具体到“秒杀”业务,我们可以在以下几个层次实现隔离

    1. 业务隔离。把秒杀做成一种营销活动,卖家要参加秒杀这种营销活动需要单独报名,从技术上来说,卖家报名后对我们来说就有了已知热点,因此可以提前做好预热。
    2. 系统隔离。系统隔离更多的是运行时的隔离,可以通过分组部署的方式和另外 99% 分开。秒杀可以申请单独的域名,目的也是让请求落到不同的集群中。
    3. 数据隔离。秒杀所调用的数据大部分都是热点数据,比如会启用单独的 Cache 集群或者 MySQL 数据库来放热点数据,目的也是不想 0.01% 的数据有机会影响 99.99% 数据。

    流量削峰这事应该怎么做?

    排队

    答题

    分层过滤

    秒杀系统“减库存”设计的核心逻辑

    下单减库存

    付款减库存

    预扣库存

    大型秒杀中如何减库存?

    1. “下单减库存”在数据一致性上,主要就是保证大并发请求时库存数据不能为负数,也就是要保证数据库中的库存字段值不能为负数,一般我们有多种解决方案:一种是在应用程序中通过事务来判断,即保证减后库存不能为负数,否则就回滚;另一种办法是直接设置数据库的字段数据为无符号整数,这样减后库存字段值小于零时会直接执行 SQL 语句来报错;再有一种就是使用 CASE WHEN 判断语句,例如这样的 SQL 语句:

    UPDATE item SET inventory = CASE WHEN inventory >= xxx THEN inventory-xxx ELSE inventory END
    要解决并发锁的问题,有两种办法:

    1. 应用层做排队。按照商品维度设置队列顺序执行,这样能减少同一台机器对数据库同一行记录进行操作的并发度,同时也能控制单个商品占用数据库连接的数量,防止热点商品占用太多的数据库连接。
    2. 数据库层做排队。应用层只能做到单机的排队,但是应用机器数本身很多,这种排队方式控制并发的能力仍然有限,所以如果能在数据库层做全局排队是最理想的。阿里的数据库团队开发了针对这种 MySQL 的 InnoDB 层上的补丁程序(patch),可以在数据库层上对单行记录做到并发排队。

    相关文章

      网友评论

          本文标题:如何设计秒杀系统学习笔记.md

          本文链接:https://www.haomeiwen.com/subject/nbanoctx.html