Bootstrap

架构师 3 期 3 班 -week9- 作业

作业题目

  • 请简述 JVM 垃圾回收原理。

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

作业1

简述JVM垃圾回收原理

堆中分为新生代与老年代,垃圾回收也是独立的。

垃圾回收主要4种算法:标记-清除、标记-压缩、复制和分代

JVM使用分代回收策略,新生代的垃圾回收叫MinorGc,老年代的垃圾回收叫MajorGc

MinorGc

不考虑栈上分配的情况下,创建对象会在新生代中的eden区分配一块内存

当eden区满候触发MinorGc

MajorGc

老年代的对象主要来自survivor晋升(超过16代或者survivor满了提前晋升)和新创建大对象(通过-XX:PretenureSizeThreshold参数指定)

当老年代满了时,触发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分钟之内可以预定,到时间揭晓是否获得购买资格,这也是一种变相的秒杀,而且能有效的防止秒杀器/黄牛党,是个蛮不错的思路。预定无需操作数据库,直接记录缓存服务器即可,性能好很多。