写点什么

架构学习第 9 周作业

用户头像
乐天
关注
发布于: 2020 年 08 月 05 日



作业一:

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

垃圾对象的查找是通过可达性分析来做的。

垃圾回收的三种基础方法主要有标记清除、复制、标记整理(压缩)。

标记清除存在内存碎片化的问题,复制算法存在内存浪费的问题只能用到一半,标记整理没有内存碎片和 浪费的问题,但是整理时间耗时。

JVM 垃圾回收分代收集算法是根据对象的生命周期进行分代处理的算法,分区域情况使用某种基础垃圾回收算法。新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。

在老年代中,因为对象存活率高、没有额外空间对它进行分配担保,就必须使用标记-清理算法或者标记-整理算法来进行回收

分代收集算法中有endian区,old区,survivor区(有from 和 to 两个小区),survivor区存在的意义是减少endian区存活内存直接进入到old区,是endian 和 survivor中间的缓冲。

最新的JVM垃圾回收算法是G1,也是一个分代回收算法,对内存堆进行了多分区处理,提供大内存区。垃圾回收时对部分内存区进行并行回收,因为STW时间通常会很小。

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

主要的挑战我我觉得分两部分,一部分高并发,一部分是安全性。

一. 并发处理

高并发方面的架构方案和思路主要是限流和水平扩容,限流主要是从处理流程上逐层限制用户请求到后端服务的请求数。

从处理流程上看,首先是前端页面的优化,包括能静态化的页面全部静态,使用cdn缓存,减少对服务器的请求流量。另外是限制用户按钮的点击频率,如下单按钮控制几秒内才能点击一次,减少重复请求。

再次是通过网关限流,减少达到后端服务器的并发请求数。

然后可以通过负载均衡分配到秒杀服务器。因为数据库并发处理数有限,所以秒杀服务器不和数据库直接打交道,而是通过redis来做。提前将商品信息和库存数导入到redis, 秒杀服务器通过redis原子操作,来判断是否还有库存,可通过redis lua脚本将查查询库存和扣库存放在一起处理。如果无库存,通知用户商品已购完。

秒杀服务器扣库存成功后可以异步生成订单,成功生成订单后告知用户,并提示用户付款。

二. 安全性处理

  1. 是秒杀时间的同步,前端同步服务器端时间,未到时间,禁止操作购买相关按钮

  2. 是请求安全性,不同商品购买请求,可生成不同的随机码,到秒杀时间下发客户端,客户端请求时必须带上随机码,网关会验证相关请求随机码,过滤不安全请求。防止提前秒杀。

  3. 网关层可对同ip的发起数进行限流,限制黄牛党秒杀

  4. 业务层对同一个用户进行的操作进行限制,不能秒杀同一个商品多次

  5. 是进行业务隔离,和其他的业务服务在中间件层和存储层进行隔离。秒杀使用不同的redis缓存集群。订单操作采用异步操作,使用消息队列进行削峰。

  6. 秒杀业务服务器对并发流量可以限流,降级,熔断



一个初步的秒杀系统如下图:



发布于: 2020 年 08 月 05 日阅读数: 56
用户头像

乐天

关注

还未添加个人签名 2020.02.02 加入

还未添加个人简介

评论

发布
暂无评论
架构学习第9周作业