方向专项内容预估时长
基础知识OS & Network & 数据结构算法4 天
编程语言Java 基础&数据结构&并发&JVM5 天
编程语言Python 基础&数据结构&并发4 天
存储与中间件MySQL & Redis & Kafka & Nginx4 天
容器与虚拟化Kubernates & Docker - 了解简短的就可以5 天
分布式分布式理论 & 锁 & 事务 & 存储2 天
高性能高可用高可用 & 高性能 & 高扩展2 天
系统设计系统设计 & 设计模式 & DDD1 星期起步
微服务架构监控 & 日志 & 故障处理 (RPC 也忽略)3 天
开发框架Spring、Flask、FastAPI

工作感悟

  1. 技术积累的重要性:技术成长的基础是大量的技术积累,包括阅读、编码、项目经验、解决问题等。没有积累,直接学习理论或刷题效果有限,因为无法理解知识的实际应用。
  2. 主动多做事的习惯:快速积累技术的唯一途径是主动多做项目、多写代码,不计较得失。这种习惯需要内心的认同,否则难以坚持。转变心态,从“凭什么我做”到“主动去做”,再到“把奋斗当成习惯”,是技术成长的关键。
  3. 思考与沉淀:当技术积累到一定程度时,需要停下来思考,梳理所学知识,构建知识体系。通过总结和思考,零散的知识点会形成体系,加速后续学习和积累。
  4. 洞见技术本质:通过不断积累和思考,逐渐看清技术的本质和原理,提升学习新技术的效率。然而,掌握原理只是开始,真正的挑战在于工程实践中的细节。
  5. 持续学习与实践:技术的成长是一个持续的过程,需要不断学习、实践和总结。只有将这些道理内化为自己的信条,才能真正掌握并应用它们。

有个问题,像直播这种场景,如果客户端观看人数很多,比如同时 100w 人在线,是需要维护 100w 个客户端到服务器的长连接吗?这样感觉服务器会不会扛不住
作者回复: 你好,是可以做到的,目前服务器性能很强的,我记得 360 做过一个分享一台服务器就能维持 100 万连接,加上推送实时性以及稳定性需要 20 万或者更少用来剩下空间做冗余,

分布式

共识算法

  • 可以推荐有时间或者有精力的可以完成 6.824 中的 raft 实现 https://pdos.csail.mit.edu/6.824/labs/lab-raft.html

  • 为什么 Raft 集群成员增减需要特殊去做?

    • 删除 Leader 的问题
    • 最重要的是脑裂的问题
  • 分布式协议与算法实战 —— 全部都是

  • 分布式技术原理与算法解析 —— 内有

    • 分布式互斥 —— <03 | 分布式互斥:有你没我,有我没你>
      • 分布式下申请有限资源时,互斥问题的解决
      • 文章里有整理,但是还是没有对于“有限的资源”场景有清晰的认识。
      • 当前仅认可“分布式锁”属于互斥资源,其他暂时想不到。

下面的链接详细讲解了 Raft 算法,及双主出现后集群是如何恢复的。 https://www.infoq.cn/article/coreos-analyse-etcd/
还有一个 Raft 算法动画链接 http://thesecretlivesofdata.com/raft/#election

技术

池化技术

  1. 内存管理:比如 memcached,jvm
  2. 线程池:jdk,tomcat
  3. 连接池:数据库
  4. 对象池:单例模式的扩展

数据库连接池

为什么频繁创建 MySQL 连接会造成响应时间慢呢?

我用”tcpdump -i bond0 -nn -tttt port 4490”命令抓取了线上 MySQL 建立连接的网络包来做分析,从抓包结果来看,整个 MySQL 的连接过程可以分为两部分:

第一部分是前三个数据包。第一个数据包是客户端向服务端发送的一个“SYN”包,第二个包是服务端回给客户端的“ACK”包以及一个“SYN”包,第三个包是客户端回给服务端的“ACK”包,熟悉 TCP 协议的同学可以看出这是一个 TCP 的三次握手过程。

第二部分是 MySQL 服务端校验客户端密码的过程。其中第一个包是服务端发给客户端要求认证的报文,第二和第三个包是客户端将加密后的密码发送给服务端的包,最后两个包是服务端回给客户端认证 OK 的报文。从图中,你可以看到整个连接过程大概消耗了 4ms(969012-964904)。
07 _ 池化技术:如何减少频繁创建数据库连接的性能损耗?.png

那么单条 SQL 执行时间是多少呢?我们统计了一段时间的 SQL 执行时间,发现 SQL 的平均执行时间大概是 1ms,也就是说相比于 SQL 的执行,MySQL 建立连接的过程是比较耗时的。这在请求量小的时候其实影响不大,因为无论是建立连接还是执行 SQL,耗时都是毫秒级别的。可是请求量上来之后,如果按照原来的方式建立一次连接只执行一条 SQL 的话,1s 只能执行 200 次数据库的查询,而数据库建立连接的时间占了其中 4/5。

数据库连接池出问题可能原因:

1.数据库的域名对应的 IP 发生了变更,池子的连接还是使用旧的 IP,当旧的 IP 下的数据库服务关闭后,再使用这个连接查询就会发生错误;
2.MySQL 有个参数是“wait_timeout”,控制着当数据库连接闲置多长时间后,数据库会主动的关闭这条连接。这个机制对于数据库使用方是无感知的,所以当我们使用这个被关闭的连接时就会发生错误。

哪些方式来提高连接池的可用性?

1.启动一个线程来定期检测连接池中的连接是否可用,比如使用连接发送“select 1”的命令给数据库看是否会抛出异常,如果抛出异常则将这个连接从连接池中移除,并且尝试关闭。目前 C3P0 连接池可以采用这种方式来检测连接是否可用,也是我比较推荐的方式
2.在获取到连接之后,先校验连接是否可用,如果可用才会执行 SQL 语句。比如 DBCP 连接池的 testOnBorrow 配置项,就是控制是否开启这个验证。这种方式在获取连接时会引入多余的开销,在线上系统中还是尽量不要开启,在测试服务上可以使用

07 | 池化技术:如何减少频繁创建数据库连接的性能损耗? - 极客时间已完结课程限时免费阅读

杂项

Java

线程池预热,既初始化核心线程数的线程。ThreadpoolExecutor 提供了 prestartAllCoreThreads 方法可以预先启动核心线程。
重要线程池的队列任务堆积量,请问下老师,这个指标怎么监控。jdk 的 ThreadPoolExecutor 可以调用 executor.getQueue().size()

“后端技术面试 38 讲”:

职级&职业发展

架构师成长之路 | “华仔,放学别走!” 第4期 —— 各个职级需要的能力

其他

分布式技术原理与算法解析⭐️ _ 内有
22 | 答疑篇:分布式体系架构与分布式计算相关问题