热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

秒杀的架构

昨天回答的太差了,明明都是些很简单的东西,我居然回答的那么差,让我很有挫败感,一些概念性的东西这里就不说了,下面两个问题,重新梳理一下:1,一致性哈希虚拟节点与真实节点映射


昨天回答的太差了,明明都是些很简单的东西,我居然回答的那么差,让我很有挫败感, 一些概念性的东西这里就不说了,下面两个问题,重新梳理一下:


1,一致性哈希虚拟节点与真实节点映射关系的建立:现在我们使用的是{AAAA......AAA,ZZZZ....ZZZ}字符串构成的圆环, 每台真实服务器生成N个虚拟节点,虚拟节点生成的规则为, 用$i遍历从0到N-1, 对字符串"{$i}_{$realServer}"做md5, 生成一个虚拟节点。如果是{0, 2^32-1}整形圆环, 可以每台服务器生成N个虚拟节点, 同样遍历从0到N-1,每次遍历生成0到2^32-1的一个随机数, 这个随机数作为虚拟节点。




2,秒杀问题:我对秒杀业务并不熟悉, 所以这里我只能假设业务:M个用户在一个时间点抢N个商品,M有可能在0到几千万不等, N为1到数千。要做一个这样的系统, 业务会分为两个阶段,第一个阶段是秒杀开始前某个时间到秒杀开始, 这个阶段可以称之为准备阶段,用户在准备阶段等待秒杀; 第二个阶段就是秒杀开始到所有参与秒杀的用户获得秒杀结果, 这个就称为秒杀阶段吧。




首先要有一个展示秒杀商品的页面, 在这个页面上做一个秒杀活动开始的倒计时, 在准备阶段内用户会陆续打开这个秒杀的页面, 并且可能不停的刷新页面。这里需要考虑两个问题:





第一个是秒杀页面的展示, 我们知道一个html页面还是比较大的,即使做了压缩,http头和内容的大小也可能高达数十K,加上其他的css, js,图片等资源,如果同时有几千万人参与一个商品的抢购,一般机房带宽也就只有1G~10G,网络带宽就极有可能成为瓶颈,所以 这个页面上各类静态资源首先应分开存放,然后放到cdn节点上分散压力,由于CDN节点遍布全国各地,  能缓冲掉绝大部分的压力,
而且还比机房带宽便宜~





第二个是倒计时, 出于性能原因这个一般由js调用客户端本地时间,就有可能出现客户端时钟与服务器时钟不一致, 另外服务器之间也是有可能出现时钟不一致。客户端与服务器时钟不一致可以采用客户端定时和服务器同步时间, 这里考虑一下性能问题,用于同步时间的接口由于不涉及到后端逻辑, 只需要将当前web服务器的时间发送给客户端就可以了, 因此速度很快, 就我以前测试的结果来看,一台标准的web服务器2W+QPS不会有问题,如果100W人同时刷,100W QPS也只需要50台web,
一台硬件LB就可以了~,并且web服务器群是可以很容易的横向扩展的(LB+DNS轮询), 这个接口可以只返回一小段json格式的数据,而且可以优化一下减少不必要COOKIE和其他http头的信息,所以数据量不会很大, 一般来说网络不会成为瓶颈,即使成为瓶颈也可以考虑多机房专线连通,加智能DNS的解决方案 ;web
服务器之间时间不同步可以采用统一时间服务器的方式, 比如每隔1分钟所有参与秒杀活动的web服务器就与时间服务器做一次时间同步。





准备阶段的就是这些了, 下面正式开始进行秒杀,两种思路, 第一种为中心化,第二种为去中心化。这里假设一种场景, 100W人抢1个商品,如果用去中心化的思路显然没法搞(我昨天说的使用商品池就是去中心化的思路, 晚上想来是有问题的), 但这种业务很可能是大量存在的, 所以我们尝试使用中心化的思路。




先想的简单一点, 1个商品在中心化的商品服务器上, 当一个秒杀的请求到来的时候, 我们需要锁住这个商品,判断商品状态,修改这个商品的状态为已被秒杀, 然后释放锁。这个过程就算再优化, 再快,我就算给你单台100W qps,那如果有1000W人来秒杀,1000W请求同时从web服务器涌来, 它也顶不住, 因为它无法扩展, 所以我们需要想一点办法。




我想到的办法是加一个候选人中间件在web服务器和中心商品服务器之间(见附件的架构图),在候选人中间件中维护一个候选人队列(所有候选人队列中的队列单元数量之和需要大于秒杀商品数量), 当请求从web服务器转发过来的时候, 首先判断这个队列是否已满, 如果没满就将请求放入队列中排队,队列满以后的所有请求直接返回秒杀失败。中间件在处理web服务器请求的同时,转发队列中的请求给中心商品服务器(这里可以使用生产者-消费者模型),中心商品服务器将前面N个成功秒杀的结果返回后, 返回秒杀结束。中间件收到商品服务器返回的秒杀结束,给队列中的所有请求返回失败,
以后进来的请求也全部返回失败, 这样就大大降低了中心商品服务器的请求数, 甚至可以在候选人中间件和中心商品服务器之间再加一层候选人中间件,这样形成一个多层次的缓存架构,流量每经过一层就会减少, 最后将到达中心商品服务器的流量控制在一定的范围内。




最后还要考虑一些单点的问题, 这里时间服务器和后面的中心商品服务器都是单点。




 时间服务器好办, 可以采用树状结构的时间服务器模型, 所有时间服务器都去同步root节点的时间服务器, 然后web服务器设置同步多台时间服务器,当一台down掉的话web服务器还可以和另外的时间服务器继续同步,如果root节点的时间服务器down掉, 就从下层的服务器里面拿一台出来做root就可以了。




中心商品服务器的话可以使用一些同步复制的技术,比如底层的drbd或者类似mysql的 semi synchronous。当运气实在太背~,一台商品服务器在秒杀的过程中down掉,另外一台可以迅速接管。另外还可以使用共享存储的方式,不过据说这个比较昂贵哈~。




写这么多,还花了个图, 累死我了, 看来还是夜深人静的时候思路清晰一些,如果以后还有面试机会, 请半夜打电话来~


bubuko.com,布布扣,呵呵。

秒杀的架构,布布扣,bubuko.com


推荐阅读
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  •   1、确认自己的线路是否连接正确腾达a9设置。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
author-avatar
敦恒
招聘!招聘!招聘! 联系方式:56226135/shiziqian@hy9z.com 请优先邮件联系~谢谢!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有