架构师 3 期 3 班 -week9- 作业
作业题目
请简述 JVM 垃圾回收原理。
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
作业 1
简述 JVM 垃圾回收原理
堆中分为新生代与老年代,垃圾回收也是独立的。
垃圾回收主要 4 种算法:标记-清除、标记-压缩、复制和分代
JVM 使用分代回收策略,新生代的垃圾回收叫 MinorGc,老年代的垃圾回收叫 MajorGc
MinorGc
不考虑栈上分配的情况下,创建对象会在新生代中的 eden 区分配一块内存
当 eden 区满候触发 MinorGc
根据 GCRoots 的可达性分析,标记哪些对象还在被引用
将 eden 区和 s0(form)区被标记为还在用的对象,复制到 s1(to)区
将存活的对象生存年代计数+1
如果有对象存活年代超过 16(默认),将这个对象移入老年代
s0 与 s1 逻辑对换,s0 从 form 区变成 to 区,s1 从 to 区变成 form 区
完成 MinorGc
MajorGc
老年代的对象主要来自 survivor 晋升(超过 16 代或者 survivor 满了提前晋升)和新创建大对象(通过-XX:PretenureSizeThreshold 参数指定)
当老年代满了时,触发 MajorGc
根据 GCRoots 的可达性分析,标记哪些对象还在被引用
清除未标记的老年代对象(具体用标记-清除/标记-压缩算法用的垃圾回收器)
完成 MajorGc
新生代与老年代一起进行垃圾回收叫做 FullGc
通常 MajorGc 会伴随 MinorGc,所以通常可以认为 MajorGc = FullGc
作业 2
秒杀系统的挑战
高并发带来的带宽压力(图片、css、js 等静态资源)
高并发带来的服务器系统资源压力(cpu、内存、文件句柄等)
数据库 IO 压力
秒杀器
解决思路
秒杀的解决方案是系统化的,不是只解决/优化一个或几个点,而是从前端到后端,从硬件到软件,从需求到测试开发的全面思考
硬件方面
1. 隔离:秒杀系统与正常的系统隔离,避免秒杀的高流量影响正常业务
2. 资源:预算内更多的服务器、更大的内存、更快的硬盘、更高的带宽
3. CDN:静态资源放到 CDN,热单页面可以提前预热
软件架构
1. 利用缓存降低数据库的 IO
2. 利用 mq/异步/队列提高吞吐量
3. 动静分离提高服务器访问性能
4. 非核心业务降级
5. 限流(IP 限流防刷,多级页面限流减少服务器压力)
6. 客户端缓存(热点数据如秒杀列表等缓存到客户端一段时间避免刷新)
需求沟通
实际操作中,可以从需求出发,引导产品经理对需求做一些调整,可以更省时省力的解决大问题,这是实际工作中的个人心得,不一定正确。
能否加入人机识别
点抢购时,加入拖块也好,识别文字数字也好,加入这种用户操作一是可以防止秒杀器,二是可以有效减少瞬时并发,起到客户端消峰的效果。
缺点是用户体验稍差,需要产品经理确认是不是认可
能否将秒杀变成抽奖
类似 nike 发布新鞋的时候,15 分钟之内可以预定,到时间揭晓是否获得购买资格,这也是一种变相的秒杀,而且能有效的防止秒杀器/黄牛党,是个蛮不错的思路。预定无需操作数据库,直接记录缓存服务器即可,性能好很多。
版权声明: 本文为 InfoQ 作者【zbest】的原创文章。
原文链接:【http://xie.infoq.cn/article/5088cb2a2d7d8b364484b44b1】。未经作者许可,禁止转载。
评论