秒杀系统

题目

一、题目
1, 这是一个秒杀系统,即大量用户抢有限的商品,先到先得
2, 用户并发访问流量非常大, 需要分布式的机器集群处理请求
3, 系统实现使用Java

业务特点
秒杀系统_第1张图片

特点瞬时流量剧增 库存量较少 下订单,扣库存,支付订单
营销活动单独部署
流量的控制
把数据和业务逻辑转到缓存 缓存和mq中间件

秒杀前不能下订单

请求顺序 客户端 后端内存 redis 数据库
页面级别的缓存

超过系统能力直接丢掉

防止提前下单有一个小的js

限制用户访问频率
nginx做负载均衡,分布式session

下订单扣库存使用redis

前端拦截
1.页面静态化 分发到cdn
验证码
后端拦截
2.限制访问次数

问题多用户发现剩余都是1
数据库唯一索引
利用rabbitMq延迟异步订单处理

3.分流
页面静态化,页面缓存
nginx负载均衡
接口压流
Jemter压测

1.用户请求分发模块 nginx dns
2.请求预处理模块,判断商品有没有剩余
3.请求处理
4.数据库接口模块 rpc接口查询剩余信息

每一个http请求预处理

并发队列的选择
1.ConcurrentLinkedQueue 异步队列出队加锁
2.ArrayBlockingQueue 数据库模块成功竞拍
3.LinkedBlockingQueue 阻塞队列 队列为空阻塞

请求模块 发送预请求秒杀事务到数据库队列

请求首先到请求分发集群OSC
分发集群检测库存 先是分布式缓存扣减 数据库扣减失败返回失败

问题:如何保证秒杀成功的
Redis的作用 缓存
怎么测试系统并发量
系统瓶颈 再优化

性能快的方面 拦截无效流程

限流
消峰 异步处理 缓存和消息
中间件

内存缓存

消息队列

可扩展
动静分离

特点:大量的并发读和并发写

4要1不要
数据量尽量少
请求数据尽量少
路径尽量短
依赖尽量少
不要单点

搭建秒杀
1.定时上架功能
2.秒杀是一个单独的系统
3.独立部署集群
4.热点数据放到缓存中
5.秒杀答题
6.核心数据放入缓存

缓存用什么页面静态化用什么

架构秒杀系统_第2张图片

于层层过滤,逐渐递减瞬时访问压力,减少最终对数据库的冲击

MQ 排队服务,只要 MQ 排队服务顶住,后面下订单与扣减库存的压力都是自己能控制的,根据数据库的压力,可以定制化创建订单消费者的数量,避免出现消费者数据量过多,导致数据库压力过大或者直接宕机。

库存服务专门为秒杀的商品提供库存管理,实现提前锁定库存,避免超卖的现象。同时,通过超时处理任务发现已抢到商品,但未付款的订单,并在规定付款时间后,处理这些订单,将恢复订单商品对应的库存量

总结
核心思想:层层过滤

尽量将请求拦截在上游,降低下游的压力
充分利用缓存与消息队列,提高请求处理速度以及削峰填谷的作用

不拦截 读写锁 严重冲突 响应慢

网站架构
在这里插入图片描述

浏览器端,最上层,会执行到一些 JS 代码
站点层,这一层会访问后端数据,拼 HTML 页面返回给浏览器
服务层,向上游屏蔽底层数据细节,提供数据访问
数据层,最终的库存是存在这里的,MySQL 是一个典型(当然还有会缓存)

常用的
按钮置灰 禁止短时间提交
js限制用户在x秒提交一次

for循环的http接口
ip cookieid 有登录使用uid uid计数和去重

服务器拦截 队列

业务规则 流量均摊

神粒度的有票无票缓存 将业务做写队列

站点的有效请求 可以通过扩展机器 部分抛弃

用户层面同步 服务层面异步

数据库层面的写库存 很低 不支付回库

nginx七层负载均衡

只有极少数用户进入数据库

你可能感兴趣的:(面试题,场景设计题)