架构师训练营 - 作业 - 第九周
1. 请简述 JVM 垃圾回收原理。
JVM 垃圾回收就是将 JVM 堆中不再被使用的对象清理掉,释放宝贵的内存资源。
JVM 通过一种可达性分析算法进行垃圾对象的识别并标记,它对线程栈中的局部变量或者静态变量出发,将这些变量引用的对象做标记,然后看这些被标记的对象是否引用了其他对象,继续进行标记,所有被标记过的对象都是被使用的对象,而那些没有被标记的对象就是可回收的垃圾对象了。
回收主要有三种方法:
清理
将原来垃圾对象内存空间标记为空闲。
压缩
从堆空间头部开始,将存活的对象拷贝到一段连续的内存空间中。
复制
将堆空间分成两部分,当一部分用完时,将标记过的对象复制到另一个空间中。
分代回收:将堆分为新生代、老年代。新生代又分为 Eden 区、Survivors(From 区、To 区)。
新生代
Eden
Survivors
From
To
老年代
新创建的对象一开始处于新生代区中,当新生代区满时,将存活的对象复制到 From 区,等到下次新生代再次满时,新生代和 From 区中的存活对象会被一起复制到 To 区。如果一个对象经过多轮的 From 区和To 区之间的复制后仍然存活,那么它会被复制到老年代。新生代的空间远小于老年代,空间小在垃圾回收时效率更高。
JVM 会记录 Survivor 区中的对象一共被来回复制了几次。如果一个对象被复制的次数达到一个值(对应虚拟机参数 -XX:+MaxTenuringThreshold),该对象会被promo 至老年代。如果带个 Survivor 区被占用 50%(对应虚拟机参数 -XX:TargetSurvivorRatio),较高复制次数的对象也会被 promo 至老年代。
回收算法:
串行回收器
并行回收器
并发回收器 CMS
G1 回收器
在回收过程中会产生 stop-the-world 现象。
2. 设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
主要挑战
高并发下保证系统可用性
秒杀商品页面浏览/更新高可用
秒杀按钮/功能高可用
防黑客攻击/秒杀器
下单/支付功能高可用
高并发下主要问题
网络带宽耗尽
运营推广页面弹出1兆大图片导致贷款耗尽
服务器 Load 飙高,停止响应,服务器崩溃
数据库瘫痪
秒杀器抢单
核心的架构方案或者思路
带宽准备
限制每个商品的图片大小
每件商品图片大小 = 总带宽 / 单件商品并发 * 8
总并发 = 商品数 × 每件商品的并发
租用 CDN
静态数据缓存到离用户最近的地方
秒杀商品页面的设计优化
静态化
采用 JS 自动更新技术将动态页面转化为静态页面
静态页面缓存到用户最近的 CDN 上,防止用户不断刷新页面
图片合并,CSS 偏移展示,使得一次 http 请求就能获得。
减少发送 cookies 的量
HTML 内容压缩
CSS, JS 精简
秒杀计时器的设计
js 每秒定时生成商品列表,判断秒杀开始与否
秒杀器的预防
秒杀 Detail 页面
URL 随机,秒杀前2秒放出,1000次访问上限控制【每件商品只能放入1000人浏览】。
下单页面
订单 ID 随机
不能直接跳过秒杀 Detail 页面进入
每个秒杀商品,带预先生成的随机 Token 作 URL 参数
如果秒杀过,直接跳到秒杀结束页面
1000 次访问上限控制,【每件商品只能放入1000人浏览】。
简化流程
砍掉不必要的分支流程
前端优化
提升页面响应速度
限流 —— 设置阀门
只放最前面的一部人进入系统
降级
把一些不重要的功能暂时关闭,如:商品评论、资讯、论坛、博客等
保住首页,Offer Detail, 旺铺页面等核心应用的可用性。
紧急预案
域名分离,独立域名,不影响原有业务
机动服务器
万能出错页面:秒杀活动已结束
任何出错都 302 跳转到此页面
位于另外集群
参考连接
https://xie.infoq.cn/article/d000de5b600f0b2bf17af7282
https://xie.infoq.cn/article/2b3520aaf9a9a67748ed63072
https://xie.infoq.cn/article/c3185d0e17e81d2cf33df41b2
https://xie.infoq.cn/article/44f9eea92767032994da7a034
https://xie.infoq.cn/article/457f0f8a64fb0a8b056c7302a
评论