亿级流量架构实战之双十一秒杀架构设计(代码片段)

程序员大咖 程序员大咖     2023-03-05     159

关键词:

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇

本文作者:等不到的口琴 
本文链接:

https://www.cnblogs.com/Courage129/p/14493931.html

前面已经写了很多亿级流量的文章, 中间讲了各种处理思路, 这儿将这些思路与业务综合起来, 情形一就是秒杀, 提到秒杀, 很多人都会觉得这是一件技术要求很高的事情, 因为这涉及到超大访问量(可能瞬间千万倍的用户访问商品)、维护数据一致性(不能超卖), 前者对性能有极高的要求, 而后者又正好拉低了性能,本文谈谈秒杀的设计思路, 并在最后给出秒杀设计的简单模型图。

秒杀的情景

生活中有很多秒杀的情景, 例如商家促销, 像一元抢茅台, 五毛钱抢宝马(这儿只是一个例子), 假如一百万人来抢十瓶茅台, 这时候肯定不能多卖出, 也就是不能被大于10的人数抢到, 通常最后时间会有一个倒计时按钮, 30...29...28......3...2...1 GO! 之后跃跃欲试的人们开始抢。

这时候有以下问题需要被考虑 :

第一是多个客户端的时间如何保持同步, 也就是让大家看到时间是一致的, 不能你显示3, 而我这还显示 30 。

第二是如何保证有没有黄牛用机器人抢 。

第三是如何确保后端服务器可以支撑住这巨大的流量。

......

秒杀解决思路

有了上面的情景以及引出来的问题, 来看看秒杀方案的设计思路, 我们服务器如何应对这一百万的TPS呢?

首先想到的是扩容, 详情可以参考服务器扩容思路及问题分析 , 但这是不现实的, 因为扩容需要很多很多机器, TPS增加一万倍对物理服务器的性能要求远远不止一万倍, 另外对于一个商家来说, 为了这一次促销活动购置服务器是不划算的, 平时势必有众多的机器处于闲置状态。

没法扩容, 那么也就意味着要使用其他方法, 如果所有请求访问一台物理机器肯定不行, 一百万的数据访问无论如何分库分表都无济于事, 因为面对的每一条都是热点数据, 所以要用到分布式架构的思路。

秒杀的技术方案

分布式, 可以降低服务器的压力, 下面开始讲述秒杀的设计思路。

方案一

很明显, 要让一百万用户能够同时打开抢货的网页, 势必要用要到CDN(内容分发网络, 对这个概念不清楚的话可以参考:全局负载均衡与CDN内容分发), CDN主要作用有两个, 一方面是将一些不会改变的静态资源放到离客户端较近的边缘服务器上, 这样客户端请求数据的时候可以直接从边缘服务器获取, 降低中心服务器的压力, 另外一方面可以把小服务部署到 CDN 结点上去,这样,当前端页面来问开没开始时,这个小服务除了告诉前端开没开始外,它还可以统计下有多少人在线。每个小服务会把当前在线等待秒杀的人数每隔一段时间就回传给我们的数据中心,于是我们就知道全网总共在线的人数有多少。

假设,我们知道有大约 100 万的人在线等着抢,那么,在我们快要开始的时候,由数据中心向各个部署在 CDN 结点上的小服务上传递一个概率值,这个概率值为CDN节点人数权重乘以获奖概率, 比如说是ee。于是,当秒杀开始的时候,这 100 万用户都在点下单按钮,首先他们请求到的是 CDN 上的这些服务,这些小服务按照 ee 的量把用户放到后面的数据中心,也就是放过去 人数∗e人数∗e,剩下的都直接返回秒杀已结束。

方案二

利用我们分布式中限流、网关等知识, 将请求层层筛选, 降低最后连接到数据库的请求。

首先也是利用CDN将静态资源分发在边缘服务器上, 当进行服务请求时, 先进行鉴权, 鉴权主要是筛选机器人等非人工抢购, 根据实际经验, 鉴权可以筛选很大一部分用户, 例如是否登录。

当鉴权确定是真实有效的用户之后, 通过负载均衡(详情可以参考LVS负载均衡理论以及算法概要)也就是LVS+Keepalived 将请求分配到不同的Nginx上,一般会建立Nginx集群, 然后再通过网关集群, 即使这样还是要增加一些限流措施, 如果到这一步还是有很多请求压到数据库势必撑不住, 那么可以采取服务限流、服务降级等措施,进行削峰处理。到这儿理论上流量就不高了, 如果还是很高, 后面就将热点数据放进缓存集群中进行预热, 同时设置定时任务,一方面关注数据库与缓存的一致性, 另一方面关闭超时未支付的订单, 当订单提交之后 交给任务队列, 生成订单、修改数据库、做好持久化工作。

