架构师训练营第二期 Week 9 作业
请简述 JVM 垃圾回收原理。
JVM 在执行垃圾回收的时候会判断堆中的对象是否被引用,如果没有被引用就会回收掉。首先,JVM 会对不被引用的对象做标记,然后对标记的对象进行清理,为了进一步优化性能,JVM 还会把剩下的对象移动到连续空间中,从而把空闲空间也变成连续空间,有利于新对象的分配。因为扫描所有对象进行垃圾回收比较耗时,JVM 采用分代垃圾回收的方式把空间分为新生代和老年代,通常只对新生代做垃圾回收,并逐步把在新生代中存活时间较长的对象移动到老年代,当老年代空间存满后做一次完全的垃圾回收。
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
秒杀系统要面对瞬时的超高并发,会带来巨大的带宽压力和应用服务器压力,同时还要解决秒杀器造成的不必要的高并发以及可能提前进入购买页面的问题。
为了解决带宽的压力,我们通常将大流量的内容(图片,CSS,JS)放在 CDN 上。
为了解决应用服务器的压力,我们通常会减少流量到达应用服务器的机会。我们可以将静态页面缓存到反向代理服务器上,如果页面有动态内容我们也可以通过专门的工具将页面静态化再发布。由于秒杀的特殊性,大量用户访问最后只有极少数用户被允许购买,我们通常使用计数器来控制进入下一个步骤的人数,也就控制了并发数。计数器同时也可以解决秒杀器带来的额外流量,因为只有固定人数可以进入下一步,不会对系统造成额外负担。
为了解决提前进入购买页面的问题,我们通常只会在秒杀前 1,2 秒钟才会将秒杀链接读取到页面,我们在页面可以通过一个定时请求不停的读取秒杀链接,当链接被读取到后秒杀按钮才可以被激活并把链接绑定到按钮上。这样没有人可以提前知道秒杀链接并购买。
评论