订单秒杀解决方案
2021-11-27 15:03:59 3 举报
AI智能生成
登录查看完整内容
订单秒杀解决方案是一种针对电商平台在特定时间内高并发访问和大量订单生成问题的解决方案。通过采用分布式缓存、消息队列、负载均衡等技术手段,实现对用户请求的快速响应和订单处理能力的提升。同时,通过对数据库进行优化和读写分离,降低数据库压力,确保系统稳定运行。此外,还可以采用限流、熔断等策略,防止恶意攻击和系统崩溃。总之,订单秒杀解决方案旨在为电商平台提供一种高效、稳定、可靠的秒杀服务,满足用户对热门商品的需求,提升用户体验和商家销售额。
作者其他创作
大纲/内容
实现方式:通过FreeMarker创建每个商品的静态页面,避免每次请求都直接访问服务端。
优势:实现方式很简单。适用于产品相对比较少的商城,如小米商城。
劣势:更新HTML页面时需要进行全量复制,在商品比较多的商城,如京东,做全量复制是不现实的。
页面静态化
请求秒杀商品详情页数据时,从就近的CDN加载,不需要每次都请求远端机房。
Nginx+lua实现本地缓存,提前把秒杀商品详情页放在Nginx,可以从Nginx中直接加载详情页。
一级缓存
有可能存在Nginx的缓存过期的情况,此时请求服务器的本地缓存。
二级缓存
如果还是没有找到,转发请求到Redis集群,加载详情页。
三级缓存
实现方式
CDN+Nginx+Redis多级缓存
秒杀商品详情页解决方案
分库分表,主从分离
成本飙升,并且在秒杀场景中大部分都是无效请求,打入数据库是一种资源浪费。
库存超卖,虽然MySQL可以通过悲观锁或乐观锁去处理库存超卖的问题,但是性能不佳,并且容易存在数据库级别的问题(如悲观锁容易锁表,乐观锁容易发生多次访问数据的问题)
存在问题
加数据库服务器
服务器分离
通过Redis记录库存数量,并且在进行库存扣减时先扣减Redis的库存。
Redis缓存拦截请求
一旦商品抢购完毕,可以在Redis或者ZK添加一个标记位,然后ZK反向通知Nginx中我们写好的lua脚本,通过lua脚本实现在Nginx过滤请求。
抢购完毕后过滤请求
当Redis成功进行库存扣减,及发送MQ消息,给Consumer进行订单创建等逻辑,创建完成之后,返回订单号保存到Redis中,当进行回调查询的时候,可以通过Redis获得订单创建结果。
执行正常的下单操作。
异步下单
有可能出现的情况,Redis库存剩余2件商品,但是顾客需要买3件,此时就会出现库存为负数的情况,所以需要发送一条延时MQ消息,同步MySQL的库存情况。
库存同步
在执行下单操作之后,发送一个延迟的MQ消息,在一段时间后,检查顾客是否已经支付订单,若未支付则回滚库存,标记位,并对过期订单进行关闭。
延迟回滚
实现消费者种类
瞬时高并发场景秒杀下单进行削峰填谷
在前端设置答题或验证码
秒杀前预约
通过前端限流
下单TPS压力过大解决方案
配置超时(访问时间维度)
统计失败次数(访问成功率维度)
限流(QPS维度)
故障(服务是否存活维度)
自动开关降级
手动开关降级
自动化运维
读降级
写降级的思路基本就是同步写转异步写,如redis扣减缓存操作,若数据库性能跟不上,可以先发送到队列,再慢慢写入数据库,实现最终一致性
写降级
功能降级
主要控制页面功能的降级,在页面中通过JS脚本部署来控制在适当时机开启/关闭开关
前端限流
limit_conn_zone&limit_conn
limit_req_zone&limit_req
通过限制连接数或请求数控制
Nginx限流
网关限流
接入层限流
在应用中配置响应的功能开关,根据实际情况进行自动/人工降级。如给进入持久层的实现方法添加限流规则,若流量过大,对上游接口进行限流
应用层限流
多层限流
保证运行阶段稳定性解决方案
订单秒杀解决方案
0 条评论
回复 删除
下一页