架构师训练营 - 命题作业 第 9 周
请简述 JVM 垃圾回收原理。
1、JVM利用可达性算法,进行垃圾回收,
从根对象出发,根对象包括:栈中引用的对象、静态成员引用的对象、方法区引用的对象等,
开始向下搜索,找到的所有对象都被标记,未被标记的对象,即为需要回收的对象。
2、JVM把内存分为堆和栈,垃圾回收主要是针对堆区进行的回收操作。
堆区又区分为新生代和老年代进行回收,
对于新生代,新创建的对象都在这里,因为大部分对象的生命周期都比较短,回收概率很高。
对于多次新生代回收失败的对象,会挪到老年代去。
对老年代的回收,则会触发JVM的停顿,也叫STW:Stop the world。
为了优化STW,JVM也提供了G1算法,分成多个不同的小区块进行回收。
设计一个秒杀系统,主要的挑战和问题有哪些?核心的架构方案或者思路有哪些?
秒杀的主要挑战,是瞬间大量的用户并发访问,高请求、高流量,从而导致系统崩溃。
实际秒杀场景的解决方案,大致如下:
1、html、js、css、图片等静态文件,使用cdn,并且cdn要能支持gzip;
2、秒杀前,基本都是读缓存,专门用一个不缓存的js或api,做计时判断,是否开始秒杀了,服务端还是可以缓存的,用304缓存;
3、相同用户在n秒内,只允许一次请求到服务端,其它请求都直接前端拦截掉,可以通过Cookie或LocalStorage进行缓存和判断;
4、库存预先加载到内存缓存,在内存中进行秒杀,只有秒杀成功的,才进行落盘,并进入后续的支付流程;
5、内存库存为0,就直接更新某个js或api,直接前端阻断所有请求;
6、秒杀成功的,串行进入消息队列,通过队列的Qos来进行削峰,避免支付流程压力太大;
7、使用延时队列或Quartz之类的定时任务,进行订单超时退库处理,避免秒杀后不支付。
8、可以每台机器平均分布,这样就可以直接使用内存缓存,不用分布式缓存了。
比如有1000个商品,10台机器,那么每台机器只处理100个商品的秒杀。
需要考虑的是单台机器挂了,未完成秒杀的商品要回库
版权声明: 本文为 InfoQ 作者【水边】的原创文章。
原文链接:【http://xie.infoq.cn/article/3dcc72ddd19c6dd83aa04ac3f】。文章转载请联系作者。
评论