架构图:

这就是整个“秒杀”的技术细节,是不是有点不敢相信?

与这种秒杀业务类似的还有12306抢票, 这个也是瞬间高流量, 但是上面提到的架构就不适合了,因为12306完全不知道用户来是要买哪张火车票的。不知道这个信息,很不好过滤用户,而且用户在买票前需要有很多查询操作,然后在查询中选择自己的车票。也就意味着没法在开始就过滤用户。

12306 最好的应对方式,除了不要一次把所有的票放出来,而是分批在不同的时间段把票放出来,这样可以让人们不要集中在一个时间点来抢票,做到人肉分流,可以降低一些并发度。

另外,12306 最好是用预售的方式,让大家把自己的购票先输入到系统中。系统并不真正放票,而是把大家的需求都收集好,然后做整体统筹安排,该增加车次的增加车次,该加车厢的加车厢,这样可以确保大家都能走。实在不行,就抽签了。

总结

我们可以看到,解决秒杀这种特定业务场景,可以使用 CDN 的边缘结点来扛流量,然后过滤用户请求(限流用户请求),来保护数据中心的系统,这样才让整个秒杀得以顺利进行。也可以像方案二那样逐层过滤请求, 这种业务场景和双十一相同吗? 如果像双 11 那样,想尽可能多地卖出商品,
那么就不像秒杀了。这是要尽可能多地收订单,但又不能超过库存,其中还有大量的银行支付,各大仓库的库存查询和分配,这些都是非常慢的操作。为了保证一致性,还要能够扛得住像双 11 这样的大规模并发访问,那么,应该怎么做呢?

使用秒杀这样的解决方案基本上不太科学了。这个时候就需要认认真真地做高并发的架构和测试了,需要各个系统把自己的性能调整上去,还要小心地做性能规划,更要把分布式的弹力设计做好,最后是要不停地做性能测试,找到整个架构的系统瓶颈,然后不断地做水平扩展,以解决大规模的并发。

有些时候,我们总是在想数据中心的解决方案。其实,我们有时候也需要换一换思路,也许,在数据中心解决并不一定是最好的方式,放在边缘来解决可能会更好一些。尤其是针对一些有地域特征的业务,比如像外卖、共享单车、打车这样的业务。其实,把一些简单的业务逻辑放在边缘,比放在数据中心不但能够有更好的性能,还有更便宜的成本。我觉得,随着请求量越来越大,数据也越来越多,数据中心是有点到瓶颈了,而需要边缘结
点来帮忙了。而且,这个边缘化解决方案的趋势也会越来越有优势。

-End-

最近有一些小伙伴,让我帮忙找一些 面试题 资料,于是我翻遍了收藏的 5T 资料后,汇总整理出来,可以说是程序员面试必备!所有资料都整理到网盘了,欢迎下载!

点击👆卡片,关注后回复【面试题】即可获取

在看点这里好文分享给更多人↓↓

2个大厂100亿级超大流量红包架构方案(代码片段)

2个大厂100亿级超大流量红包架构方案文章目录2个大厂100亿级超大流量红包架构方案100亿级红包应用场景概述百亿级微信红包技术架构架构**南北分布****拆红包入账异步化****发拆落地,其他操作双层cache**高并发**红包算法****... 查看详情

亿级流量架构之服务限流思路与方法(代码片段)

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇作者:等不到的口琴来源:https://www.cnblogs.com/Courage129/p/14423707.html为什么要限流日常生活中,有哪些需要限流的地方?像我旁边有一个国家AAAA景区... 查看详情

八个维度讲解秒杀系统架构分析与实战(代码片段)

...s”,可领取k8s资料1秒杀业务分析2秒杀技术挑战3秒杀架构原则4秒杀架构设计4.1前端层设计4.2站点层设计4.4数据库设计5大并发带来的挑战5.1请求接口的合理设计5.2高并发的挑战:一定要“快”5.3重启与过载保护6作弊的手... 查看详情

2个大厂100亿级超大流量红包架构方案(代码片段)

2个大厂100亿级超大流量红包架构方案文章目录2个大厂100亿级超大流量红包架构方案100亿级红包应用场景概述百亿级微信红包技术架构架构**南北分布****拆红包入账异步化****发拆落地,其他操作双层cache**高并发**红包算法****... 查看详情

