作者|悟空哥来源|悟空聊天架构(ID:PassJava666)星球简介位置:β-410星系,A-731电商星球。时间:新纪元2036星球简介:中文名称:A-731电商星球外文名称:A-731商城类别:星球革命周期:一年常驻用户:中间件工作者,各种请求。行星总历史:200,000年。星球危机我是一个秒杀请求,我每天的工作就是把秒杀请求的数据投递给后端工作者。这一天,在Nginx转发服务器上遇到了一个请求“小孔”。我告诉小孔,有重要消息,现在不方便告诉他。我和空在晚上十点下班后来到一家酒吧,点了两杯莫吉托,然后在一个角落坐下。小孔:你最近好像心事重重。我:你有没有发现,最近我们这个星球的订单量激增,每天产生1000万条订单数据,已经不是一两天的事情了。小空:难怪我每天都加班到晚上十点才交付要求的数据。我:我有一个在航天局工作的叔叔告诉我,我们这个星球承载不了那么多的请求和订单数据,很快就会发生“行星爆炸”。您不想向其他人透露。小孔:那我该怎么办?我:我们可以去100光年外的T-714星球,但是我们只能通过秒杀通道乘坐时空穿梭机才能去那个星球。而且名额有限,不知道有没有机会坐上班车。我:明天频道开两次,上午十点,下午两点。明天你可以和我一起去!索拉:好的。大爆炸》涉及的知识点:这里的大爆炸指的是什么?由于订单数据量大,数据库装不下。数据库可能已关闭。因为每天都有大量的请求发送到服务器,服务器已经处理不了了。服务器可能已关闭。秒杀通道每天开启两次是什么意思?“流量错开”是指将流量分成两个秒杀会话。当然,“流量错峰”的手段包括输入验证、加入购物车等,以分享流量。秒杀通道位置:A-731星球机场时间:09:45通道“请到T-714星球要求乘客在Y1站台排队等候进入专用通道,15分钟后进入穿梭大厅。”大厅里的广播,连续播放了三遍。往特殊通道走去,看到通道旁边有个牌子:秒杀通道,只接受秒杀请求。》涉及的知识点:》秒杀场景为什么要有单独的频道?秒杀业务为了不影响系统其他业务,单独部署了秒杀系统。概括为“单一职责服务+独立部署”。实时大屏抬头一看,频道上方出现了一块大屏幕,不断显示着T-714星球的照片和机票订购信息。T-714星球有两名穿制服的工人在屏幕上巡逻。一种涂装上印有Nginx,另一种涂装上印有CDN。Nginx+CDN《涉及的知识点:》Nginx制服:穿着Nginx制服的工人,维护着Nginx的静态和动态资源。产品详情页面是静态页面。这些静态页面存储在Nginx服务器上。访问静态资源时,请求先到Nginx,然后Nginx服务器根据请求的URL链接来匹配是否是被访问的静态资源。大屏商品详情页不是通过发送请求从后台服务器获取的。实际上已经实现了“动静分离”。一张图解释Nginx动静分离Nginx流程图HTML文件等静态资源很少变化,可以放在服务器上直接访问,不需要和后台服务器(如Tomcat)交互。动态资源,比如需要从后台获取有多少人购买了商品,发送订单请求来存储数据。这些被称为动态资源,不能狭义地理解为可见资源。从广义上讲,它们可以包括逻辑处理的结果,执行存储数据等操作。CDN统一什么是CDN:CDN用大白话解释就是用户可以就近获取资源,减少网络传输时间,提高访问速度。HTML文件放在Nginx上,而HTML导入的图片文件和脚本文件放在CDN上。穿着CDN制服的工作人员维护CDN资源。CDN工作原理流程图CDN流程图验证通道时间:10:00“验证通道已开通,请输入密码!”广播播放了三遍。输入密码《涉及知识点:》为什么需要密码?为了防止大量的模拟秒杀请求进入业务流程,首先增加了一个验证,将这些虚假请求丢弃。怎么做?前端网页先发送请求获取密码。点击购买时,请求体中携带加密后的密码,后台检查密码是否匹配。可以通过MD5加密。总结为“秒杀请求加密”。穿梭大厅经过验证通道的筛选,一半的虚假请求被屏蔽,像我一样拿到正确密码的人顺利进入穿梭大厅。来到大厅,发现大厅中央有一台显示器,上面显示的红色数字100映入眼帘。在显示屏的左手边站着一个穿着Redis制服的漂亮女孩。在一旁,我无意中听到她正在控制显示器显示剩余的航天飞机数量。如果数字变为0,则表示航天飞机已满,后面的人只能无功而返。》涉及知识点:秒杀场景下,查询剩余库存不直接查数据库,而是查Redis缓存。为什么要检查缓存?因为查缓存的速度比查数据库快很多,减少了响应时间,也减轻了很多数据库的压力。如果很多库存检查请求到达数据库,数据库就会崩溃,数据库将无法执行其他任务。抢票画面的右手边站着一位西装笔挺的帅气青年,看到袖口上戴着红色的袖标,上面印着Redisson的字样。他一脸严肃,对大厅里一片漆黑的要求视若无睹。可能是见惯了这种场景吧。当我看着这个帅哥的时候,发现他的左手拿着一叠机票。没错,有了车票,就可以上班车了。我以100米的速度来到了他的面前。当我走到他面前的时候,已经有十几个请求来到他的面前。他按照先到先得的顺序发票。当我到达时,只剩下几张票了。幸运的是,我的百米冲刺帮我抢到了一张票。我问帅哥能不能再给我寄一张票,他说不行。每出一张票,身着Redis制服的美少女都会操作显示器将数字减一。十秒后,车票发出,显示屏显示数字0。》涉及的知识点:《什么是Redisson?Redis客户端解决了一些常见的分布式问题。其实这里就用到了Redisson的信号量功能。一共有100张票,也就是100个信号量,不会因为多线程并发或者分布式系统导致票数超卖。例如,售出101张票。每个人只能得到一张票,这是秒杀系统中涉及的幂等性校验,不能重复抢票。售票窗口发登机牌登机牌的帅哥告诉我,拿到机票后,要到A窗口排队交钱,才能拿到登机牌。所以我和其他99个请求一起在窗口A排队。看到一个请求想放弃付款,说机票太贵了,刚要出大厅就被发机票的帅哥拦住了。他询问是否应考虑该请求。有15分钟的考虑时间。如果request还是觉得No,你可以把ticket退给他,他可以发给其他人。QueuePeakShaving《涉及知识点》:秒杀系统中常用的《QueuePeakShaving》。闪杀成功的请求进入队列,慢慢创建订单,扣除库存。秒杀成功后,赶紧告诉用户秒杀成功了,而不是等订单完成了再告诉用户,那用户还要等一会,影响体验。为什么需要削峰排队?成功的请求不用马上去数据库创建订单,这样对数据库的压力会小一些。在秒杀场景下,极有可能出现部分用户抢了但不付费的情况。这时候必须把库存加回来提供给其他用户。出发订单创建成功后,顺利拿到登机牌,通过登机牌验证,顺利登上班车。让我们去T-714星球吧。听说那个星球上的数据库已经分为数据库和表,服务也拆分成了微服务。综上所述,秒杀系统中的关注点,上面已经通过科幻的方式进行了解释。以下总结了秒杀系统的八大关注点:秒杀场景的重点是服务单一职责、库存预热独立部署、秒杀链路加密快扣动静分离恶意请求拦截关于流量错峰&限流&断路器&降级队列调峰本文转载请联系悟空聊天架构公众号。
