后端 | 阅读文章列表
Java
- Java 中高效使用枚举:https://mp.weixin.qq.com/s/CLr5bcxsG7C8v6qSsagEbw
- JVM 三种编译器(Javac \ JIT \ AOT):https://zhuanlan.zhihu.com/p/476252005
new String()
创建的对象数量:https://cloud.tencent.com/developer/article/1686226- Java 学习路线图参考:https://mp.weixin.qq.com/s/JiOkOPK96RgMSI9d9RbmrQ
- Java 经典学习路线以及详细资料:https://mp.weixin.qq.com/s/FlGZf3Q-KamZDptc5hkonw
- 服务端开发与面试知识手册:https://tb-tech.oss-cn-hangzhou.aliyuncs.com/《服务端开发与面试知识手册》
- Java 工程师必会 110 题:https://www.kdocs.cn/l/coqGrbz7ZF1P
- Java 面试题阶段性汇总:https://mp.weixin.qq.com/s/SARLx_J5oK6nYbby5YBxAg
- 泛型擦除的详细介绍:https://blog.csdn.net/briblue/article/details/76736356
- 泛型擦除的实践和原因:https://www.51cto.com/article/678988.html
- JMH 基准测试程序性能表现:https://mp.weixin.qq.com/s/woSGPlnnHlZ4Mp2wjqf81A
- Java 虚拟线程如何提高吞吐量:https://mp.weixin.qq.com/s/yyApBXxpXxVwttr01Hld6Q
- 阿里面经,分布式以及问题解决:https://mp.weixin.qq.com/s/Uq2K4DNQNTQZbozitTHETA
- 主流 Java 组件以及框架介绍:https://mp.weixin.qq.com/s/LDiCEdTGXcEKPg3xknnMsw
- BigDecimal 的使用注意事项:https://mp.weixin.qq.com/s/Jkls3zK6G7WF42hx3KvnTA
- 子线程如何获取父线程 ThreadLocal 的值:https://mp.weixin.qq.com/s/oJLKZK0CMx49nzFh4QYB0A
- 线程池中抛异常的处理方式:https://mp.weixin.qq.com/s/-SW4f6ELIjbL04wFfZD0sw
- 在线程提交的方法中,使用 try-catch 方法块,对异常进行手动处理;
- 使用 Thread.setDefaultUncaughtExceptionHandler 方法捕获异常,设置默认的异常 handler 来处理异常;
- 重写 ThreadPoolExecutor 中的 afterExecute 进行异常处理;
- Java 中线程的生命周期状态:https://mp.weixin.qq.com/s/RGQAllBcQlF-I0b9U6d9kw
- JVM 调优思路:每天 100w 次登陆请求, 8G 内存该如何设置 JVM 参数:https://mp.weixin.qq.com/s/RmbjZveySVFRiDRuQc6rYg
- Java 体系下的限流方案:https://mp.weixin.qq.com/s/yPKxHONeWhrHWkNFZF4rYQ
- 使用 JDK 8 的 Function 接口优化选择:https://mp.weixin.qq.com/s/DcdizPdd1k6rMuf-zU0IDA
- JDK 8 的 Stream 流的实现原理:https://mp.weixin.qq.com/s/YA20tx0aCMkA2GGbRdpFVQ
- Java 中 Future 接口详解:https://mp.weixin.qq.com/s/9lv36J8x29ilj6R7aOWirw
- 关闭 JVM 两个方法的区别:https://blog.csdn.net/allway2/article/details/112971611
System.exit()
:调用这个方法会触发调用 JVM 关闭序列,这其中会执行 shutdownHook 钩子程序;Runtime.getRuntime().halt()
:调用这个方法不会触发 JVM 关闭序列,会强制终止正在运行的 JVM 程序,不会触发钩子程序。
- Fail Safe 和 Fail Fast 的区别:https://www.jb51.net/article/205746.htm
- 从 JDK 8 升级至 JDK 11 的方法以及实践:https://www.zhihu.com/question/26844110/answer/3166516358
- Java 中关于值传递和引用传递的讨论:https://www.zhihu.com/question/31203609/answer/576030121
- Java 中只有值传递,没有引用传递。将对象作为形参传递,实际传递的是实参的引用地址。
- 反映在编码中,方法中将形参对象重新指向后修改,这个值不会反映到实参上。
Golang
- Golang 技术文章合集:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&album_id=2699708162366832641
- Golang 常见错误以及如何避免:https://qcrao.com/post/100-go-mistakes-reading-notes/
- 30min 快速入门 Golang:https://mp.weixin.qq.com/s/b8qHNY4wBH4pj5nuGJ8CqQ
- Go 语言高性能编程:https://geektutu.com/post/high-performance-go.html
- 7Day 用 Go 实现项目系列:https://geektutu.com/post/gee.html
- Go 语言快速入门指南:https://xie.infoq.cn/article/d9f223bd4fe7947b7f9c6b3f6
- Go 语言入门指南全教程:https://learnku.com/docs/the-way-to-go
- Golang 的学习路线以及学习文档:https://xie.infoq.cn/article/129bb397ff04a88a789c068ed
- Go 核心知识点手册:https://mp.weixin.qq.com/s/OYhZ4XANbaFH4f9g4EZ-Ig
- Go 语言体系下的微服务框架选型 Dubbo-go:https://mp.weixin.qq.com/s/qYhMEU1sQjBJZr33t8rj6Q
- Golang 整洁架构实践:https://mp.weixin.qq.com/s/I2Fx2TIrwXV2kfLj_T5g5g
- Go 开发环境配置常见设置:https://mp.weixin.qq.com/s/XhF5cOuR0EeF9nHKI9BIOA
- Golang 与 Java 全方位对比总结:https://mp.weixin.qq.com/s/-N4eqdXb9a93uvOWfE4ScQ
- Golang 与 Java 的差异性对比:https://new.qq.com/rain/a/20230406A07FL500
- Golang 与 Java 的细节对比:https://juejin.cn/post/7229883377141186621
- 基于 Go+Vue 前后端分离的工单系统:https://mp.weixin.qq.com/s/76j_cd4bM97TB5OaIX49rg
- Golang 单元测试实践:https://mp.weixin.qq.com/s/6c7t4qs15uV-bu60M9UPPA
- Go 的垃圾回收介绍:https://mp.weixin.qq.com/s/WQD-hIe-bex3G5rleYELCg
- 5 个项目中常用的 Go 库:https://mp.weixin.qq.com/s/9t9OTHJLFpOZDcGhU7Im6Q
- Golang 中的 Context 作用:https://mp.weixin.qq.com/s/7Z1Van0GjvJmNbqp0wmJaA
- 一个请求 Request 会在多个 Goroutine 中被处理,多个 Goroutine 之间需要共享 Request 的一些信息;当 Request 结束的时候,所有从这个 Request 中创建的 Goroutine 也应该结束。
- Goroutine 和 Context 的创建、调用、传递,就像树一样层层递进。
func Background() Context
方法返回 Context 的根节点,并且可以通过根节点创建不同的子节点。
PHP
- PHP 中 foreach 引用的坑:https://blog.csdn.net/qq_36025814/article/details/115346200
- PHP 中 foreach 循环中使用的单个元素变量(比如 value),在循环结束后仍然会保留,如果不销毁且下次循环仍然使用相同的变量名,将会导致下次循环的结果不正确。
- 数组最后一个元素的
$value
引用在 foreach 循环之后仍会保留。建议使用unset()
来将其销毁。
计算机基础
- 计算机网络常见问题:https://mp.weixin.qq.com/s/L5deD51x47w3O2SMiRyLzQ
- 一台服务器最大能支持的连接数:https://mp.weixin.qq.com/s/3AwjQIX8nZ0BSr1oCu5SgQ
- 常见的算法思想:https://mp.weixin.qq.com/s/X4yyypOJn73jo2rhacLzbA
- 网络设备相关知识点:https://mp.weixin.qq.com/s/n44WYAxlKR_kLS_dcmotjg
- 高并发服务模型的区分:https://mp.weixin.qq.com/s/4yKAD261CQL6JuZmKQPIyg
- 深入理解 CPU 缓存一致性协议 MESI:https://mp.weixin.qq.com/s/QNFB0YdqcrKbgKQbm2LEmg
- 缓存一致性协议与内存屏障:https://mp.weixin.qq.com/s/cQsshkL93IDHX1pVvZ0eAg
- 网络、数据库基础面经:https://mp.weixin.qq.com/s/0kUf1ujPUuieyOSMsBIzaw
- Linux 健康状态查看:https://mp.weixin.qq.com/s/Wfq66vzPnADZT1fkawhe1g
数据库
- MySQL 设计规约:https://mp.weixin.qq.com/s/XC8e5iuQtfsrEOERffEZ-Q
- SQL 语句大全:https://mp.weixin.qq.com/s/HhCxT6VL8SxkhomLh5HvUA
- SQL 优化通用模版方法,重点:https://mp.weixin.qq.com/s/AThItVhGt-17DVMB7Ok2jA
- MySQL 日志详解:https://blog.51cto.com/u_15891990/5908720
- Like 是否走索引:https://www.bmabk.com/index.php/post/64188.html
SELECT *
是否会全表扫描:https://mp.weixin.qq.com/s/oHBuUZCyqSwycHJPTsZWNwSELECT *
全表扫描,是因为 MySQL 的优化器算出来全表扫描的 cost 更小,但是执行时间并不是最优。 默认的 CPU 成本和 I/O 成本的取值计算并不适合所有场景,可以通过optimizer trace
来查看优化过程以及 cost 的计算结果。- 查看
optimizer trace
可以使用explain format=json + SQL
的方式,也可以通过修改全局设置的方式开启:SET optimizer_trace="enabled=on";
注意使用结束后关闭。 - 在查询数据前,MySQL 会选择成本最小原则来选择使用对应的索引,这里的成本主要包含两个方面。① IO 成本: 即从磁盘把数据加载到内存的成本,默认情况下,读取数据页的 IO 成本是 1,MySQL 是以页的形式读取数据的,即当用到某个数据时,并不会只读取这个数据,而会把这个数据相邻的数据也一起读到内存中,这就是有名的程序局部性原理,所以 MySQL 每次会读取一整页,一页的成本就是 1。所以 IO 的成本主要和页的大小有关。② CPU 成本:将数据读入内存后,还要检测数据是否满足条件和排序等 CPU 操作的成本,它与行数有关。默认情况下,检测记录的成本是 0.2。
- 总结来说,filter 过滤操作是 CPU 成本,读取整页数据是 IO 成本。
- 根据这个计算的 cost 成本值只是估计,会存在和实际的情况不相符的问题。所以为了屏蔽优化器带来的影响,可以适当使用 force index 来强制走索引。
- 索引常见八股文:https://juejin.cn/post/7193682380077400122
- 1.5 万字 + 30 张图盘点索引常见的 11 个知识点:https://mp.weixin.qq.com/s/VJ5QWJ-2z3yXLDAT-mC80w
- 全表扫描成本计算:这个表大致有多少条数据 rows,以及聚簇索引所占的字节数data_length,由于默认是 16kb,所以就可以计算出
(data_length/1024/16)
大概有多少个数据页。所以全表扫描的成本计算为:rows * 0.2 + data_length/1024/16 * 1.0 - 二级索引 + 回表的大致成本:① 走二级索引的成本就是
区间个数 * 1.0 + 条数 * 0.2
② 回表的成本大致为条数 * 1.0 + 条数 * 0.2
所以二级索引 + 回表的大致成本为区间个数 * 1.0 + 条数 * 0.2 + 条数 * 1.0 + 条数 * 0.2
。 - 当索引的成本和全表扫描的成本都计算完成之后,MySQL 会选择成本最低的索引来执行。
- 全表扫描成本计算:这个表大致有多少条数据 rows,以及聚簇索引所占的字节数data_length,由于默认是 16kb,所以就可以计算出
- MySQL 的索引下推:https://mp.weixin.qq.com/s/iQnArUNIsZFzVCj90MZjyg
- 索引下推 Index Condition Pushdown 是 MySQL 5.6 的新特性。索引下推会判断 WHERE 条件部分能否用索引中的列来做检查,条件不满足则处理下一行索引记录;条件满足,使用索引中的主键去定位并读取完整的行记录(回表)。回表之后,存储引擎把记录交给 Server 层,Server 层检测该记录是否满足 WHERE 条件的其余部分。
- 没有索引下推的时候,在不满足最左前缀匹配原则、索引断裂的时候,回表之前不会判断后面失效的索引是否满足条件。这样的查询中回表的数据量就会更多,索引下推解决了这个问题。
- 索引下推的使用条件:① 只能用于 range、 ref、 eq_ref、ref_or_null 访问方法;② 只能用于 InnoDB 和 MyISAM 存储引擎及其分区表;③ 对 InnoDB 存储引擎来说,索引下推只适用于辅助索引。
- 数据库锁常见八股文:https://mp.weixin.qq.com/s/VEU5p85aTvyBKf2XP5QTSg
- MySQL 加锁规则的 4 个原则:https://mp.weixin.qq.com/s/HM0FiF3NFSsVz5vy0VZ_SQ
- 数据库优化 8 大通用技能:https://mp.weixin.qq.com/s/0_Arz-KO3UqJij1s4DjLNw
- MySQL 优化的 5 个维度:https://mp.weixin.qq.com/s/pedyd3F5vn8-Go16Ca3phw
- MySQL 普通面试题:https://mp.weixin.qq.com/s/2KXSrJ5s6T4yhCWZ-f13IA
- InnoDB 的 RR 有没有解决幻读:https://mp.weixin.qq.com/s/Pm6PQEYwStww6htOQAlDIg
- SQL 优化的常见问题:https://mp.weixin.qq.com/s/SBKlxcTK_kZf0s5CRtIEBA
- SQL 优化的 15 个小技巧:https://mp.weixin.qq.com/s/UJJYMd2a5pqJTAWy9MjaYQ
- SQL 优化 + 思维导图:https://mp.weixin.qq.com/s/epQM3QgAjqM15wONLnZmAw
- MySQL 事务底层原理:https://mp.weixin.qq.com/s/pkJb_9mddmdYaJZ8azHSsg
- MySQL 事务四大隔离级别:https://mp.weixin.qq.com/s/r5F8w4N90XCaAPmrUfwABQ
- MySQL 表设计经验准则:https://mp.weixin.qq.com/s/sSsZ-w6WzjA_DLZfnsxD2w
- MySQL 索引和 B+Tree:https://mp.weixin.qq.com/s/cuug8a6QjsIw2FRkgZ5JxQ
- MySQL 各种锁总结,内容较少:https://mp.weixin.qq.com/s/JAgykU8cSDgU-QEQnspz1Q
- MySQL 单表数据量为什么不能超过 2kw:https://mp.weixin.qq.com/s/vXS5BxcxqiGqPfxxyiliAw
- MySQL 的 null 值怎么存放:https://mp.weixin.qq.com/s/sqW51yqeAXcDs9r84UFP7A
- 慢 SQL 如何拖垮数据库:https://mp.weixin.qq.com/s/XmPdG7E8xGXdZVBg7M81_w
- MVCC 的介绍以及原理:https://segmentfault.com/a/1190000037557620
- MySQL 主从同步延迟如何解决:https://zhuanlan.zhihu.com/p/361789345
- MySQL 慢查询的 12 个原因:https://mp.weixin.qq.com/s/gz-wQPsaerf4k7ymG8DiDA
- MySQL 为什么建议小表驱动大表:https://mp.weixin.qq.com/s/5wZfZDoVTqERRrgeCtoQ5w
- SQL 优化思路 + 经典案例分析:https://mp.weixin.qq.com/s/BbrLQWGYlkXiy6t4YANj0Q
- ClickHouse 的简单介绍:https://mp.weixin.qq.com/s/9GxOcL66OoqKbc-MxSjlug
- 数据库分为 OLTP(关系型数据库)、OLAP(仓库型数据库)两种,ClickHouse 属于后者。相比 MySQL,ClickHouse 是一种列式数据库,这为他带来了很多的性能提升。
- ① 查询的时候只需要读取对应的列,而非整行的数据读取,减少 IO 消耗;② 针对整列的数据存储,同列同类型有 10 倍压缩提升,进一步降低 IO;③ 根据不同数据存储场景,做个性化搜索算法优化。
- 分布式数据的介绍:https://zhuanlan.zhihu.com/p/503180808
- 分布式数据库主要相对传统数据库,提供了海量数据存储、解决分库分表痛点、高可用容灾的能力。分布式数据库利用多副本带来的横向扩展、分布式一致性算法解决了这些问题。
- PG-XC 风格:每一个数据节点依然是单体数据库,通过主从复制来实现高可用,再加上额外的调度节点实现分片路由、全局时钟实现分布式事务。GaussDB、TDSQL、GoldenDB 等。
- NewSQL 风格:每个组件都采用分布式设计,底层存储多采用键值 KV 系统,同时引入多数派选举算法实现多副本同步,存储、计算、调度完全分离。TiDB、OceanBase 等。
- 传统的分库分表架构不断演进,增加了协调节点,全局时钟,就演变成了PGXC架构,这是主流分布式数据库的一个分支。在基于 BigTable 键值数据库的基础上增加事务支持,就演变成了 NewSQL,是分布式数据库的另一个分支。
- 分布式数据库的结构:https://zhuanlan.zhihu.com/p/341038587
Redis
- Codis 管理 Redis 分布式集群:https://juejin.cn/post/6844903737295634440
- Redisson 分布式锁的实现:https://juejin.cn/post/7168727597180780574
- 基于 Redis 实现分布式锁:https://mp.weixin.qq.com/s/y8kAflIenRpa4zIwCP_8iA
- Redis 分布式锁的实现原理:
- Redis 基础知识快速概览:https://mp.weixin.qq.com/s/V_IdwubEG2M7J6qlYSevSA
- Redis 避免缓存击穿的实践:https://www.51cto.com/article/745344.html
- 阿里数据库缓存一致性探究:https://mp.weixin.qq.com/s/OWuP66WxpciBAgm2mptUxw
- 先更新数据库再更新缓存:A、B 两个线程先后访问,会造成数据不一致。
- 先更新缓存再更新数据库:同样会造成数据不一致的情况发生。
- 先删除缓存再更新数据库:下面这种情况仍然会造成缓存数据不一致。
- 先更新数据库再删除缓存(Cache Aside):缓存不一致。
- 重试机制(缓存双删):可以在一定程度下缓解缓存不一致问题。
- 订阅 MySQL Binlog 再操作缓存:稳定可靠,但是会增加运维成本。
- Redis 的网络模型设计:https://mp.weixin.qq.com/s/U5VKhO6-EkwOGhppJj4_4g
- Redis + Lua 分布式接口限流:https://mp.weixin.qq.com/s/2uAsOosob7oS0WukzDZICA
- Redis 详细介绍以及相关问题,所有八股文:https://mp.weixin.qq.com/s/3Bm1h_oEi4X4b_RIldUekw
- Redis 数据删除造成内存碎片问题:https://mp.weixin.qq.com/s/wrTL-UrqmTIk54mWT3cCNA
- 实现 Redis 分布式锁的 5 种方式:https://mp.weixin.qq.com/s/XqIHCDyEidRgoY81AxQbPA
- Redis 队列实现 Java 版秒杀系统:https://mp.weixin.qq.com/s/eQgxKLgTmom25IeFlmwHOQ
- Redis 性能优化如何做:https://mp.weixin.qq.com/s/nNEuYw0NlYGhuKKKKoWfcQ
- Redisson 分布式锁官方使用文档:[https://github.com/redisson/redisson/wiki/8.-distributed-locks-and-synchronizers/)
- 高效压缩位图 RoaringBitmap 的原理及使用:https://zhuanlan.zhihu.com/p/445396980
- Redisson 看门狗机制:https://juejin.cn/post/7269385060612309007
- 硬核 Redis 系列文章讲解:https://mp.weixin.qq.com/mp/appmsgalbum?action=getalbum&album_id=1699766580538032128
分布式
- 字节跳动对分布式锁的详细介绍:https://blog.csdn.net/ByteDanceTech/article/details/125814670
- 分布式锁的多种实现:https://mp.weixin.qq.com/s/Wj313x5TtU21D8ARv1Zsnw
- 主要有数据库、Redis、Zookeeper、ETCD 这几种实现方式。一般实际生产中,因为性能问题不使用数据库锁。
- Zookeeper 实现分布式锁用的是临时顺序节点。在 Locks 节点下,各个客户端会判断各自当前是否为最小的节点。如果自己是当前最小的临时顺序节点,则获得锁;否则向前一个临时节点注册 Watcher 事件,用来监听前一个节点是否还存在,也就是说如果获取锁失败将进入等待。
- Zookeeper 实现的分布式锁,删除节点分为正常业务执行完毕和异常故障两种情况。① 正常业务执行完毕之后,当前客户端会向 Locks 节点显示调用删除指令。② 如果是客户端异常故障,根据临时顺序节点的特性,节点将会在一段时间之后自动删除。这两种情况下,删除了当前的节点,下一个节点将会自动获取到这个锁。
- Zookeeper 实现分布式锁简单易用,只需要利用临时顺序节点的特性,前向注册监听器。但是,如果频繁请求加锁、删除锁,也会对 Zookeeper 集群带来较大的压力,这也是它不如 Redis 的地方,支持的并发量不如 Redis 高。
- 分布式事务的详细讲解以及在京东的落地:https://juejin.cn/post/7226525442176778277
- 主要详细介绍了 2PC、3PC 以及中间可能产生的一些问题。
- 事务预提交:参与者接收到 PreCommit 请求后执行事务操作,并将 Undo 和 Redo 信息记录到事务日志中,同时锁定当前记录。
- 分布式事务 2PC 理论:https://www.jianshu.com/p/1aa944f44b7b
- 高可用的 11 个关键技巧:https://mp.weixin.qq.com/s/MSaugX48y5iia02UVpqb_Q
- Spring Boot 实现接口幂等性的 4 种方案:https://juejin.cn/post/7180252965033214010
- 13 种锁的实现方式:https://mp.weixin.qq.com/s/AOshaWGmLw6uw92xKhLAvQ
- Docker 的详细介绍:https://mp.weixin.qq.com/s/sd8jeD3oBXFfGsC_pkw6zw
- Redis 和 MySQL 保持数据一致性:https://mp.weixin.qq.com/s/zyuQMrOx1LYUvGV16DKczQ
- 分库分表或被分布式数据库取代:https://mp.weixin.qq.com/s/xqmJ7BxljfJSVc4LG_eepQ
- 分库分表的 21 条准则:https://mp.weixin.qq.com/s/0RcS20lNov_bv3MGDpiC7w
- 分布式链路监控系统:https://mp.weixin.qq.com/s/3ONVrA2_UmM9qbOPdGOrxA
- LVS 四种工作模式和十种算法:https://mp.weixin.qq.com/s/8PajH0VlGk3FyL5iuJNZ1A
- 四种经典限流算法讲解:https://mp.weixin.qq.com/s/_zOs2V1muTGbQrmti7ar_g
- RocketMQ 的长轮询实现原理:https://mp.weixin.qq.com/s/U0jlW0K3Kuo2iRWNTB-Xww
- Google 二进制编码 Protobuf 实现原理:https://mp.weixin.qq.com/s/kfyTcs6xuDvlCX3U04Edng
- 分布式 12 问,主要为分布式锁/事务:https://juejin.cn/post/7202909627573927994
- Raft 协议,Leader Election 领导选举之后使用 Log Replicate 日志复制来达成一致性。脑裂现象发生时会发生退位 step down 且 Rollback 当前未提交日志。总体来说,
Master Slave + Leader Election + Log Replicate
是 Raft 协议的核心。 - 分布式系统的补偿机制:https://mp.weixin.qq.com/s/Hqam4EtW7vQhB4mWp6TXtw
- 业务补偿:当某个操作发生了异常时,如何通过内部机制将这个异常产生的不一致状态消除掉。业务补偿的实现方式分为两种:回滚、重试。
- 回滚操作:显式回滚:调用逆向接口,进行上一次操作的反操作,或者取消上一次还没有完成的操作(须锁定资源);隐式回滚 :隐式回滚意味着这个回滚动作你不需要进行额外处理,往往是由下游提供了失败处理机制的。回滚的实现,对于跨库的事务,比较常见的解决方案有:两阶段提交、三阶段提交(ACID)但是这 2 种方式,在高可用的架构中一般都不可取,因为跨库锁表会消耗很大的性能。高可用的架构中一般不会要求强一致性,只要达到最终的一致性就可以了。可以考虑:事务表、消息队列、补偿机制、TCC 模式(占位 / 确认或取消)、Sagas模式(拆分事务 + 补偿机制)来实现最终的一致性。
- 重试操作:重试是我们认为这个故障是暂时的,而不是永久的,所以会去重试。重试策略主要有以下几种:立即重试、固定间隔、增量间隔、指数间隔、全抖动(
random(0 , 2 ^ retryCount);
)、等抖动(2 ^ retryCount + random(0 , 2 ^ retryCount);
)。 - ACID 和 BASE 是分布式系统中两种不同级别的一致性理论,在分布式系统中,ACID有更强的一致性,但可伸缩性非常差,仅在必要时使用;BASE 的一致性较弱,但有很好的可伸缩性,还可以异步批量处理;大多数分布式事务适合 BASE。在重试或回滚的场景下,我们一般不会要求强一致性,只要保证最终一致性就可以了。
- 业务补偿注意事项:① 业务需要支持幂等性,有重试机制;② 业务流程高可用和稳定;③ 设计业务正向流程的时候,也需要设计业务反向流程;④ 业务方最好提供短期的资源预留机制,可以迅速将业务占用的资源释放及时回滚。
中间件
- Canal 解析 binlog 相关问题:https://cloud.tencent.com/developer/article/1645881
- Spring Boot 集成 Dubbo 启用 gRPC 协议:https://mp.weixin.qq.com/s/JYjx5CzADmq_VcV0Nar7xw
- RPC 框架 dubbo 的常见问题:https://mp.weixin.qq.com/s/-s1ztBR-z_gOVZ6uJ1tXJw
- Nginx 的全面介绍:https://mp.weixin.qq.com/s/MPS8ST4wkfRcKDo-sp-9KA
- Nginx 和 HAProxy 负载均衡的差异:https://mp.weixin.qq.com/s/Wabh_fTRdP3sZvZ2Sacy6g
- Nginx 的详细介绍:https://mp.weixin.qq.com/s/ZvM3zEekjC_MEngPyLCWQw
- 项目中使用消息队列的考量:https://mp.weixin.qq.com/s/mtR6V1jIJT-Fm_29bvJ_dQ
- 主要是为了异步处理。其次,引入消息队列还可以实现一些其他特性,主要包括:扇出(广播)、异步处理、流量控制、服务解耦、横向可扩展性、消息持久性、批量处理。
- RocketMQ 的核心实现原理:https://mp.weixin.qq.com/s/jsUxTHykzhc90DGwtIkezw
- RocketMQ 二十三问:https://mp.weixin.qq.com/s/mNpXpSVVVBuI59LI6vVvQA
- RocketMQ 源码中,7 种导致重复消费的问题:https://mp.weixin.qq.com/s/kxtXFAQJAN5SNTyK6gRZqw
- RocketMQ 多级存储设计与实现:https://mp.weixin.qq.com/s/OjqGK10ZK3yO14_iFZAUBw
- Kafka、RabbitMQ、RocketMQ、ActiveMQ 分布式消息队列对比:https://mp.weixin.qq.com/s/8fz_QkAbkAqO2SZcfJsPuQ
- Kafka 分区工作机制:https://mp.weixin.qq.com/s/JhZ50lgwWkONBxbMggwBPQ
- Kafka 为什么要抛弃 Zookeeper 的分析:https://mp.weixin.qq.com/s/iDvlpfvb2pmyCBRvKdyzyQ
- Zookeeper 作注册中心的劣势:https://mp.weixin.qq.com/s/Yv-d3p4lkGV772EiQeNxHw
- 分库分表经典 15 连问:https://mp.weixin.qq.com/s/cZ7mUsCvBxmo1dzsPA3WjQ
- Sharding 分库分表简单介绍:https://mp.weixin.qq.com/s/6qapCJWvwk7I2ZUrdockQA
- Sharding JDBC 实战:分布式事务处理:https://mp.weixin.qq.com/s/1Lqp4-AFx4GSMQwSzTUVbA
- Sharding JDBC 分库分表的问题以及解决方案:https://mp.weixin.qq.com/s/VE4Uwab5QJHW9HpglI1yIg
- Sharding JDBC 实战问题:https://mp.weixin.qq.com/s/EvM3vdH1RrDUS2rGEglaRw
- MySQL 同步 ES 的技术方案:https://juejin.cn/post/7248118049583841336
- 主要包括四种方式:① 同步双写:数据写到 MySQL 时,同时将数据写到 ES;② 异步双写:数据写入 MySQL 之后,通过 MQ 的形式通知 ES 的更新;③ 基于 SQL 抽取:通过数据记录的修改时间,定时从数据库抓取数据完成 ES 同步;④ 基于 Binlog 实时同步:通过 Canal、DTS 等工具解析 MySQL 的 Binlog 日志,完成实时的 ES 更新同步。
- 什么时候使用 ES 而不是 MySQL:https://juejin.cn/post/7264528507932327948
- 如果需要存储结构化或半结构化的数据,并且需要保证数据操作的正确性和完整性,可以选择 MySQL 作为主要数据库系统。例如,电商网站、社交网络、博客平台等。
- 如果需要存储非结构化或多样化的数据,并且需要支持复杂的全文检索和相关度评分,可以选择 Elasticsearch 作为主要数据库系统。例如搜索引擎、日志分析、推荐系统等。
- 如果需要存储和分析大量的时序数据,并且需要支持实时的聚合和可视化,可以选择 Elasticsearch 作为主要数据库系统。例如,物联网、监控系统、金融市场等。
- 如果需要同时满足上述两种需求,并且可以容忍一定程度的数据不一致或延迟,可以将 MySQL 作为主数据库系统,并将部分数据同步到 Elasticsearch 作为辅助数据库系统。例如新闻网站、电影网站、招聘网站等。
- ES 深分页详解:https://juejin.cn/post/7267419273630269480
- ES 常用业务操作 API 接口:https://mp.weixin.qq.com/s/w9t-4Bk4cmE90-igjitsmA
- ES 搜索引擎详细讲解:https://mp.weixin.qq.com/s/3dVn2SQ77rCKxVdKk_riJg
- ES 介绍长文:https://mp.weixin.qq.com/s/UK9csjCel0-1r7DyEm9ZKg
- ES 倒排索引以及为什么能做到快速检索:https://mp.weixin.qq.com/s/vwTrRSfgJ-7bWQUJWhfaHQ
- ES 的详细介绍以及底层原理:https://mp.weixin.qq.com/s/sOuUHuY5F0idPtaV0meVKg
- 5 种分布式事务方案以及 Seata 的解决方案:https://mp.weixin.qq.com/s/TfuFY3FEqQk2eCt7b9Vz0w
- MangoDB 的万字详细介绍:https://mp.weixin.qq.com/s/T_oxRwDp8W-OgLwb9AbdCw
- MongoDB 知识体系与基础概念:https://mp.weixin.qq.com/s/DR7v_nTwppssTCTcrQ7DdA
高性能
- 业务接口响应太慢的处理方法:https://mp.weixin.qq.com/s/g-v1Jq6tzJHJgHI3QMoIAw
- 使用 Arthas 中的 Trace 命令统计方法耗时:trace命令能主动搜索class-pattern/method-pattern对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。
- 使用 trace 命令跟踪接口方法的性能:
trace com.company.project.controller.HelloController methodName
- 大事务问题如何解决:https://mp.weixin.qq.com/s/FyFcspKqCdh3Ug6YP1Ausw
- 大事务会带来哪些问题:① 并发数据不一致;② 加锁容易阻塞;③ undolog 事务日志性能问题;④ 并发数据库压力大。
- 如何优化大事务问题:① 事务中禁止 RPC 远程调用;② 尽量使用编程式事务;③ 数据分批处理;④ 大事务拆分成小事务;⑤ 异步并行处理。
- 大事务的解决办法:https://mp.weixin.qq.com/s/qSAGgY-f3BPHM_RyRh5ONA
- 大事务带来的问题:死锁、锁等待超时、回滚时间长、接口超时、并发情况下数据库连接池被占满、数据库主从延迟
- 少用
@Transactional
注解。@Transactional
注解是通过 Spring 的 AOP 起作用的,但是如果使用不当,事务功能可能会失效。@Transactional
注解一般加在某个业务方法上,会导致整个业务方法都在同一个事务中,粒度太粗,不好控制事务范围,是出现大事务问题的最常见的原因。可以使用编程式事务,手动执行事务。 - 将 Select 查询方法放到事务外面。
- 事务中避免远程调用,事务中避免一次性处理太多数据。
- 非事务执行:非核心操作可以以非事务方法执行。
- 异步处理:抽象出不重要的逻辑,或者非强依赖的逻辑,可以异步执行处理。
- 软件设计杂谈:性能优化的十种手段:https://code2life.top/2020/08/15/0055-performance/
- 浅谈系统性能提升的经验和方法:https://mp.weixin.qq.com/s/Qk-T2SDJkWH0Ibew3CWz8g
- 不可数循环 Uncounted Loop 碎片化 GC 避免 Full GC 的方式:https://mp.weixin.qq.com/s/he9Y3saAIYIMaU4XAHDPPw
- 本地缓存优化方案:https://juejin.cn/post/6844904199453409294
- 高并发系统设计的 15 个建议:https://mp.weixin.qq.com/s/PPA8Iw6K2M2xVnGE-Tf6zw
- 性能优化的常用方案设计:https://mp.weixin.qq.com/s/C2mxkDuImCnjbGrrtncfBA
- ① 批处理:避免多次 IO;② 异步处理:不是必要的结果逻辑,放到异步逻辑中处理;③ 空间换时间:使用缓存,提前将数据拿到更近更容易获得的地方;④ 预处理:提前完成部分数据的计算;⑤ 池化思想:避免重复创建和销毁对象;⑥ 串行改并行:没有结果参数依赖情况下,多个请求并行执行;⑦ 锁粒度:选用合适的锁粒度;⑧ 避免大事务:避免大事务长期占用资源;⑨ 优化程序结构:减少重复执行和不必要的步骤;⑩ SQL 优化:避免深分页,进行 SQL 调优,添加合适的索引。
- 接口性能优化的 15 种方案:https://mp.weixin.qq.com/s/0fkDbnd_YRtdbMTI2l9skA
- 接口性能优化的常见方案:https://zhuanlan.zhihu.com/p/610756706
- 性能优化的 10 个技巧:https://mp.weixin.qq.com/s/sTi8JUepFO8mmg9oXDGW7Q
- Java 本地高性能缓存实践:https://mp.weixin.qq.com/s/IFTLHliO1jKzrckcXN2cnw
- 提升 Spring Boot 吞吐量方法:https://mp.weixin.qq.com/s/jb7hi3WP9MUte_P2Op2JeA
- 分类树性能优化实战:https://mp.weixin.qq.com/s/qgkXz7aX6C30ixrRpv2__g
- 项目接口请求合并,提高效率:https://mp.weixin.qq.com/s/4h4QjJjOIhuvzBqu3RpWKg
- 阿里系统性能提升的经验和方法:https://mp.weixin.qq.com/s/Qk-T2SDJkWH0Ibew3CWz8g
- 使用 GC 日志可视化工具进行 JVM 调优:https://mp.weixin.qq.com/s/CgXMvGDNqSfq9JVpomwoTA
- 口语化讲解数据库优化:https://juejin.cn/post/7186444714042720313
- 高并发的项目中最重要的点:https://www.zhihu.com/question/421237964/answer/1819946379
- 如何优化单请求耗时:单机环境主要是如何设计和改造系统架构,有可能涉及到 JVM 的参数优化、各种依赖是如何选型,过程中积累了哪些选型和优化的方式;
- 如何提高单机并发能力:在业务中,单机并发能力受限于哪些关键点,这里主要的挑战点是单机的限制条件以及单机资源的竞争,如何设计克服的,过程中积累了哪些设计原则;
- 如何提高整体并发能力:在集群环境下最重要的亮点,就是如何处理跨机器的资源竞争以及数据的一致性问题,这里将体现整体业务架构设计能力;
多线程
- CompletableFuture 在美团的原理与实践:https://mp.weixin.qq.com/s/GQGidprakfticYnbVYVYGQ
- CompletableFuture 任务编排:https://juejin.cn/post/7212466685450207290
- IO 密集型业务,线程数是 CPU 数的 2 倍的原因:https://mp.weixin.qq.com/s/XeLdBrcZxhyMyIzu8QMGVg
- 评估线程池需要多少线程:https://mp.weixin.qq.com/s/3E6qdOci-B7h532GTbKUnQ
- 合理配置线程池的线程数:https://mp.weixin.qq.com/s/JGIM6V7apnO9nntuE6VU8A
框架
- Spring Boot 参数校验方法:https://mp.weixin.qq.com/s/jSt4iewU-43tI0efHcNbYg
- Spring Boot 插件化开发方式:https://mp.weixin.qq.com/s/PFMkVE8xvPlp-VVG_aLKpQ
- 插件化开发主要指的是使用 SPI 机制,将一些扩展的第三方包中的功能通过接口的形式引入项目。文章中的实现方式,主要是通过在 Resource 目录中定义新的静态配置文件,将插件的类名提前定义好,并且通过 SPI 的方法实现进行 IoC 注入。
- 自定义 Spring Boot 注解实现多线程事务:https://blog.csdn.net/weixin_69672118/article/details/127675808
- 主要通过自定义注解 + CountdownLatch 的方式,通过多个子线程的事务执行结果,判断事务是否全部执行成功,根据执行结果,决定是否将当前的事务提交。
- 根据测试结果,这种实现方式不一定可靠,需要大量验证。
- Spring 多线程环境下保证事务一致性:https://mp.weixin.qq.com/s/E2PD4zvc_IHv8LDmiT-kkA
- Situation 背景:步骤 1 和步骤 2 并行执行,然后确保步骤 1 和步骤 2 执行成功后,再执行步骤 3,等到步骤 3 执行完毕后,再提交全部事务。
- Task 任务:解决上述背景中描述的问题,在 Spring 框架体系中实现可复用的多线程事务管理。
- Action 行动:因为步骤 1 和步骤 2 需要并行异步执行,所以使用
@Transactional
不能获取到步骤 1 和步骤 2 的执行结果,采用 CompletableFuture + 编程式事务实现。在异步之外定义一个局部变量保存是否发生异常,根据是否发生异常(也就是异步执行的结果)决定是否在主线程中进行事务的提交或者回滚。- Problem:这里会出现一个问题,报错:
No value for key [HikariDataSource (HikariPool-1)] bound to thread [main]
这个报错是因为事务提交需要事务的上下文信息,负责保存这些ThreadLocal
属性的实现类由TransactionSynchronizationManager
承担。异步执行环境中,主线程并没有这些事务同步的属性,所以会报错。 - Resolve:解决这个问题,只需要将
TransactionSynchronizationManager
中的事务信息,在子线程和主线程之中进行显式传递。这样主线程在进行事务提交或者回滚操作的时候,只需要利用传递的事务信息上下文即可实现。
- Problem:这里会出现一个问题,报错:
- Result 结果:最终实现了在多线程环境下异步事务的一致性。
- Spring 中状态机的使用:https://mp.weixin.qq.com/s/5bCJRlH_MEOc_ZC1gjDANg
- 主要依靠 STAE 对事件进行抽象,事件驱动状态的修改。State Transition Action Event,实现状态的事件驱动和流转。
- Spring 如何解决循环依赖:https://mp.weixin.qq.com/s/DgPm84pOjuTE2zCY8THpVg
- Spring 三级缓存解决循环依赖:https://blog.csdn.net/cristianoxm/article/details/113246104
- Spring 中 Bean 的有状态和无状态:https://blog.csdn.net/songfeihu0810232/article/details/78470495
- Spring 部署成 jar 和 war 包有什么区别:https://mp.weixin.qq.com/s/cLhvyFFZIfEKWQ5iAVfbxw
- war 是一个 web 模块,其中需要包括 WEB-INF,是可以直接运行的 web 模块;jar 一般只是包括一些 class 文件,在声明了 main_class 之后是可以用 java 命令运行的。
- war 包是做好一个 web 应用后,通常是网站,打成包部署到容器中;jar 包通常是开发时要引用通用类,打成包便于存放管理。
- war 是 Sun 提出的一种 Web 应用程序格式,也是许多文件的一个压缩包。这个包中的文件按一定目录结构来组织;classes 目录下则包含编译好的 Servlet 类和 Jsp 或 Servlet 所依赖的其它类(如 JavaBean)可以打包成 jar 放到 WEB-INF 下的 lib 目录下。
- Spring Boot 最常用注解梳理:https://mp.weixin.qq.com/s/C-CYe1gPRG8ta1l_qjbyXw
- Spring Boot 自动装配原理:https://mp.weixin.qq.com/s/d22SgqZGf07LD4ClaC2bpQ
- Spring Boot 整合多数据源:https://mp.weixin.qq.com/s/n0TZSWghG5e0qMUapNLHqQ
- Spring Cache 实现分布式二级缓存:https://mp.weixin.qq.com/s/rywDzWQ39hbxnkxHzWgxzA
- Spring Batch 批处理框架:https://mp.weixin.qq.com/s/-PHp32oNyQLCNbC_kczSOA
- Spring Security 的最佳实践:https://mp.weixin.qq.com/s/DdsJ0z__MUBD4Iv-JeM3ng
- Spring AOP 实现原理讲解:https://mp.weixin.qq.com/s/q8x5lTocNXA2KozmRepWXg
- Spring 事务不生效的 15 种场景:https://mp.weixin.qq.com/s/Da27If5FczBUfhdw692eiQ
- Spring Bean 异步初始化改造:https://mp.weixin.qq.com/s/ZMIUXDc7yY64GDE70g3-kA
- Spring 在启动期间的类扫描为什么没有改成多线程增加启动速度:https://mp.weixin.qq.com/s/uCCewrN_98DjD0TnIYUKpg
- ① 目前不可能异步的对 bean 进行后置处理;② 时间都花在少数几个相互依赖的特定 bean 上。引入并行化,在很多情况下并不能节省多少,因为这并不能加快关键路径。这通常与 ORM 设置和数据库迁移有关。③ Spring 以后的努力方向是 AOT,提前编译(Ahead-of-Time Compilation);④ more pragmatic approach, abandon modifying core logic.
- Spring Cloud Sleuth 框架详解:https://blog.btstream.net/post/2019-01-14-spring-cloud-sleuth-2.0 概要使用说明
- Spring Cloud 的版本命名规则:https://blog.csdn.net/Thinkingcao/article/details/108362819
- MyBatis 中 10 种常用写法:https://mp.weixin.qq.com/s/xPM8qarnZuoHGXFA8vfG4A
- Netty 经典 32 连问:https://mp.weixin.qq.com/s/iMEgT4GPtl12gAcUN16-Yw
微服务
- 微服务的优缺点之争:https://juejin.cn/post/7288963205992792127
- 让复杂程序可以持续交付和持续部署:将大团队开发复杂应用程序所带来的代码冲突、业务逻辑冲突和部署冲突降至可控范围,使其具备持续交付和部署能力。
- 提高应用容错性:由于硬件资源耗尽导致故障的时候,通过合理的降级、限流、熔断策略,配合上微服务天然的进程隔离特性,具备更好的容错性。
- 可以使用不同的架构:微服务的拆分,使得系统整体的服务可以使用不同的技术架构,在技术的选型上更具备灵活性。
- 微服务的悖论:① 更利于维护(局部复杂度降低了,但是系统整体、上下游的复杂度确是提升了)② 解决性能瓶颈(服务拆分最后映射为机器扩容,实际上是机器扩容提升性能)③ 简化部署(涉及的服务数更多了,还牵扯到上下游的部署顺序)④ 更好的复用性和组合性(这个特性更依赖于开发人员编写的接口)⑤ 微服务可以和组织架构相匹配(微服务诞生之前的大团队问题)
- 从软件复杂度去了解 DDD:https://mp.weixin.qq.com/s/4NWIxMVe2TDda45tUxUhYg
- 阿里 DDD 从入门到代码实践:https://mp.weixin.qq.com/s/HMLpjcE0UENUTfMK0Z9n8A
- MVC 到 DDD 解决的问题:https://juejin.cn/post/7251552456080916535、https://zhuanlan.zhihu.com/p/641299096
- DDD 领域驱动设计详解:https://blog.csdn.net/qq_41889508/article/details/124907312
- 淘宝 DDD 系列文章:https://mp.weixin.qq.com/s/DAiGCgE0ZdBRw_ckhD8AQA
- DDD 解决了什么问题:https://mp.weixin.qq.com/s/khJO8H4m-NvhFtA5oHe0tQ
- Spring Cloud 全家桶图解:https://mp.weixin.qq.com/s/9agjq1WmBScp-vqqAzoksQ
- Spring Cloud 基本概念:https://mp.weixin.qq.com/s/a2Ogh14qbn9j_iW4txN9RQ
- OpenFeign 常见问题:https://mp.weixin.qq.com/s/lrL3eSBNII3qopLTVJ_DAA
- SPI 扩展机制的使用:https://mp.weixin.qq.com/s/5yV0b7dI6FDIe3cFPHYcKg
- Eureka 心跳机制的服务续约:https://blog.51cto.com/u_14014612/6007959
- 微服务网关的使用:https://mp.weixin.qq.com/s/0MGE2BR4bERn-R16_Amhkw
- Spring Cloud Gateway 的基本原理:https://mp.weixin.qq.com/s/0RPAcBS6Z78wymoekQ2FkA
- Nacos、OpenFeign、Ribbon、loadbalancer 组件协调工作的原理:https://mp.weixin.qq.com/s/NKSlSfHsO-tr5UFJqRy_pQ
- 微服务 33 道面试题:https://mp.weixin.qq.com/s/S0fwzcy5F75Q08csfLO1IQ
安全
- Cookie、Session、Token 相关:https://mp.weixin.qq.com/s/wB00GWeo66rSyLDgA-MKfw
- API 加签和验签:https://juejin.cn/post/6854573210411892749
- API 的安全设计:https://blog.csdn.net/qq_43103529/article/details/126798025
问题解决
- 线上 OOM 问题的解决方案:https://mp.weixin.qq.com/s/HvO_Cdd8uoZSWHh56MJnLg
- MySQL 主从同步异常的排查:https://mp.weixin.qq.com/s/_cUsG7iX9iJMnG8DSpiN5Q
- RocketMQ 消息丢失的排查:https://mp.weixin.qq.com/s/fuMJy04quQD8DRyX0Wy_2Q
- 序列化前端 JSON 多传值报错的解决方法:https://blog.51cto.com/u_15236724/5369505
- Jackson 忽略未知属性的解决方法:https://mp.weixin.qq.com/s/qd2ZkL-QgeQ_hxm2xUfohA
- 接口响应时间过长的排查和解决思路:https://juejin.cn/post/7108873657589432328
- Spring Boot + Redis 实现延迟双删:https://mp.weixin.qq.com/s/r64ddm5XTu7-ohWLSxCGqg
项目设计
- 复杂业务系统的通用架构设计:https://mp.weixin.qq.com/s/eSeiusZfOWW0Jfr0fAuWXg
- 架构的本质:整体 + 规则 + 通信 = 架构。根据不同侧重点,架构主要可以分为业务架构、应用架构、技术架构。
- 架构在设计时主要需要考虑功能性因素和非功能因素。功能性因素主要指的是对功能性需求的满足和业务支持,这是在设计架构时的首要考虑。非功能因素主要指的是架构的可用性、可靠性、扩展性、治理能力、响应性能等。
- 复杂系统在进行分析的时候,根据 DDD 的分析方法,主要步骤有确认角色;确认角色功能;确认问题子域;确认模型、事件、归属;确定界限上下文。
- 复杂系统遵循的设计原则,主要有:识别核心问题、化繁为简、统一语言、长期价值。
- 项目设计方案的书写:https://mp.weixin.qq.com/s/HoQuwu8K7NcKA-xgPL_mfg
- 一份完备的技术文档,主要包括方案的背景、目的、用例图、时序图、流程图、状态图、数据库设计、接口文档、总结、检查清单、性能要求,这些内容还会根据不同的组织要求有所调整。
- 支付系统设计方案:https://mp.weixin.qq.com/s/IMTV462-UGgLcpxnaVT8AQ
- 订单流转的状态模式:https://juejin.cn/post/6965338832220717064
- 订单流转的状态机实现:https://juejin.cn/post/7207410405786255420
- 订单防止重复支付实现:https://juejin.cn/post/7121554911229116430
- 订单系统万能通用设计方案:https://mp.weixin.qq.com/s/39z-86wogSB2A1M6qGzOXQ
- 短链接系统的设计:https://mp.weixin.qq.com/s/HgPs1yJDxu9_NOY86XOIWw
- MySQL 线上数据平滑扩容:https://mp.weixin.qq.com/s/Sop5bxyWNWPq5ANF6fQ6yA
- MySQL 数据双写 ES 方案:https://mp.weixin.qq.com/s/-srzkEGr5uxyWw_OBk6dQg
- 二维码扫码登录的实现原理:https://mp.weixin.qq.com/s/gzsZe9PISA94sHH-DjvsAA
- Ali 订单超时关闭解决方案:https://mp.weixin.qq.com/s/OmbyxkufVm-XzwIv_A514w
- 大批量数据导入导出优化:https://mp.weixin.qq.com/s/HyuAMdZjTZPZzI9exjA5yg
- 海量用户系统的设计,针对用户表:https://mp.weixin.qq.com/s/3shbv9ivs1aFSNMDVqGDIA
- 秒杀场景如何通过 Redis 减库存:https://mp.weixin.qq.com/s/F37Nu2v5pKAYHCLyPSID8w
- Redis 队列实现 Java 版的秒杀系统:https://mp.weixin.qq.com/s/McsaOgVyyePiQuF68jmcMA
- Spring Boot 实现接口幂等性的 4 种方法:https://mp.weixin.qq.com/s/Be2Vk3hfGPfkPX8zw62G3Q
- SpringBoot + Elasticsearch 7.6 实现简单查询及高亮分词查询:https://mp.weixin.qq.com/s/AAyjDg1eNfgAtWdplRITZQ
- 接口防重的设计与代码实现,Redis + 注解实现:https://mp.weixin.qq.com/s/ZpwomffAnwqADZLKtSzdmg
- Redis 实现库存扣减操作:https://mp.weixin.qq.com/s/mbQ506ywhF1HYWsc6cLl5w
- 松耦合式的权限控制设计:https://mp.weixin.qq.com/s/QfaW-HpitTdaa9xb1HN6iQ
- Spring Boot + minio 实现高性能存储服务:https://mp.weixin.qq.com/s/UmqnuwmxkTrcEPmIGMG1aA
- Spring Boot 实现万能文件在线预览:https://mp.weixin.qq.com/s/AJCSqy5kOjjiCgg69cK_MA
- 支付系统架构设计以及对应实现:https://mp.weixin.qq.com/s/54hZpwW7-yivpv1dd0V0iw
- 开源支付系统的设计以及实现:https://mp.weixin.qq.com/s/7Xa2hHdBIcunVbDJWItw2Q
- JWT 实现登录认证 + Token 自动续期方案:https://mp.weixin.qq.com/s/WH_RSsJE4bFoLxiCA_NhlQ
- 优雅的实现 Spring Boot 异步线程间数据传递:https://mp.weixin.qq.com/s/OjVWL3UToU88Sg3jbTIB3g
- 电商系统运营活动功能设计:https://mp.weixin.qq.com/s/PlvI_uHPWwzZCH4kbVcAsQ
- 微服务鉴权实现设计:https://mp.weixin.qq.com/s/ixBQTIWzjp4dxMPOhe0Low
- 本地多节点缓存刷新方案:https://juejin.cn/post/7003161151492079646
- 使用 RabbitMQ 的广播模式,使用交换机绑定队列,而队列在每一个服务节点启动后都生成一个唯一队列和交换机绑定,这样就实现了当发现消息给交换机,会有多个不同的队列对消息进行处理。
- 每当一个节点发生缓存刷新,则可以将这些消息传递给集群中的其他节点,实现缓存、配置等信息的刷新。
- 分布式中灰度方案设计:https://mp.weixin.qq.com/s/z2ZB15DN_hgiw6sY0R7O3w
- 百亿订单的调度方案:https://www.toutiao.com/article/7205946675146326540
- 主要针对订单流程中的超时场景做调度,买家支付超时、商家发货超时、买家收货超时等场景中,海量订单的调度方案。delayQueue:单机,占用内存大;RocketMQ:RocketMQ 5.x 版本已经从延迟消息变成了支持秒级定时消息,时间轮原理。
- 电商平台取货码系统设计方案:https://mp.weixin.qq.com/s/uCzc_mDkt2cZZkbCLGLuUQ
- 订单号码远大于取货码号码,如何做订单级别的映射;文章介绍了库表的编号做取货码末尾的方法,单表内的重复,可以直接使用重试解决。
- 门店唯一和全局唯一的思考不错。但实际上现在的业务场景已经不是这样取货了,都是用取货机扫描包裹,取货码只是为了方便检索,所以门店唯一即可。
- 保证未核销的取货码唯一,极大降低了难度,避免取货码膨胀。
- 查询未核销的取货码是否存在,根据查询结果执行插入操作,因为不是原子性存在并发安全,使用分布式锁保证安全。
- 库存系统架构设计与实践:https://mp.weixin.qq.com/s/tABKHwoN6PCaB5UT7OaoDQ
- 微信红包的架构设计简介:https://www.zybuluo.com/yulin718/note/93148
- 微信/字节百亿级超大流量红包架构方案:https://www.toutiao.com/article/7211008331404657204
- 加密后的敏感字段如何模糊查询:https://mp.weixin.qq.com/s/O77aP4767wfGWURt_Andgg
- 先解密再查询:适用于数据量少的情况下,占用内存和 CPU 资源会比较多;
- 明文映射表:这种情况等于加密效果很差,基本不使用;
- 数据库层面解密查询:对查询出来的数据在数据库层面解密再模糊查询,即
select * from sys_person where AES_DECRYPT(phone,'key') like '%0537
。缺点是无法使用索引来优化查询,且无法保证加解密使用的函数是同一种; - 分词密文映射表:新建一张分词密文映射表,在敏感字段数据新增、修改的后,对敏感字段进行分词组合,再对每个分词进行加密,建立起敏感字段的分词密文与目标数据行主键的关联关系;查询时对模糊查询关键字进行加密,用加密的结果对分词密文映射表进行模糊查询,得到目标数据行的主键,再以目标数据行的主键为条件返回目标表进行精确查询;
- 互联网大厂对用户敏感数据加密后支持模糊查询的方案基本如此。淘宝密文字段检索方案:https://open.taobao.com/docV3.htm?docId=106213&docType=1;拼多多密文字段检索方案:https://open.pinduoduo.com/application/document/browse?idStr=3407B605226E77F2;京东密文字段检索方案:https://jos.jd.com/commondoc?listId=345
设计模式
- DDD 的详细介绍:https://blog.csdn.net/qq_41889508/article/details/124907312
- DDD 领域驱动设计中的贫血与充血:https://juejin.cn/post/6917125801460629518
- 设计模式汇总以及设计原则介绍:https://blog.csdn.net/LoveLion/article/details/17517213
- 23 种设计模式详细介绍:https://blog.csdn.net/qq_41889508/article/details/105953114
- 美团设计模式使用场景讲解:https://mp.weixin.qq.com/s/H2toewJKEwq1mXme_iMWkA
- 责任链的使用场景:https://mp.weixin.qq.com/s/el8lnX7oZasjxAHMtveYaA
- 设计模式综合讲解:https://mp.weixin.qq.com/s/409QGKe5H7tCP1qpCiY_KA
- 设计模式的实际项目运用:https://mp.weixin.qq.com/s/VcgHMvf5PcPcEU0zA7AU8g
- 设计模式的优雅使用:https://mp.weixin.qq.com/s/SeQsoW_zfO9jfGu6b_EQlg
- 责任链模式配合 Spring
@Order
注解使用场景:https://blog.csdn.net/a232884c/article/details/128628557 - 枚举策略模式的问题:https://mp.weixin.qq.com/s/GFjGoCv86blNqPEfyyAgMg
- 阿里责任链模式的运用:https://mp.weixin.qq.com/s/R-Umnq8T1JrxtgpZQCK4Iw
代码编写
- 编码的艺术:https://mp.weixin.qq.com/s/ncD820nA4InBxgCcyGnMnQ
- 编码要有工程师精神:应该对自己写的代码负责、应该对自己写的代码有成就感。
- 日常编码要注意提高代码的可读性,简洁的代码更易于理解、测试和维护。
- 不同编程语言中命名的问题如何解决:https://mp.weixin.qq.com/s/loaaKlE44P4VxMgLY3f2hw
- Java、C++、Go 语言在程序中命名的问题,好的命名应该具有的特性:清晰明了、有明确含义、无二义性、尽量简短。
- 各种语言下命名的一致性,对于各种语言来说都有自己习惯的风格,提供了可供参考的常用命名词典。
- 阿里开发在命名上的建议:https://mp.weixin.qq.com/s/q0yZPEcOhsNUqdYaBsLm8g
- CRUD 简单数据表的通用工具:https://juejin.cn/post/7197237024972144697
- Redis 的优化措施:https://mp.weixin.qq.com/s/nNEuYw0NlYGhuKKKKoWfcQ
if-else
多层嵌套的代码重构技巧:https://mp.weixin.qq.com/s/K8gmCqYuLyvJUICmlNM8tQ- Optional 类实现优雅判空:https://mp.weixin.qq.com/s/oTOyMsvNVoPqFiHJDPiskw
- 计算无限不循环的浮点数的问题:https://mp.weixin.qq.com/s/vQDBK06wVl-tjvVsktnR4w
- 常见的代码重构技巧:https://mp.weixin.qq.com/s/D8B4jgRo7NY4UkY9-QraLA
- 浮点数的设计以及使用注意事项:https://mp.weixin.qq.com/s/GvJiI122aCpYJDfGPCENXA
- 统一返回格式的设计:https://mp.weixin.qq.com/s/pXpUwkXLkR20gJ6vSp-Xsg
- 前后端超大整数的返回问题:https://blog.csdn.net/weixin_44823875/article/details/130670135
- 前后端分别对应的 Java 和 JS 对于整数的取值范围并不完全对应,所以需要将超大整数处理成 String 字符串的形式。但是在修改返回值的时候,并不仅局限于超大整数,为了使得前端数据类型一致,通常会将所有的 Long 类型数据都做一层转换。
- 通过使用 ToStringSerializer 将超大整数字段在序列化时转换为字符串。
- 自定义 Serializer,可以继承 JsonSerializer 类,并重写 serialize 方法。
- Lombok 消除 CheckedException 的
@SneakyThrows
注解:https://juejin.cn/post/7036340463237857316 - BeanUtils 的 CopyProperties 方法:https://mp.weixin.qq.com/s/k7FsVu9SjP7r3ONmomstog
- 参考优秀开源软件中类的命名,做到见名知意风格统一:https://mp.weixin.qq.com/s/UpHad3ktiB_bBuek5v5nmA
- Git 使用的坏习惯,倡导在使用 Git 时需要多次 Squash,尽量减少 Git 仓库尺寸:https://mp.weixin.qq.com/s/6sC8evIQ7AZBWwJFRi6mww
- Guava 对 Map 的一些封装扩展操作:https://mp.weixin.qq.com/s/Bkf9Ic2uB-CqvbOGEc-mWQ
- 如何开发一个 IDEA 插件:https://mp.weixin.qq.com/s/io_0tUyKEzIYmPONkFyRtg
- Retryable 循环重试注解:https://mp.weixin.qq.com/s/BHs7O1zlGMC6hFa0AbeznQ
- 动态规划的详细介绍:https://mp.weixin.qq.com/s/hzMsN8qvL5FjfSA_IaeDbw
- 业务代码的编写要素:https://mp.weixin.qq.com/s/GJRXcVxhg2F9Yp5KPoCwOQ
- 业务开发中,更强调代码的可读性,而不是技术性、优雅性。
- 注意软件工程中的破窗效应。破窗效应指的是在软件开发过程中,如果存在低质量的代码或设计,如果不及时修复,就会导致其他开发人员也采用同样的低质量方案。
- 阿里使用的代码管理方案 AoneFlow:https://mp.weixin.qq.com/s/5z5XloUsWbtxP-w7tZa4fw
- ① 开始工作前,从主干创建特性分支;② 通过合并特性分支,形成发布分支;③ 发布到线上正式环境后,合并相应的发布分支到主干,在主干添加标签,同时删除该发布分支关联的特性分支。
行业知识
- 时间日期相关的问题:https://www.yuque.com/wangxiaocuo/coding-blog/byutcl4u957cdvsx
- 开源许可证入门手册:https://mp.weixin.qq.com/s/lGpak9KHWwQDEl8LJ0tpQw
- 各种开源软件协议介绍:https://mp.weixin.qq.com/s/L-jSuAHbnkG9QscN0cuXYw
经典题目
- 小红书 2 年后端面试题:https://mp.weixin.qq.com/s/foWCdRRnpg4ASCx_u3M1Fg
- 腾讯云后端面试题:https://mp.weixin.qq.com/s/OFl_wxxEky2uq52Ech2-mA
职业成长
- 构建个人成长路线图:https://mp.weixin.qq.com/s/UWXxz03AevZrI1qNfC7WZA
- 技术开发的思考与要做的事情:https://mp.weixin.qq.com/s/ikmGL6P3ywoeWE41dYI_Rw
- 日常开发提升技术的一些建议:https://mp.weixin.qq.com/s/-_BPcK80QIPYBp-g79w9MA
- ① 打好基础,深入学习语言特性;② 熟悉日常开发中使用到的工具;③ 总结日常工作中踩过的坑;④ 阅读项目中优秀的代码和设计文档;⑤ 总结一些通用的技术方案;⑥ 参与技术讨论,积极技术分享;⑦ 有 owner 意识,积极攻克项目难题;⑧ 思考项目中可以提升效率的地方;⑨ 熟悉业务,提高自己的核心竞争力;⑩ 查看系统中可能存在的问题,比如接口耗时、慢 SQL,进行优化;⑪ 学以致用,将理论知识运用到实际项目中;⑫ 阅读一些优秀的源码设计;⑬ 多编码、少偷懒,养成编码的好习惯。
- 程序员怎样才算是在写有技术含量的代码:https://mp.weixin.qq.com/s/gqO4GaVwWcZ81GPxrXxdLQ
- 试用期总结参考:https://mp.weixin.qq.com/s/jH5-8_xco0hTi5bQfT2t7w
- 实习生和试用期的一些注意事项:https://mp.weixin.qq.com/s/pgO8d06-3vm-CaRNZNY-_w
- 实习和试用期,更在意候选人的技术基本功和技术思考力。
- 在面对“不就是使用了一个依赖包”这种质疑时,应该:① 最有技术含量的工作确实是用 XX 包实现,但不是有了这个包才有的方案,而是我们制订了方案,这个包满足我们的诉求,可以节省我们的时间才被用到;② 我们不仅仅是解决了 xx 问题,还考虑到了 xx 等方案,这是一个完整的、考虑周到的技术方案升级过程;
- 不是要大家学习套路,而是说没有来龙去脉的规划会让人疑惑。在讲规划的时候,考虑:① 为什么会这么想,为什么有这样的规划;② 达到这样的目标后会怎么样,对团队、业务的影响是什么。
- 不要以新人心态看待问题:Everybody matters, every step counts.
- 职场个人成长、心态和沟通:https://mp.weixin.qq.com/s/LI5h8U6j1E4KudZUw6dHYw
- 重复工作中如何培养匠心:https://mp.weixin.qq.com/s/nG51m27twdv43FAiFSlQSA
- 更多关注工作,尽管是重复工作,可以从需求看结果、从过程看工作、从可预测性看结论,培养对于重复工作的更多可能性,从细节处看能力,从重复中看匠心。
- 对技术工作来说,尽可能提供价值空间高、过程对价值贡献高、可预测性低的机会,避免开发者对于技术工作的倦怠,可以更好地激发大家的创造性。
- 技术人对抗焦虑的加减法:https://mp.weixin.qq.com/s/7sruMfQDMzmej2DFTP6Fiw
- 软件研发的道德情操以及同理心:https://mp.weixin.qq.com/s/_qfcoB0lKkdk8RA1cMlroA
- 技术开发的述职与自我审视:https://mp.weixin.qq.com/s/DjJVcX9h4J1d2YNQaOsj-w
- 工作中发挥个人能力的不同层级:https://mp.weixin.qq.com/s/R8RibpWnYSN7G6_qm2PDng
- 技术服务业务,业务驱动产品价值。做好业务需求是工作的最低要求,更多的是对个人能力的要求。
- 利用自己的技术去发掘业务的可能性,解决业务上的瓶颈或者挑战。要做到这个高度需要有足够的积累,要再技术上兼具深度的同时扩展广度,在团队协作项目推进上还需要更积极的主动性和协调能力。
- 做好本职工作,完成好交付任务的同时,不设边界,积极拓展自身的可能性。这一层要求我们具备更全面的技术规划能力。从需求交付到技术优化再到技术规划,从帮别人干活到给自己找活干再到找活给一批人干。这是格局的变化,是做事角度的改变。整个过程中始终考虑的还是公司利益,团队价值。
- 爬楼梯还是等电梯(确定性与不确定性的考量):https://mp.weixin.qq.com/s/P3rqm27IRUgSsvN2eJBkdg
- 焦虑,是来自于未来的不确定性,以及对自己的不满意。我们往往把“别人贩卖的焦虑”(PUA、35 岁危机)强加到自己的感受中,这种内耗不断反噬着我们的专注力(原本可以用来真正提升自己)。
- 近些年来,内部晋升等待成本高,不确定性也高(类似于等电梯);跳槽比较累,适应成本高,但是确定性高(类似于爬楼梯)。
- 打工人如何避免内卷:https://mp.weixin.qq.com/s/O7Wkyu1D8xyZ34Lns9muNA
- 要尽早想好自身的价值,全情投入自身价值的增长,而地位和金钱只是中途顺带的事情,没有达到这方面的目标也无所谓,社会最终也会给予认可的。
- 内卷和恶性竞争是零和游戏,成为自己才是正和游戏。成为自己需要极强的独立思考能力。这一点可以反思自己在人生所有关键节点中做出的决策,到底是自己真正调研思考得出的结论,还是随大流。
- 用自己最擅长的方式创造价值,并且通过最适合的杠杆去放大价值。
- 成为自己,参与正和游戏。适当放弃对外部事物的欲求,才有可能持续保持平和的心态。
- 程序员如何阅读源码:https://mp.weixin.qq.com/s/9kfVzG5nN9WZ7tW3Eo6_Nw
- 阅读源码是程序员的必备技能之一。只会调用 API 对于日常工作来说,还远远不够。看懂别人的代码是怎么写的,对于我们的编码能力、设计能力、架构能力都有极大提升。
- ① 读哪些:确定阅读范围,包括代码本身、开源组织、各种开源社区;② 看文章:找准主题,总结优缺点、适用场景;③ 写单测:运行程序主线找体感,再打断点看代码抓细节;④ 出总结:和类似的框架、已掌握的知识类比,提炼出其中设计比较优良的点,最后对于没掌握细节,再读一次源码。
职场
- 职业选择:https://mp.weixin.qq.com/s/UXCW9JQ2b4eGi0vBmDFBuQ
- 工作怎么选都难免遗憾,知道现阶段自己需要什么,选择一份工作,首先做好,然后熬下去。
- 工作中 99% 的问题都无法靠辞职来解决,称心如意是妄想,不顺遂才是现实。
- 坚持自己心中所想,问题都要一个一个解决,委屈都要自己一个一个消化。
- 职场中沟通协作原则和方法:https://mp.weixin.qq.com/s/Ivb-nXdSN1A88yWjNRaOTA
其他
- 新概念防御性编程:https://www.oschina.net/news/269949/unmaintainable-new-defensive-programming
- 主要描述在团队开发的项目中编写难以维护的程序的手段,主要包括奇怪的命名、复杂的操作、自立门户、混淆 Git 提交记录等。这些都是不值得提倡和需要在团队中禁止的手段。
- 使用 IDEA 远程 debug 项目中的代码:https://blog.csdn.net/w8y56f/article/details/116493681
- 如何挖掘项目中的亮点:https://juejin.cn/post/7160855610668351525
- Mac 编程需要的工具和技巧:https://www.zhihu.com/question/27617980/answer/919642075
- Lombok 的使用以及介绍:https://www.51cto.com/article/718519.html
- 敏捷开发的日会:https://www.cnblogs.com/Apluemxa/p/17647371.html
- 业务开发要会的架构思维:https://mp.weixin.qq.com/s/0I9FxcIwJTic9NzlNL-rnQ
- 系统搭建的前期准备:https://mp.weixin.qq.com/s/_cSlQxfEu3gDL70BCB0QsQ
- 接口文档设计的 12 个注意点:https://mp.weixin.qq.com/s/hHXmvTbS1sy_yJRHztofxQ
- 技术详细方案设计模版:https://mp.weixin.qq.com/s/eeueVqqG5m0wYdkA6uR3oA
- 关于软件复杂度的困局:https://mp.weixin.qq.com/s/nbFrkTRlXULzPXIlIkyEPA
- 从软件复杂度的角度去理解 DDD:https://mp.weixin.qq.com/s/4NWIxMVe2TDda45tUxUhYg
- 阿里的老系统如何重构:https://mp.weixin.qq.com/s/yUXYQLZ6RY-Z2b1oM9RKbQ
- 淘宝营销技术体系:https://mp.weixin.qq.com/s/iLCx14zpLKDrUygcsOL7GA
- 全链路压测,影子库和影子表:https://mp.weixin.qq.com/s/QuKImNSi8zdHfyFmaCl92w
- 各种第三方数据常用的 API 接口:https://mp.weixin.qq.com/s/Wt4BT5Qj7-9IhOs9bpczJQ
- Git 操作场景以及解决方案:https://mp.weixin.qq.com/s/xkHBW2IG9ZL0RgvXgH70BA
- Vim 编辑器常用命令:https://mp.weixin.qq.com/s/PgOsqmi7lykeWIW0zrTgcw
- 泛 955 公司名单:https://mp.weixin.qq.com/s/CU2qP9KBXkKy7dZ6O582Aw
- 淘宝用户体验分析方法论:https://mp.weixin.qq.com/s/bvFXUhTwxtE_eKaQ2eu6pQ
- 算法工程师取得结果的过程:https://mp.weixin.qq.com/s/C-hSlnezwWxkUaFr9duZgA
- 走过低谷,先立信念。面对复杂性和不确定性的工作时,要坚定信念。
- 从学识积累入手,从业务入手,坚持要事第一。要有技术规划,避免技术债。