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

秒杀的情景

生活中有很多秒杀的情景, 例如商家促销, 像一元抢茅台, 五毛钱抢宝马(这儿只是一个例子), 假如一百万人来抢十瓶茅台, 这时候肯定不能多卖出, 也就是不能被大于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 这样的大规模并发访问,那么,应该怎么做呢?

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

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

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

亿级流量架构实战之秒杀设计相关推荐

  1. 亿级流量架构怎么做资源隔离?口琴这篇写得太好了!

    作者:等不到的口琴 链接:www.cnblogs.com/Courage129/p/14421585.html 为什么要资源隔离 常见的资源,例如磁盘.网络.CPU等等,都会存在竞争的问题,在构建分布 ...

  2. 亿级流量架构之服务器扩容思路及问题分析

    为什么要扩容 说人话就是, 无论如何优化性能,能达到的最大值是一定的,对于一个用户量大的应用,可以对服务器进行各种优化,诸如‍限流‍.资源隔离,但是上限还是在那里,这时候就应该改变我们的硬件,例如使用 ...

  3. 亿级流量架构:为什么要扩容?服务器扩容思路及问题分析

    为什么要扩容 说人话就是, 无论如何优化性能,能达到的最大值是一定的,对于一个用户量大的应用,可以对服务器进行各种优化,诸如限流.资源隔离,但是上限还是在那里,这时候就应该改变我们的硬件,例如使用更强 ...

  4. 亿级流量架构:服务器扩容思路及问题分析

    为什么要扩容 说人话就是, 无论如何优化性能,能达到的最大值是一定的,对于一个用户量大的应用,可以对服务器进行各种优化,诸如限流.资源隔离,但是上限还是在那里,这时候就应该改变我们的硬件,例如使用更强 ...

  5. 亿级流量架构演进实战 | 架构演进重构消息PUSH系统 05

    这不是一个讲概念的专栏,而且我也不擅长讲概念,每一篇文章都是一个故事,我希望你可以通过这些故事了解我当时在实际工作中遇到问题和背后的思考,架构设计是种经验,我有幸参与到多个亿级系统的架构设计中,有所收 ...

  6. 亿级流量架构演进实战 | 从零构建亿级流量API网关 01

    这不是一个讲概念的专栏,而且我也不擅长讲概念,每一篇文章都是一个故事,我希望你可以通过这些故事了解我当时在实际工作中遇到问题和背后的思考,架构设计是种经验,我有幸参与到多个亿级系统的架构设计中,有所收 ...

  7. 亿级流量架构演进实战 | 架构演进构建TCP长连接网关 04

    这不是一个讲概念的专栏,而且我也不擅长讲概念,每一篇文章都是一个故事,我希望你可以通过这些故事了解我当时在实际工作中遇到问题和背后的思考,架构设计是种经验,我有幸参与到多个亿级系统的架构设计中,有所收 ...

  8. 亿级流量架构演进实战 | 从零构建亿级流量API网关 02

    这不是一个讲概念的专栏,而且我也不擅长讲概念,每一篇文章都是一个故事,我希望你可以通过这些故事了解我当时在实际工作中遇到问题和背后的思考,架构设计是种经验,我有幸参与到多个亿级系统的架构设计中,有所收 ...

  9. java hbase流量日志,Spark+Hbase 亿级流量分析实战(日志存储设计)

    接着上篇文章 百亿级流量实时分析统计 - 数据结构设计 我们已经设计好了日志的结构,接下来我们就准备要开始撸代码了,我最喜欢这部分的环节了,可是一个上来连就撸代码的程序肯定不是好程序员,要不先设计设计 ...

最新文章

  1. 使用 Pandas、Jinja 和 WeasyPrint,轻松创建一个 PDF 报表
  2. 最近工程师怎么都在写公众号?这玩意到底能赚多少钱?
  3. 操作系统例题:某文件系统中,针对每个文件,用户类别分为4类:安全管理员、文件主、文件主的伙伴、其他用户;访问权限分为5种:完全控制、执行、修改、读取、写入。若文件控制块中用二进制位串表示文件权限,为表
  4. MySQL 无符号和有符号的区别
  5. 任意电脑登录MySQL_使用批处理命令注册运行mysql数据库,无需注册mysql服务,可以在任意电脑登录使用...
  6. 要不要做独立站系统?做了有什么用?
  7. J2EE Architecture(6)
  8. RFC 6528 翻译
  9. java怎么模拟查询账户余额_spring boot + mybatis 模拟银行系统余额查询、转账、存取钱功能实现...
  10. 数字延时网络混响算法研究(FDN)
  11. 编译Android内核 For nexus 5 以及绕过Android的反调试
  12. 【C++设计模式】抽象工厂模式
  13. 【企业微信】h5调试面板
  14. redis数据类型之HashSet
  15. 【云原生】Docker高级篇之网络、compose、可视化、监控
  16. Total Control的深入用法,如何使用脚本实现启动或重启指定App
  17. 使用树莓派实现微信远程监控
  18. nmap的下载与安装
  19. python中str函数用法_python中str内置函数用法总结
  20. ZZULIOJ 1149: 组合三位数之二

热门文章

  1. Android Studio 选项菜单和动画结合_谷歌准备为Android增加像iOS一样的功能
  2. rabbitmq python 消费者_菜鸟世界 -RabbitMQ---消费者示例
  3. 使用 Gitlab 进行嵌入式软件开发技巧
  4. 数位dp ---- 暴力 + 二进制的数位dp 2020济南 L Bit Sequence
  5. 解题报告:AcWing 1165. 单词环(01分数规划、hash、经验优化)
  6. A-棋盘问题(dfs)
  7. java正则表达式练习题目
  8. 不若鸿蒙的意思,任正非说鸿蒙媲美iOS不用三年,华为若出鸿蒙手机你会买吗?...
  9. JAVA一个项目的路径为_java 得到项目路径
  10. HTML用乘法函数,Excel乘法函数的使用方法和详细步骤