「千万级秒杀架构」千万级并发流量下,如何将流量串行化?

一壶清酒 2021-01-15 10:17:07 ⋅ 81 阅读
流量串行化,是指在高并发的场景下通过排队的方式将无序的并发流量整理成有序串行流量。

大家都知道在 Redis 集群部署模式出现之前,市面上大多数 的 Redis 都是采用一主多从模式,写操作全部是由主节点来执行。但是一主多从模式下主节点是单节点,所以 Redis 的写操作并发能力远远低于读操作并发能力。

那么在千万级并发流量场景下,虽然前面我们通过流量拦截器将大部分流量过滤掉了,但剩下的流量也不容小视。比如虽然过滤了 990 万,也就是 99% 的流量,但还剩下 10 万流量。如果这些流量都去扣减库存,会对 Redis 主节点将会产生巨大压力。怎么办呢?这就需要流量串行化。具体要怎么做呢?
总的来说,秒杀中的串行化主要是通过“队列”和“分布式事务”来实现的,具体分三步。

第一步,秒杀服务在扣减内存缓存中的库存成功后,将流量转入到它的内存队列中,进行初步排序,为写 MQ 做准备。
这里注意的是,要控制好内存队列缓冲区大小,太小可能会导致并发写入的时候大量请求被阻塞,可以将大小设置为消费端速度的两倍。比如消费端速度是 1000 QPS,则缓冲区可以设定为可以缓存 2000 个请求。

第二步,使用一个线程或者协程以固定速度从内存队列中消费流量,将流量写入到像 RabbitMQ 这种 MQ 中。
这一步主要是为了减轻 MQ 的并发压力,需要根据 MQ 的承载能力计算好速度。比如 MQ 的并发承载能力为 5 万 QPS,秒杀有 50 个节点,则每个节点的速度应当低于 1000 QPS。保留 20% 余量的话,每个节点的速度可以设定为 800 QPS。

第三步,使用另一个线程或协程,以低于第二步中的固定速度从 MQ 中消费流量,然后利用 Redis 事务从 Redis 中扣减库存,避免超售。最终,根据扣减库存的结果,给用户返回对应的提示信息。

需要注意的是,秒杀服务有多个节点,不同节点需要用使用不同的队列,但单个节点的内部,必须用同一个队列。这么做是因为多个节点间是不能共享客户端连接的,只有在节点内部消费自己的流量,才能给用户返回处理结果。
看到上面这三步,不知道你有没有联想到之前讲到的限流器?没错,第二步和第三步中的固定速度就是用限流器来实现。可以说,串行化的核心思路就是:使用队列将请求进行排队、限流,使用分布式锁对资源进行原子操作。

全部评论: 0

    我有话说:

    打造流量系统

    讲师:易乐天 前小米国际电商技术负责人 10 年软件开发经验。多年 Linux 系统编程、高性能和高并发编程经验。参与过亿用户、日活、百并发系统开发,曾经 IM 云 WebSocket

    打造流量系统

    背景介绍服务器成本高?经常遇见宕机?网站流量一大就出 bug ?...... 面对大流量的业务需求,任何一家大厂和高速扩张的企业,都非常需要可以掌握高可用、高性能、高并发 “三高”系统架构设计能力的

    为什么说作为程序员分库分表的必要性一定要掌握?

      互联网大厂程序员必须掌握海量数据和高并发问题处理技能,期望进入大厂的程序员一定要仔细看这篇! MySQL 分库分表是做什么的? 相信很多程序员对 MySQL 都比较熟悉了,目前国内

    「免费」电商高并发实战

    IT老齐 16年Java研发与架构设计经验、前京东金融架构师、中国财政部数据平台架构师、专注送给小白的实战课、只为高薪而生、重实战,说人话,讲干货,不扯淡!

    Java Web实战篇-轻松提高数据库查询效率

    通过优化数据库设计、java后台和数据库优化达到提高数据查询的效率。

    面试官:如何设计数据库平滑扩容架构

    该方案能够实现n库扩2n库的、平滑扩容,增加数据库服务能力,降低单库一半的数据量,其核心原理是:成倍扩容,避免数据迁移。

    创业团队如何设计支撑百并发的数据库架构

    我们来聊一下对于一个支撑日活百用户的高并系统,他的数据库架构应该如何设计?

    什么情况才需要分库分表?

    我请教一下,我模拟测试,搞了几张大表都是3左右的数据,带主键查询响应,jmeter插入能够达到每6、700条左右,我业务量每就是300条左右插入,这个场景是否不需要考虑分库分表的问题?

    车和家再获B轮30亿融资加入滴滴造车梦/小程序的危机!小程序受到联合挑战!/“大数据熟”涉欺诈......

    车和家再获B轮30亿融资加入滴滴造车梦;小程序的危机!小程序受到联合挑战!;“大数据熟”涉欺诈,住宿、出行、购票要当心;5用户信息遭泄露,或面临2亿美刀处罚,Facebook是否还能坚挺?

    阿里技术:聊一聊从单机至亿流量大型网站系统架构的演进过程

    网站的初期,我们经常会在单机上跑我们所有的程序和软件。此时我们使用一个容器,如tomcat、jetty、jboos,然后直接使用JSP/servlet技术......

    为什么单线程的Redis能够达到百的QPS?

    作者:在江湖中coding链接:https://juejin.im/post/5e6097846fb9a07c9f3fe744 性能测试报告 查看了阿里云 Redis 的性能测试报告如下,能够

    “12306”是如何支撑百QPS的?

    ! 12306 抢票,极限并发带来的思考 虽然现在...

    社交电商「礼物说」完成亿元C1轮融资;蚂蚁金服估值$1600亿全球最大独角兽;智能健身舱「公园盒子」获数A+轮融资;

    「礼物说」完成亿元C1轮融资,用礼物红包小程序发力社交电商;蚂蚁金服成为全球最大独角兽公司,估值1600亿美元;24H智能健身舱「公园盒子」获数A+轮融资;

    Nginx服务器高性能优化--轻松实现10并发访问量

    作者:章为忠学架构https://www.toutiao.com/i6804346550882402828 前面讲了如何配置Nginx虚拟主机,如何配置服务日志等很多基础的内容,大家可以去这里看看

    京东技术:如何实现百TPS?详解JMQ4的存储设计

    JMQ是京东中间件团队自研的消息中间件,诞生于2014年,服务京东近个应用,2018年11.11大促期间的峰值流量超过5000亿条消息

    架构设计原则 - 高并发

    并发设计可以从以下几方面考虑:无状态拆分服务消息队列数据异构缓存并发1. 无状态无状态的应用容易进行水......

    如何实现单服务器300个长连接的?

    有没有试验过单机能抗300个长连接的操作?分享一下