您现在的位置是:亿华云 > IT科技类资讯
100W并发秒杀系统架构
亿华云2025-10-09 11:07:36【IT科技类资讯】3人已围观
简介一 百万并发秒杀概述1.1 可能遇到问题在一瞬间服务出现大量请求,服务可能会崩溃。在秒杀商品时候,可能出现超卖。1.2 秒杀的业务流程秒杀的商品有热点商品和非热点商品,热点商品可能流量占整个的90%.
一 百万并发秒杀概述
1.1 可能遇到问题
在一瞬间服务出现大量请求,发秒服务可能会崩溃。杀系
在秒杀商品时候,统架可能出现超卖。发秒
1.2 秒杀的杀系业务流程
秒杀的商品有热点商品和非热点商品,热点商品可能流量占整个的统架90%.
后台商品管理可以将商品加入到秒杀商品,根据商品访问量分位热点商品和非热点商品。发秒
用户抢到商品支付,杀系发货商品。统架超时不付款,发秒订单取消。杀系
二 秒杀架构
秒杀系统架构图
我们Java项目时用tomcat部署的统架。nginx的发秒并发量能达到五万,tomcat最优能支持1千。杀系所以首要问题就是统架让tomcat直接处理请求,减少tomcat处理请求。由于商品的详情页除了数量其他基本不改变。因此可以采用详情页放到nginx缓存中。还有就是考虑热点商品的抢购能直接经过nginx处理不到服务端,这样就完美解决了问题了。Lua脚本对JWT校验:
用户请求到达nginx,用lua脚本进行jwt校验,减少非法请求对服务器的访问。从而减少服务器压力。服务器托管
2.1 静态页面处理
因为秒杀商品的浏览量很高,而且商品的描述,价格,图片,标题基本上是不变的。因此考虑用freemarker做商品静态化。所以先考虑静态页面的生成,商品数量发生改变静态页面从新生成。1. 后台将设置商品成为秒杀商品流程:
比如京东的秒杀都是一个时间点到另外一个时间点。当秒杀的时间点到了,需要从索引库中删除对应索引和删除对应的静态页面。我们可以在商品添加秒杀时候,设置定时任务。然后定时任务到达后执行对应操作。在添加秒杀时候,更改数据库中商品是处于秒杀,然后生成静态页面。2. 商品数量修改,静态页面的同步(canal数据同步):
使用canal对数据库的表进行监控时候,当新增,删除,免费信息发布网编辑表中是数据时候,canal都能监控到。从而触发canal书写的Java服务,然后根据业务进行静态页面的修改。3. 静态页面的生成和删除:
当商品变成秒杀商品,生成静态页面。当商品卖完或者变为普通商品,删除静态页面。2.3 将秒杀热点数据隔离
我们可以根据商品的浏览量判定当前商品是否位热点数据。所以需要商品浏览记录收集,和收集浏览记录的分析。2.3.1 日志收集
用户访问商品详情,首先请求经过nginx,然后使用nginx和lua脚本对请求商品详情路径进行拦截,然后将请求商品数据发送到kafka。数据库接受到kafka数据,完成商品浏览数据收集。
2.3.2 数据分析
Apache Druid订阅Kafka从而获取商品的访问日志,druid能实时获取商品访问记录。druid支持sql,对数据进行分析。找出热点数据。
# lua脚本发送给kafka日志格式 { "actime": "2020‐4‐10 9:50:30", "uri": "http://192.168.211.137/items/S1235433012716498944.html", "ip": "119.123.33.231", "token": "Bearer ITHEIMAOOPJAVAITCAST" }2.3.3 热点数据隔离
可以采用定时任务(elastic-job)实时查询Druid,把近期访问量最多的商品放入redis缓存中。缓存中数据如下:商品库存,亿华云计算价格,名称等。
备注:
用户进行下单时候,在redis中就是热点商品,走热点下单。不在redis中不是热点商品,走服务直接下单。
在将热点商品放到redis中,需要根据商品的锁定字段,将商品锁定。然后再将商品信息放到redis中。用户抢购商品和热点商品放到redis中同时进行,导致库存混乱。
2.4 热点商品和非热点商品抢购流程
需要判断当前用户对当前商品24小时内是否抢过。判断抢购商品是冷商品还是热门商品。判断库存是否充足。
1. 非热点商品秒杀:
a 判定为非热点数据,进入服务中进行下单系统。 b 对库存进行判断,如果库存充足,进行下单。如果库存不充足,事务回滚。 c 如果库存充足,但是商品变为热点商品。应将下单操作发送到kafka,然后变成热点商品下单操作(防止商品库存混乱)。 d 记录该用户抢的该商品,用于提示该用户24小时不能抢该商品。2. 热点商品秒杀:
a lua脚本进行JWT校验,判断用户是否登录。 b 从redis查询看该用户是否抢了该商品(在抢购商品成功后,会将商品和用户信息存储到redis中)。 c 从redis热点商品中查询,商品是否为热点商品。如果是热点商品且库存>0,热点商品抢购流程。 d 判断该用户该商品是否处于排队(用redis的incr自增来判断当前用户该商品是否重复排队)。是,提示用户正在排队。否,直接排队。e 订单系统通过队列订阅读取用户下单信息,并进行下单。三 流量监控
在秒杀项目中需要集成Sentinel进行限流操作。在秒杀过程中冷门商品变为热门商品时候,访问服务流量瞬间激增,需要采用Sentinel进行限流,保护服务的稳定性。
很赞哦!(1)
相关文章
- 当投资者经过第二阶段的认真学习之后又充满了信心,认为自己可以在市场上叱咤风云地大干一场了。但没想到“看花容易绣花难”,由于对理论知识不会灵活运用.从而失去灵活应变的本能,就经常会出现小赢大亏的局面,结果往往仍以失败告终。这使投资者很是困惑和痛苦,不知该如何办,甚至开始怀疑这个市场是不是不适合自己。在这种情况下,有的人选择了放弃,但有的意志坚定者则决定做最后的尝试。
- 分布式之数据库和缓存双写一致性方案解析
- MySQL数据库开发常见问题及优化
- 十款我很喜欢的命令行工具
- 便宜域名使用如何?小白可以买到便宜域名吗?
- Python中最强大的错误重试库
- 盘二叉树,建议从这些基础搞起……
- 学会这招真实用!复制粘贴,快速将Python程序打包成exe!
- tk域名是什么域名?新手对tk域名有什么看法?
- 2018年1月数据库排名TOP10(1-5)及简介
站长推荐
只要我们做的是从目前的市场情况选择域名,从简单易记,从个性特征上,我们就可以找到一个好域名进行注册。域名注册进行域名记录和解析以及绑定网站后,客户可以通过URL登录您的网站。
20多个好用的 Vue 组件库,请查收!
扔掉工具类,Mybatis一个简单配置搞定数据加密解密!
一个真实案例,教会你数据库性能调优
域名资源有限,好域名更是有限,但机会随时都有,这取决于我们能否抓住机会。一般观点认为,国内域名注册太深,建议优先考虑外国注册人。外国注册人相对诚实,但价格差别很大,从几美元到几十美元不等。域名投资者应抓住机遇,尽早注册国外域名。
5分钟快速入门,用Python做SQLite数据库开发,附代码适合初学
一步一步教你如何用Python操作MySQL
干货:不用插件就能管理好你的My SQL数据库