1 Star 0 Fork 0

Paul_Zhen / java-review

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
场景题.md 4.40 KB
一键复制 编辑 原始数据 按行查看 历史
zhenpeng 提交于 2023-12-11 13:34 . 分布式等篇章总结

https://www.bilibili.com/video/BV1pX4y1R7ji/?spm_id_from=333.999.0.0 https://www.nowcoder.com/creation/manager/columnDetail/j3Kwpj

原则:

1.判断toB 还是toC,如果是C端,那么高并发就一定是要考虑的重点。如果是B端,那么系统的领域模型是更加重要的。

2.清楚面试官的场景,并且不断对细节提问。

3.积累套路

1. 商城秒杀:

a. 依赖的中间件:网关、分布式缓存、消息队列、限流、数据库、TCC等

b. 需要考虑的点:缓存预热、缓存与数据库的一致性方案、降级、熔断、削峰

c. 加分点:蓄洪与事后泄洪

2. 排行榜(微信步数等)

a. 依赖的中间件:网关、redis sorted set、数据库等

b. 需要考虑的点:并发、数据库排序

c. 加分点:有些排行榜可以考虑在前端/客户端做,比如:排序数据量不大/排序场景很固定,面试时提到这点很加分。

3. 红包系统

a. 依赖的中间件:网关、分布式缓存、消息队列、数据库、TCC等

b. 需要考虑的点:并发、红包如何拆分、读写分离、异步化

c. 加分点:红包核对等

4. 类微博的feed流系统

a. 依赖的中间件:网关、数据库、缓存、消息队列等

b. 需要考虑的点:并发、实时推送、消息推拉模式、数据库设计

c. 加分点:根据用户活跃场景采用推+拉模式

5. 消息系统

a. 依赖的中间件:网关、数据库、缓存、消息队列、冷热库存储

b. 需要考虑的点:如何收发消息(推/拉),消息如何聚合(多条消息聚合成一个通知提醒)

c. 加分点:按照场景存储消息(点赞/私信/广告),冷热库

高并发下如何设计秒杀系统

考虑的问题:

img

解决方法:

页面静态化

秒杀活动的页面,大多数内容都是固定不变的,如商品名称,商品图片等等,可以对活动页面做静态化处理,减少访问服务端的请求。秒杀用户会分布在全国各地,有的在上海,有的在深圳,地域相差很远,网速也各不相同。为了让用户最快访问到活动页面,可以使用CDN(Content Delivery Network,内容分发网络)。CDN可以让用户就近获取所需内容。

按钮至灰控制

秒杀活动开始前,按钮一般需要置灰的。只有时间到了,才能变得可以点击。这是防止,秒杀用户在时间快到的前几秒,疯狂请求服务器,然后秒杀时间点还没到,服务器就自己挂了。

服务单一职责

我们都知道微服务设计思想,也就是把各个功能模块拆分,功能那个类似的放一起,再用分布式的部署方式。

如用户登录相关的,就设计个用户服务,订单相关的就搞个订单服务,再到礼物相关的就搞个礼物服务等等。那么,秒杀相关的业务逻辑也可以放到一起,搞个秒杀服务,单独给它搞个秒杀数据库。

服务单一职责有个好处:如果秒杀没抗住高并发的压力,秒杀库崩了,服务挂了,也不会影响到系统的其他服务。

秒杀链接加盐

链接如果明文暴露的话,会有人获取到请求Url,提前秒杀了。因此,需要给秒杀链接加盐。可以把URL动态化,如通过MD5加密算法加密随机的字符串去做url。

限流

一般有两种方式限流:nginx限流和redis限流。

  • 为了防止某个用户请求过于频繁,我们可以对同一用户限流
  • 为了防止黄牛模拟几个用户请求,我们可以对某个IP进行限流
  • 为了防止有人使用代理,每次请求都更换IP请求,我们可以对接口进行限流
  • 为了防止瞬时过大的流量压垮系统,还可以使用阿里的Sentinel、Hystrix组件进行限流。

分布式锁

可以使用redis分布式锁解决超卖问题。

MQ异步处理

如果瞬间流量特别大,可以使用消息队列削峰,异步处理。用户请求过来的时候,先放到消息队列,再拿出来消费。

限流&降级&熔断

  • 限流,就是限制请求,防止过大的请求压垮服务器;
  • 降级,就是秒杀服务有问题了,就降级处理,不要影响别的服务;
  • 熔断,服务有问题就熔断,一般熔断降级是一起出现。
1
https://gitee.com/Paul_Zhen/java-review.git
git@gitee.com:Paul_Zhen/java-review.git
Paul_Zhen
java-review
java-review
master

搜索帮助