写点什么

架构师训练营第九周 - 作业

发布于: 2020 年 08 月 05 日
架构师训练营第九周-作业

作业一 请简述 JVM 垃圾回收原理。

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

作业一 请简述 JVM 垃圾回收原理。

答:垃圾回收需要确定的四件事

  1. 确定什么是垃圾

JVM 中的垃圾是指不再使用的分配好内存空间的对象

JVM 通过可达性分析来确定可用对象,所有对象去除可用对象,剩下的就是不再使用的对象

可达性分析怎么做?

通过所有所有线程栈帧中的引用,确定为可达对象。引用指向为普通对象的,其属性为引用的,也为可达对象,递归,直到对象为基本类型对象或不再具有属性。引用指向的对象为数组,集合等的,称其为容器对象,其存储的元素为对象的,也与普通对象做相同处理过程。类的静态成员为对象的,普通对象和容器对象也做递归处理,分析可达性。

所有可达对象均为可用对象。JVM 中有一个总的对象列表,对所有不可达的对象,做垃圾标志。

  1. 确定垃圾怎么处理

垃圾处理方式有清除、压缩、复制。

清除就是把不可达对象放入清除队列。

压缩会把所有可达对象从堆头依次放置。

复制是把堆空间分块,如 A、B,首先在 A 中分配对象,A 中满了,把 A 中可达对象复制到 B 中,继续在 B 中放置需要创建的对象。B 若满了,像处理 A 一样,处理 B,复制方向由 B->A。

  1. 确定什么时间回收垃圾

一般内存不够用时,回收垃圾。根据对象生存时长特点,堆空间分为新生代和老年代。新生代又根据对象使用时间次数和时间的特点,分为 E 区,S0 区,S1 区。刚创建的放入 E 区,E 区满了,触发 GC,把 E 区和 S0 区的可用对象复制到 S1 区。如此反复,复制一次记为一代,达到 6 代,还存活,则放入老年代

  1. 确定垃圾回收的执行方式

垃圾回收,线程执行方式,有串行和并行,并发,以及对堆分块,以更小的粒度进行。

  1. 串行垃圾收集器

  2. 并行垃圾收集器

  3. 并发垃圾收集器

  4. G1 垃圾收集器

以上垃圾收集时,都会导致 Stop The World。从 1->4,STW 时间越来越短。


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


答:秒杀系统页面组成

  1. 商品列表页

  2. 商品详情页

  3. 订单提交页

挑战和问题

秒杀是指在很短的时间内,有大量用户来抢购商品,并发量大

  1. 高并发对带宽和服务器处理能力有很高的挑战,原有的系统是不可能扛住这么大的并发量的,所以秒杀系统要是一个单独的系统

  2. 秒杀系统也不能完全脱离原有系统,要和原有的订单系统、支付等系统有通信,不能产生大量的订单等压垮原有订单、支付系统。

  3. 秒杀时间未到时,不允许提交订单。

方案和思路

  1. 通过集群模式提高处理能力。

  2. 页面静态化,通过 CDN 提高用户访问响应时间,降低服务器压力。

  3. 通过限流减少订单服务器需要处理的请求数。设置阈值阀门。

  4. 第一道阈值阀门,从列表向详情跳转时,如超过一定量的点击后,如 1000,浏览器端跳转到秒杀活动结束页

  5. 第二道阈值阀门,详情页到订单提交页,超过一定的点击后,如 100,浏览器端跳转到秒杀活动结束页

  6. 第三道阈值阀门,提交的订单前 50,提交到真正的订单系统

  7. 服务器端所有需要读库的数据都缓存起来,直接读缓存

  8. 提交的订单放到消息队列中,再从消息队列取出,发送到真正的订单系统。这样,用户可以马上得到结果。给用户一个订单处理中的状态

  9. 只有到了秒杀的时间点,详情页和订单页才可以查看和提交订单,要有一个验证机制


用户头像

喜欢简洁干净的代码 2018.05.04 加入

使用技术,实现业务。思考业务,创新技术。

评论

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