写点什么

架构师训练营 - 命题作业 第 9 周

用户头像
水边
关注
发布于: 2020 年 08 月 04 日



  • 请简述 JVM 垃圾回收原理。

1、JVM利用可达性算法,进行垃圾回收,

从根对象出发,根对象包括:栈中引用的对象、静态成员引用的对象、方法区引用的对象等,

开始向下搜索,找到的所有对象都被标记,未被标记的对象,即为需要回收的对象。

2、JVM把内存分为堆和栈,垃圾回收主要是针对堆区进行的回收操作。

堆区又区分为新生代和老年代进行回收,

对于新生代,新创建的对象都在这里,因为大部分对象的生命周期都比较短,回收概率很高。

对于多次新生代回收失败的对象,会挪到老年代去。

对老年代的回收,则会触发JVM的停顿,也叫STW:Stop the world。

为了优化STW,JVM也提供了G1算法,分成多个不同的小区块进行回收。



  • 设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?

秒杀的主要挑战,是瞬间大量的用户并发访问,高请求、高流量,从而导致系统崩溃。

实际秒杀场景的解决方案,大致如下:

1、html、js、css、图片等静态文件,使用cdn,并且cdn要能支持gzip;

2、秒杀前,基本都是读缓存,专门用一个不缓存的js或api,做计时判断,是否开始秒杀了,服务端还是可以缓存的,用304缓存;

3、相同用户在n秒内,只允许一次请求到服务端,其它请求都直接前端拦截掉,可以通过Cookie或LocalStorage进行缓存和判断;

4、库存预先加载到内存缓存,在内存中进行秒杀,只有秒杀成功的,才进行落盘,并进入后续的支付流程;

5、内存库存为0,就直接更新某个js或api,直接前端阻断所有请求;

6、秒杀成功的,串行进入消息队列,通过队列的Qos来进行削峰,避免支付流程压力太大;

7、使用延时队列或Quartz之类的定时任务,进行订单超时退库处理,避免秒杀后不支付。

8、可以每台机器平均分布,这样就可以直接使用内存缓存,不用分布式缓存了。

比如有1000个商品,10台机器,那么每台机器只处理100个商品的秒杀。

需要考虑的是单台机器挂了,未完成秒杀的商品要回库



发布于: 2020 年 08 月 04 日阅读数: 51
用户头像

水边

关注

还未添加个人签名 2019.04.14 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 - 命题作业 第 9 周