架构师训练营作业 -20200801

用户头像
caibird1984
关注
发布于: 2020 年 08 月 01 日

请简述JVM垃圾回收原理



JVM垃圾回收的核心功能就是将JVM堆中已不再使用的对象进行清理,将这部分被清理掉的对象占用的资源(如内存)进行释放,以利于后续线程复用这些回收的计算资源,保证程序能够稳定且长时间运行。



JVM在识别“不再使用的对象”的方法,是从线程栈帧中的局部变量或方法区的静态变量开始,将变量引用的对象进行标记,并递归标记这些对象所引用的对象。当整个标记流程完成时,未被标记的对象即为没有任何引用的对象,可以视为“不再使用的对象”,可以将其进行回收。



JVM在处理待回收的对象时,可能的方法有以下三种:

1、仅标记需要回收的对象,当应用程序需要创建新的对象的时候,直接将新创建的对象分配到这些待回收的对象占用的内存中;

2、将所有不可被回收的对象保存至一段连续的内存空间中,其余的空间即可视为空闲的空间,可分配给新创建的对象使用;

3、在创建对象的时候将新建对象限制在堆的一部分内存内,当这部分内存消耗殆尽时,将不可回收的对象复制到堆的其它部分内存中,并继续在原来使用的内存空间中继续创建新的对象。



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



秒杀系统核心的挑战在于短时间内出现的极高并发数量的请求,对于软件系统造成的影响可能包括:

1、使应用服务器的计算资源(如CPU、内存)的消耗瞬间变大,从而导致系统吞吐量下降,系统响应时间延长,甚至造成数据库瘫痪;此外,系统响应时间的延长也可能导致用户频繁刷新页面,这样会更大程度上加重服务器群集的负担,造成恶性循环;

2、使带宽耗尽,导致部分用户无法正确加载到某些静态资源(图片、样式表、脚本文件等),会使页面展示效果甚至功能出现异常,影响用户体验;

3、高并发场景下较容易出现计数器错误,导致商品超售或未完全销售,对给秒杀活动的预算或企业业绩带来负面影响。



此外,由于秒杀器类程序的存在,除了对系统带来更高的并发压力之外,还会带来其它隐患,包括:

1、不公平竞争,使用了秒杀器程序的用户,较正常操作的用户而言,有更高的几率通过秒杀获得更多商品的购买机会,会侵犯其它正常操作的用户的利益;

2、跳过秒杀页面,通过解析秒杀页面的源码,寻找绕过秒杀页面的路径,在秒杀开始之前即开始锁定待秒杀的商品,导致秒杀活动开始时可用的库存较活动总数偏少,而大部分秒杀商品集中在少数几个人手中,后续出现转售秒杀购买资格等行为对公司口碑会带来负面影响。



除此之外,个人认为最大的挑战来源于整个团队的协调层面。想要秒杀活动达到预期效果,需要运营、设计、前后端开发,甚至运营和商务部门的通力合作,一起面对挑战,这需要一个强有力的管理方式将整个团队凝聚在一起,向一个目标前进。实际工作过程中往往会出现某个部门因为“影响用户体验”、“时间不足”、“经费不够”等原因等方式拒绝对大流量场景妥协,拒绝做出调整,或者消极怠工,个人认为这才是开展一个秒杀活动的时候可能遇到的最大的挑战。



基于上述挑战和问题,在架构层面的思路可能有以下几个方面:

1、整体设计上,使秒杀系统尽量与原有系统进行拆分,例如从硬件资源上拆分,在网页层面上减少直接的数据交互,转而采用页面跳转或页面内嵌等方式在其它系统中引入秒杀系统的页面,避免秒系系统因为高并发量导致系统宕机时对原有系统带来影响;

2、服务器端功能层面上,尽量减少业务逻辑判断,通过预加载的方式在秒杀活动开始之前将需要的数据(如商品的库存数据)加载至缓存中,在秒杀活动期间的请求尽量都与缓存进行交互,原则上不进行数据库访问,秒杀成功后的下单页面采用跳转回原有订单处理系统进行后续处理,尽量简化秒杀系统的后端逻辑,仅保留必要的校验(如秒杀活动开始时间的验证,用户登录状态验证等);

3、页面端功能层面上,尽量将秒杀相关的逻辑验证集中在页面部分解决,包括用户登录状态的判断,秒杀开始/结束的判断,以及各种异常状态的跳转处理等;图片、样式表等静态资源尽量上传至CDN缓存,以减少用户访问静态资源对系统带宽造成压力;

4、流量控制层面上,原则上只放心最先进入秒杀系统的用户(如前1000个用户),对其余用户直接提示秒杀已结束,将大量的流量拦截在系统接入的层面,以减轻系统后续步骤的压力和系统整体的压力;增加IP黑名单策略,在防火墙层面增加IP地址访问的监测,对于大量频繁访问秒杀页面的IP可视为秒杀器,直接增加只防火墙黑名单中,以保障其他正常访问用户的使用不受影响;

5、基于通过页面HTML代码获取秒杀商品下单页面地址的行为,需要在服务器端程序中增加登录状态判断和秒杀开始时间的判断,只有当秒杀真正开始后访问秒杀商品下单接口的请求才视为正常请求,否则可判定为恶意请求,直接加进防火墙黑名单中,拒绝其继续访问;同时本周的课程中提到通过js文件在客户端程序动态生成秒杀下单页面的地址也给了我新的启发,只有当秒杀接近开始时(如提前5秒)才在HTML文件中绘制出秒杀按钮及其URL,也可以很大程序上防止解析HTML代码进行提前下单的恶意访问;

6、除此之外,还应该做好秒杀系统崩溃时的应急处理,如通用的错误页面,内容为“秒杀已结束”,当访问秒杀系统出现异常时直接跳转至此页面,避免用户持续访问秒杀页,造成系统雪崩。



用户头像

caibird1984

关注

还未添加个人签名 2018.04.28 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营作业-20200801