阿里巴巴高并发架构,到底如何对抗双十一亿级并发流量

...系统中消息的延迟?而我今天给大家带来的这份《百亿级并发系统设计》是阿里内部的一份绝密文档,从基础开始,看大佬如何一步步搭建一个高并发系统,大家可以先看看目录!资料已整理到网盘,需要... 查看详情

秒杀系统架构分析与实战(代码片段)

1秒杀业务分析2秒杀技术挑战3秒杀架构原则4秒杀架构设计5大并发带来的挑战6作弊的手段:进攻与防守7高并发下的数据安全8总结 1秒杀业务分析正常电子商务流程(1)查询商品;(2)创建订单;࿰... 查看详情

《亿级流量电商详情页系统实战:缓存架构+高可用服务架构+微服务架构》

...进一步优化,具体以最终更新为准),课程名将变更为《亿级流量电商详情页系统实战(第二版):缓存架 查看详情

亿级流量电商详情页系统实战-缓存架构+高可用服务架构+微服务架构第二版视频教程

14套java精品高级架构课,缓存架构,深入Jvm虚拟机,全文检索Elasticsearch,Dubbo分布式Restful服务,并发原理编程,SpringBoot,SpringCloud,RocketMQ中间件,Mysql分布式集群,服务架构,运维架构视频教程 14套精品课程介绍:1、14套... 查看详情

十亿级流量的搜索前端,是怎么做架构升级的?(代码片段)

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇作者|冉叶兰嘉宾|杨珺前端发展飞速,从最开始的静态页面到JavaScript,再从PC端到移动端,随着大前端的复杂度不断提升,很... 查看详情

完整秒杀架构的设计(代码片段)

...等这些访问量较为巨大的平台以及网站,针对于“高流量”、“高并发”来讲ÿ 查看详情

百亿级流量大型分布式系统平台架构设计实战

本文是学习大型分布式网站架构的技术总结。对架构一个高性能、高可用、可伸缩及可扩展的分布式网站进行了概要性描述,并给出一个架构参考。文中一部分为读书笔记,一部分是个人经验总结,对大型分布式网站... 查看详情

百亿级流量大型分布式系统平台架构设计实战

本文是学习大型分布式网站架构的技术总结。对架构一个高性能、高可用、可伸缩及可扩展的分布式网站进行了概要性描述,并给出一个架构参考。文中一部分为读书笔记,一部分是个人经验总结,对大型分布式网站... 查看详情

亿级流量电商详情页系统实战(第二版)

来源:B站 亿级流量电商详情页系统实战(第二版) 电商网站详情页架构:P3:架构1:页面静态化架构; 小电商,静态页面少Velocity/FreeMarker/Thymeleaf模板模板+数据=》最终的页面如果模板或数据有变更,则需要重新渲... 查看详情

秒杀系统架构分析与实战(代码片段)

...问题:售出数量多于库存数量11、秒杀器的应对3秒杀架构原则尽量将请求拦截在系统上游读多写少的常用多使用缓存4秒杀架构设计4.1前端层设计第一个是秒杀页面的展示第二个是倒计时浏览器层请求拦截4.2站点层设计4.3服务... 查看详情

一个秒杀系统的设计思考,超详细!(代码片段)

...能、高一致、高可用的三高系统。而打造并维护一个超大流量的秒杀系统需要进行哪些关注,就是本文讨论的话题。整体思考首先从高维度出发,整体思考问题。秒杀无外乎解决两个核心问题,一是并发读,一是并 查看详情

亿级流量架构怎么做资源隔离?写得太好了!(代码片段)

作者:等不到的口琴链接:https://www.cnblogs.com/Courage129/p/14421585.html为什么要资源隔离常见的资源,例如磁盘、网络、CPU等等,都会存在竞争的问题,在构建分布式架构时,可以将原本连接在一起的组件、模块、资源拆分开来,以... 查看详情

亿级流量系统架构之如何设计全链路99.99%高可用架构

我们采用冷热数据分离:冷数据基于HBase+Elasticsearch+纯内存自研的查询引擎,解决了海量历史数据的高性能毫秒级的查询热数据基于缓存集群+MySQL集群做到了当日数据的几十毫秒级别的查询性能。最终,整套... 查看详情

亿级流量架构服务降级,写得太好了!(代码片段)

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇作者:等不到的口琴来源:www.cnblogs.com/Courage129/p/14427020.html什么是服务降级如果看过我前面对服务限流的分析,理解服务降级就很容易了,对于一... 查看详情