写点什么

架构师训练营第 0 期第 9 周学习总结

用户头像
Arthur
关注
发布于: 2020 年 08 月 04 日

通过三周的与性能优化相关课程学习,了解性能优化产生的原因,对系统带来的问题和影响,以及针对不同问题的解决方法和优化思路,以下是这三周内容的简单概括。

本周学习的内容主要包括 JVM 原理和关于秒杀系统介绍。


1、关于 JVM 性能优化

JVM 帮助开发工程师屏蔽不同操作系统的底层指令处理,以及对象的回收,因为对象的自动回收,反而给从事 JVM 相关的程序员带来了新的问题,那就是 JVM 的内存分配和垃圾回收调优。

1-1、Stop-The-World

垃圾收集阶段,JVM 会暂停所有的工作线程(也就是业务处理线程),这个阶段就叫【Stop-The-World】,系统如果频繁 GC,工作线程停止,造成服务响应时间长,从而影响系统吞吐量。

哪些原因会导致 JVM 频繁 GC,总结主要有这两个方法:

  • 不合理的内存分配;

  • 不合理的垃圾收集器选择;

  • 不合理的对象创建;


1-2、不合理的内存分配

1-1-1、堆内存分配不合理

请求增加带来创建对象变多,如果堆内存分配过小,虚拟机会因为内存不足,导致频繁 GC;


1-2-1、栈深度分配不合理

栈深度设置不合理(JVM 默认-xss 值为 1024KB),如果设置较小,当方法执行的逻辑较复杂,容易引起 StackOverflow;


1-2-3、新生代和老年代分配比例不合理

如果新生代分配较小,会导致本可以在新生代回收的对象,转移到老年代,无法快速回收,还会导致对象迁移,老年代 FullGC 的频率升高;


1-3、不合理的垃圾收集器选择

不同垃圾收集器,采用不同的算法和回收策略,如果在业务访问较高的系统选择【单线程】或者【并行】收集器,会导致系统经常停顿,影响系统性能。


对于 JVM 的内存分配和垃圾收集器选择,是之前课上性能调优方法对于【虚拟机调优】的讨论。


1-4、不合理的对象创建

这是性能调优方法针对【代码层面】问题的讨论:

针对占用内存较大的对象,特别是大数组,如果数组大小分配不合理,系统在申请对象内存时,可能因为新生代内存不足,而直接将对象分配在老年代;

或者对动态数组(ArrayList)或链表(LinkedList)进行不合理的添加;


以上就是 JVM 对系统性能的总结。

2、秒杀系统带来的架构设计思考

接下来聊聊秒杀

秒杀系统主要的问题,高并发和安全性,这或许是很多系统都会遇到的问题,虽然没有遇到过高并发的业务和流量,但是其中有些解决问题的方法值得借鉴;


2-1、关于系统安全

安全问题是所有系统都需要考虑的,秒杀考虑的安全,一是系统安全,涉及到网络带宽占用,系统并发,数据读取,另外一个是业务安全,比如防秒杀器;

在日常系统设计和维护中,安全是个很重要的问题:

  • 比如某些经常爆出的网站密码泄露问题,对于敏感信息,就需要加密保存;

  • 而秒杀和抢购业务,要做到对 URL 的数据隐藏,和请求增加 Token 校验;

  • SQL 注入问题;

  • ....


日常设计系统时,除了功能设计外,系统安全设计也十分必要;


2-2、隔离

业务、系统和数据都要进行隔离,不同系统之间数据、缓存一定不能共享


2-3、缓存

缓存是解决读写分离的一种有效手段,大多数系统都是读多写少,缓存有以下几种:

1、CDN 缓存,对于首页或者访问较高的页面,CDN 缓存可以有效保护骨干网络;

2、分布式缓存,如 Redis,这里还要对 缓存穿透、缓存击穿 和 缓存雪崩 问题的考虑;


2-4、网络带宽

当我们申请服务器时,除了要考虑 CPU、内存和磁盘外,网络带宽也是需要考虑的部分,如果服务器的硬件资源足够,但是因为网络带宽不足,导致用户下载图片变慢,会影响页面展示;


2-5、请求调用次数和范围

无论是系统间的请求,还是对数据库或缓存访问的请求,在系统设计阶段要做到越少越好,比如一个业务链路上,减少不影响业务功能的服务请求(如电商点击购买时添加地址操作),或者系统内部请求数据库量减少(比如在 for 循环里访问数据库,可以用主键的 where in 获取数据);


上面这些都是从秒杀系统的设计,扩展到对系统设计的思考。系统设计需要考虑的问题很多,不能仅仅抱着完成功能的思路去创建系统,不能每天重复性的做事,要对自己的职业生涯负责。


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

Arthur

关注

还未添加个人签名 2018.08.31 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第0期第9周学习总结