架构师训练营第九周作业
请简述 JVM 垃圾回收原理
GC 包括以下基本步骤。
Marking
目的
找出堆中应用不再使用的对象(即垃圾)
方法
从 GC Root 对象(包括:当前栈中局部变量指向的对象;活动线程对象;静态变量;JNI 引用)出发;
遍历所有其他对象,找出所有可以由 GC Root 直接或者间接引用的对象;
剩下的对象,由于不存在一条由 GC Root 到达它们的路径,被标记为垃圾,等待回收。
Sweeping
目的
清除垃圾对象占有的空间,使这些空间可以在下次分配中被使用。
方法
在实际使用中,考虑到存在 Fragement(内存碎片),所以在清除时,往往要通过 Copy、Compact 等手段整理内存空间,减少碎片,提高内存使用效率。
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
需求:秒杀前不能点击购买
在秒杀开始前,用户不能点击购买;秒杀开始后,用户才能提交购买请求。
防止用户通过工具猜测到购买 URL,绕过限制,在秒杀开始前提交购买请求。
解决思路
前端通过访问特定的 js 文件(包含随机版本号,防止浏览器缓存),该 js 文件中包含商品 ID 列表;
秒杀开始前,系统返回空的商品 ID 列表,前端无法构造合法的购买请求,用户不能点击购买;
前端定期刷新;
秒杀开始后,系统跟新相关 js 文件内容,使其包含商品 ID 列表,前端则在获取到列表后,允许用户点击购买。
挑战:高并发
并发数比平时系统的并发能力高出几个数量级,无法在原有系统的基础上,通过简单的扩容实现需要的性能;
解决思路
另起炉灶。不是改造原有系统,而是新建新页面和服务,这样可以避免影响原有的业务。
动静分离。通过将信息展示静态化,减少秒杀过程中对服务的访问。
CDN 提供用户对静态资源的访问,减少对自身网络带宽资源的占用。
多级限流。基于分布式缓存实现计数器,根据计数器实现限流。在计数器达到阈值后,请求被降级,直接返回用户:秒杀已结束。
评论