后端 | 阅读列表

194 阅读40分钟

Java

Golang

PHP

  • PHP 中 foreach 引用的坑:blog.csdn.net/qq_36025814…
    • PHP 中 foreach 循环中使用的单个元素变量(比如 value),在循环结束后仍然会保留,如果不销毁且下次循环仍然使用相同的变量名,将会导致下次循环的结果不正确。
    • 数组最后一个元素的 $value 引用在 foreach 循环之后仍会保留。建议使用 unset() 来将其销毁。

计算机基础

数据库

  • MySQL 设计规约:mp.weixin.qq.com/s/XC8e5iuQt…
  • SQL 语句大全:mp.weixin.qq.com/s/HhCxT6VL8…
  • SQL 优化通用模版方法,重点:mp.weixin.qq.com/s/AThItVhGt…
  • MySQL 日志详解:blog.51cto.com/u_15891990/…
  • Like 是否走索引:www.bmabk.com/index.php/p…
  • SELECT * 是否会全表扫描:mp.weixin.qq.com/s/oHBuUZCyq…
    • SELECT * 全表扫描,是因为 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 来强制走索引。
  • 索引常见八股文:juejin.cn/post/719368…
  • 1.5 万字 + 30 张图盘点索引常见的 11 个知识点:mp.weixin.qq.com/s/VJ5QWJ-2z…
    • 全表扫描成本计算:这个表大致有多少条数据 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 会选择成本最低的索引来执行。
  • MySQL 的索引下推:mp.weixin.qq.com/s/iQnArUNIs…
    • 索引下推 Index Condition Pushdown 是 MySQL 5.6 的新特性。索引下推会判断 WHERE 条件部分能否用索引中的列来做检查,条件不满足则处理下一行索引记录;条件满足,使用索引中的主键去定位并读取完整的行记录(回表)。回表之后,存储引擎把记录交给 Server 层,Server 层检测该记录是否满足 WHERE 条件的其余部分。
    • 没有索引下推的时候,在不满足最左前缀匹配原则、索引断裂的时候,回表之前不会判断后面失效的索引是否满足条件。这样的查询中回表的数据量就会更多,索引下推解决了这个问题。
    • 索引下推的使用条件:① 只能用于 range、 ref、 eq_ref、ref_or_null 访问方法;② 只能用于 InnoDB 和 MyISAM 存储引擎及其分区表;③ 对 InnoDB 存储引擎来说,索引下推只适用于辅助索引。
  • 数据库锁常见八股文:mp.weixin.qq.com/s/VEU5p85aT…
  • MySQL 加锁规则的 4 个原则:mp.weixin.qq.com/s/HM0FiF3NF…
  • 数据库优化 8 大通用技能:mp.weixin.qq.com/s/0_Arz-KO3…
  • MySQL 优化的 5 个维度:mp.weixin.qq.com/s/pedyd3F5v…
  • MySQL 普通面试题:mp.weixin.qq.com/s/2KXSrJ5s6…
  • InnoDB 的 RR 有没有解决幻读:mp.weixin.qq.com/s/Pm6PQEYwS…
  • SQL 优化的常见问题:mp.weixin.qq.com/s/SBKlxcTK_…
  • SQL 优化的 15 个小技巧:mp.weixin.qq.com/s/UJJYMd2a5…
  • SQL 优化 + 思维导图:mp.weixin.qq.com/s/epQM3QgAj…
  • MySQL 事务底层原理:mp.weixin.qq.com/s/pkJb_9mdd…
  • MySQL 事务四大隔离级别:mp.weixin.qq.com/s/r5F8w4N90…
  • MySQL 表设计经验准则:mp.weixin.qq.com/s/sSsZ-w6Wz…
  • MySQL 索引和 B+Tree:mp.weixin.qq.com/s/cuug8a6Qj…
  • MySQL 各种锁总结,内容较少:mp.weixin.qq.com/s/JAgykU8cS…
  • MySQL 单表数据量为什么不能超过 2kw:mp.weixin.qq.com/s/vXS5Bxcxq…
  • MySQL 的 null 值怎么存放:mp.weixin.qq.com/s/sqW51yqeA…
  • 慢 SQL 如何拖垮数据库:mp.weixin.qq.com/s/XmPdG7E8x…
  • MVCC 的介绍以及原理:segmentfault.com/a/119000003…
  • MySQL 主从同步延迟如何解决:zhuanlan.zhihu.com/p/361789345
  • MySQL 慢查询的 12 个原因:mp.weixin.qq.com/s/gz-wQPsae…
  • MySQL 为什么建议小表驱动大表:mp.weixin.qq.com/s/5wZfZDoVT…
  • SQL 优化思路 + 经典案例分析:mp.weixin.qq.com/s/BbrLQWGYl…
  • ClickHouse 的简单介绍:mp.weixin.qq.com/s/9GxOcL66O…
    • 数据库分为 OLTP(关系型数据库)、OLAP(仓库型数据库)两种,ClickHouse 属于后者。相比 MySQL,ClickHouse 是一种列式数据库,这为他带来了很多的性能提升。
    • ① 查询的时候只需要读取对应的列,而非整行的数据读取,减少 IO 消耗;② 针对整列的数据存储,同列同类型有 10 倍压缩提升,进一步降低 IO;③ 根据不同数据存储场景,做个性化搜索算法优化。
  • 分布式数据的介绍:zhuanlan.zhihu.com/p/503180808
    • 分布式数据库主要相对传统数据库,提供了海量数据存储、解决分库分表痛点、高可用容灾的能力。分布式数据库利用多副本带来的横向扩展、分布式一致性算法解决了这些问题。
    • PG-XC 风格:每一个数据节点依然是单体数据库,通过主从复制来实现高可用,再加上额外的调度节点实现分片路由、全局时钟实现分布式事务。GaussDB、TDSQL、GoldenDB 等。
    • NewSQL 风格:每个组件都采用分布式设计,底层存储多采用键值 KV 系统,同时引入多数派选举算法实现多副本同步,存储、计算、调度完全分离。TiDB、OceanBase 等。
    • 传统的分库分表架构不断演进,增加了协调节点,全局时钟,就演变成了PGXC架构,这是主流分布式数据库的一个分支。在基于 BigTable 键值数据库的基础上增加事务支持,就演变成了 NewSQL,是分布式数据库的另一个分支。
  • 分布式数据库的结构:zhuanlan.zhihu.com/p/341038587

Redis

  • 先更新缓存再更新数据库:同样会造成数据不一致的情况发生。

  • 先删除缓存再更新数据库:下面这种情况仍然会造成缓存数据不一致。

  • 先更新数据库再删除缓存(Cache Aside):缓存不一致。

  • 重试机制(缓存双删):可以在一定程度下缓解缓存不一致问题。

  • 订阅 MySQL Binlog 再操作缓存:稳定可靠,但是会增加运维成本。

分布式

  • 字节跳动对分布式锁的详细介绍:blog.csdn.net/ByteDanceTe…
  • 分布式锁的多种实现:mp.weixin.qq.com/s/Wj313x5Tt…
    • 主要有数据库、Redis、Zookeeper、ETCD 这几种实现方式。一般实际生产中,因为性能问题不使用数据库锁。
    • Zookeeper 实现分布式锁用的是临时顺序节点。在 Locks 节点下,各个客户端会判断各自当前是否为最小的节点。如果自己是当前最小的临时顺序节点,则获得锁;否则向前一个临时节点注册 Watcher 事件,用来监听前一个节点是否还存在,也就是说如果获取锁失败将进入等待。
    • Zookeeper 实现的分布式锁,删除节点分为正常业务执行完毕和异常故障两种情况。① 正常业务执行完毕之后,当前客户端会向 Locks 节点显示调用删除指令。② 如果是客户端异常故障,根据临时顺序节点的特性,节点将会在一段时间之后自动删除。这两种情况下,删除了当前的节点,下一个节点将会自动获取到这个锁。
    • Zookeeper 实现分布式锁简单易用,只需要利用临时顺序节点的特性,前向注册监听器。但是,如果频繁请求加锁、删除锁,也会对 Zookeeper 集群带来较大的压力,这也是它不如 Redis 的地方,支持的并发量不如 Redis 高。
  • 分布式事务的详细讲解以及在京东的落地:juejin.cn/post/722652…
    • 主要详细介绍了 2PC、3PC 以及中间可能产生的一些问题。
    • 事务预提交:参与者接收到 PreCommit 请求后执行事务操作,并将 Undo 和 Redo 信息记录到事务日志中,同时锁定当前记录。
  • 分布式事务 2PC 理论:www.jianshu.com/p/1aa944f44…
  • 高可用的 11 个关键技巧:mp.weixin.qq.com/s/MSaugX48y…
  • Spring Boot 实现接口幂等性的 4 种方案:juejin.cn/post/718025…
  • 13 种锁的实现方式:mp.weixin.qq.com/s/AOshaWGmL…
  • Docker 的详细介绍:mp.weixin.qq.com/s/sd8jeD3oB…
  • Redis 和 MySQL 保持数据一致性:mp.weixin.qq.com/s/zyuQMrOx1…
  • 分库分表或被分布式数据库取代:mp.weixin.qq.com/s/xqmJ7Bxlj…
  • 分库分表的 21 条准则:mp.weixin.qq.com/s/0RcS20lNo…
  • 分布式链路监控系统:mp.weixin.qq.com/s/3ONVrA2_U…
  • LVS 四种工作模式和十种算法:mp.weixin.qq.com/s/8PajH0VlG…
  • 四种经典限流算法讲解:mp.weixin.qq.com/s/_zOs2V1mu…
  • RocketMQ 的长轮询实现原理:mp.weixin.qq.com/s/U0jlW0K3K…
  • Google 二进制编码 Protobuf 实现原理:mp.weixin.qq.com/s/kfyTcs6xu…
  • 分布式 12 问,主要为分布式锁/事务:juejin.cn/post/720290…
  • Raft 协议,Leader Election 领导选举之后使用 Log Replicate 日志复制来达成一致性。脑裂现象发生时会发生退位 step down 且 Rollback 当前未提交日志。总体来说,Master Slave + Leader Election + Log Replicate 是 Raft 协议的核心。
  • 分布式系统的补偿机制:mp.weixin.qq.com/s/Hqam4EtW7…
    • 业务补偿:当某个操作发生了异常时,如何通过内部机制将这个异常产生的不一致状态消除掉。业务补偿的实现方式分为两种:回滚、重试。
    • 回滚操作:显式回滚:调用逆向接口,进行上一次操作的反操作,或者取消上一次还没有完成的操作(须锁定资源);隐式回滚 :隐式回滚意味着这个回滚动作你不需要进行额外处理,往往是由下游提供了失败处理机制的。回滚的实现,对于跨库的事务,比较常见的解决方案有:两阶段提交、三阶段提交(ACID)但是这 2 种方式,在高可用的架构中一般都不可取,因为跨库锁表会消耗很大的性能。高可用的架构中一般不会要求强一致性,只要达到最终的一致性就可以了。可以考虑:事务表、消息队列、补偿机制、TCC 模式(占位 / 确认或取消)、Sagas模式(拆分事务 + 补偿机制)来实现最终的一致性。
    • 重试操作:重试是我们认为这个故障是暂时的,而不是永久的,所以会去重试。重试策略主要有以下几种:立即重试、固定间隔、增量间隔、指数间隔、全抖动(random(0 , 2 ^ retryCount);)、等抖动(2 ^ retryCount + random(0 , 2 ^ retryCount);)。
    • ACID 和 BASE 是分布式系统中两种不同级别的一致性理论,在分布式系统中,ACID有更强的一致性,但可伸缩性非常差,仅在必要时使用;BASE 的一致性较弱,但有很好的可伸缩性,还可以异步批量处理;大多数分布式事务适合 BASE。在重试或回滚的场景下,我们一般不会要求强一致性,只要保证最终一致性就可以了。
    • 业务补偿注意事项:① 业务需要支持幂等性,有重试机制;② 业务流程高可用和稳定;③ 设计业务正向流程的时候,也需要设计业务反向流程;④ 业务方最好提供短期的资源预留机制,可以迅速将业务占用的资源释放及时回滚。

中间件

高性能

  • 业务接口响应太慢的处理方法:mp.weixin.qq.com/s/g-v1Jq6tz…
    • 使用 Arthas 中的 Trace 命令统计方法耗时:trace命令能主动搜索class-pattern/method-pattern对应的方法调用路径,渲染和统计整个调用链路上的所有性能开销和追踪调用链路。
    • 使用 trace 命令跟踪接口方法的性能:trace com.company.project.controller.HelloController methodName
  • 大事务问题如何解决:mp.weixin.qq.com/s/FyFcspKqC…
    • 大事务会带来哪些问题:① 并发数据不一致;② 加锁容易阻塞;③ undolog 事务日志性能问题;④ 并发数据库压力大。
    • 如何优化大事务问题:① 事务中禁止 RPC 远程调用;② 尽量使用编程式事务;③ 数据分批处理;④ 大事务拆分成小事务;⑤ 异步并行处理。
  • 大事务的解决办法:mp.weixin.qq.com/s/qSAGgY-f3…
    • 大事务带来的问题:死锁、锁等待超时、回滚时间长、接口超时、并发情况下数据库连接池被占满、数据库主从延迟
    • 少用 @Transactional 注解。@Transactional 注解是通过 Spring 的 AOP 起作用的,但是如果使用不当,事务功能可能会失效。@Transactional 注解一般加在某个业务方法上,会导致整个业务方法都在同一个事务中,粒度太粗,不好控制事务范围,是出现大事务问题的最常见的原因。可以使用编程式事务,手动执行事务。
    • 将 Select 查询方法放到事务外面。
    • 事务中避免远程调用,事务中避免一次性处理太多数据。
    • 非事务执行:非核心操作可以以非事务方法执行。
    • 异步处理:抽象出不重要的逻辑,或者非强依赖的逻辑,可以异步执行处理。
  • 软件设计杂谈:性能优化的十种手段:code2life.top/2020/08/15/…
  • 浅谈系统性能提升的经验和方法:mp.weixin.qq.com/s/Qk-T2SDJk…
  • 不可数循环 Uncounted Loop 碎片化 GC 避免 Full GC 的方式:mp.weixin.qq.com/s/he9Y3saAI…
  • 本地缓存优化方案:juejin.cn/post/684490…
  • 高并发系统设计的 15 个建议:mp.weixin.qq.com/s/PPA8Iw6K2…
  • 性能优化的常用方案设计:mp.weixin.qq.com/s/C2mxkDuIm…
    • ① 批处理:避免多次 IO;② 异步处理**:**不是必要的结果逻辑,放到异步逻辑中处理;③ 空间换时间:使用缓存,提前将数据拿到更近更容易获得的地方;④ 预处理:提前完成部分数据的计算;⑤ 池化思想:避免重复创建和销毁对象;⑥ 串行改并行:没有结果参数依赖情况下,多个请求并行执行;⑦ 锁粒度:选用合适的锁粒度;⑧ 避免大事务:避免大事务长期占用资源;⑨ 优化程序结构:减少重复执行和不必要的步骤;⑩ SQL 优化:避免深分页,进行 SQL 调优,添加合适的索引。
  • 接口性能优化的 15 种方案:mp.weixin.qq.com/s/0fkDbnd_Y…
  • 接口性能优化的常见方案:zhuanlan.zhihu.com/p/610756706
  • 性能优化的 10 个技巧:mp.weixin.qq.com/s/sTi8JUepF…
  • Java 本地高性能缓存实践:mp.weixin.qq.com/s/IFTLHliO1…
  • 提升 Spring Boot 吞吐量方法:mp.weixin.qq.com/s/jb7hi3WP9…
  • 分类树性能优化实战:mp.weixin.qq.com/s/qgkXz7aX6…
  • 项目接口请求合并,提高效率:mp.weixin.qq.com/s/4h4QjJjOI…
  • 阿里系统性能提升的经验和方法:mp.weixin.qq.com/s/Qk-T2SDJk…
  • 使用 GC 日志可视化工具进行 JVM 调优:mp.weixin.qq.com/s/CgXMvGDNq…
  • 口语化讲解数据库优化:juejin.cn/post/718644…
  • 高并发的项目中最重要的点:www.zhihu.com/question/42…
    • **如何优化单请求耗时:**单机环境主要是如何设计和改造系统架构,有可能涉及到 JVM 的参数优化、各种依赖是如何选型,过程中积累了哪些选型和优化的方式;
    • **如何提高单机并发能力:**在业务中,单机并发能力受限于哪些关键点,这里主要的挑战点是单机的限制条件以及单机资源的竞争,如何设计克服的,过程中积累了哪些设计原则;
    • **如何提高整体并发能力:**在集群环境下最重要的亮点,就是如何处理跨机器的资源竞争以及数据的一致性问题,这里将体现整体业务架构设计能力;

多线程

框架

  • Spring Boot 参数校验方法:mp.weixin.qq.com/s/jSt4iewU-…
  • Spring Boot 插件化开发方式:mp.weixin.qq.com/s/PFMkVE8xv…
    • 插件化开发主要指的是使用 SPI 机制,将一些扩展的第三方包中的功能通过接口的形式引入项目。文章中的实现方式,主要是通过在 Resource 目录中定义新的静态配置文件,将插件的类名提前定义好,并且通过 SPI 的方法实现进行 IoC 注入。
  • 自定义 Spring Boot 注解实现多线程事务:blog.csdn.net/weixin_6967…
    • 主要通过自定义注解 + CountdownLatch 的方式,通过多个子线程的事务执行结果,判断事务是否全部执行成功,根据执行结果,决定是否将当前的事务提交。
    • 根据测试结果,这种实现方式不一定可靠,需要大量验证。
  • Spring 多线程环境下保证事务一致性:mp.weixin.qq.com/s/E2PD4zvc_…
    • 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 中的事务信息,在子线程和主线程之中进行显式传递。这样主线程在进行事务提交或者回滚操作的时候,只需要利用传递的事务信息上下文即可实现。
    • Result 结果:最终实现了在多线程环境下异步事务的一致性。
  • Spring 中状态机的使用:mp.weixin.qq.com/s/5bCJRlH_M…
    • 主要依靠 STAE 对事件进行抽象,事件驱动状态的修改。State Transition Action Event,实现状态的事件驱动和流转。
  • Spring 如何解决循环依赖:mp.weixin.qq.com/s/DgPm84pOj…
  • Spring 三级缓存解决循环依赖:blog.csdn.net/cristianoxm…
  • Spring 中 Bean 的有状态和无状态:blog.csdn.net/songfeihu08…
  • Spring 部署成 jar 和 war 包有什么区别:mp.weixin.qq.com/s/cLhvyFFZI…
    • 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 最常用注解梳理:mp.weixin.qq.com/s/C-CYe1gPR…
  • Spring Boot 自动装配原理:mp.weixin.qq.com/s/d22SgqZGf…
  • Spring Boot 整合多数据源:mp.weixin.qq.com/s/n0TZSWghG…
  • Spring Cache 实现分布式二级缓存:mp.weixin.qq.com/s/rywDzWQ39…
  • Spring Batch 批处理框架:mp.weixin.qq.com/s/-PHp32oNy…
  • Spring Security 的最佳实践:mp.weixin.qq.com/s/DdsJ0z__M…
  • Spring AOP 实现原理讲解:mp.weixin.qq.com/s/q8x5lTocN…
  • Spring 事务不生效的 15 种场景:mp.weixin.qq.com/s/Da27If5Fc…
  • Spring Bean 异步初始化改造:mp.weixin.qq.com/s/ZMIUXDc7y…
  • Spring 在启动期间的类扫描为什么没有改成多线程增加启动速度:mp.weixin.qq.com/s/uCCewrN_9…
    • ① 目前不可能异步的对 bean 进行后置处理;② 时间都花在少数几个相互依赖的特定 bean 上。引入并行化,在很多情况下并不能节省多少,因为这并不能加快关键路径。这通常与 ORM 设置和数据库迁移有关。③ Spring 以后的努力方向是 AOT,提前编译(Ahead-of-Time Compilation);④ more pragmatic approach, abandon modifying core logic.
  • Spring Cloud Sleuth 框架详解:blog.btstream.net/post/2019-0…
  • Spring Cloud 的版本命名规则:blog.csdn.net/Thinkingcao…
  • MyBatis 中 10 种常用写法:mp.weixin.qq.com/s/xPM8qarnZ…
  • Netty 经典 32 连问:mp.weixin.qq.com/s/iMEgT4GPt…

微服务

安全

问题解决

项目设计

  • 复杂业务系统的通用架构设计:mp.weixin.qq.com/s/eSeiusZfO…
    • 架构的本质:整体 + 规则 + 通信 = 架构。根据不同侧重点,架构主要可以分为业务架构、应用架构、技术架构。
    • 架构在设计时主要需要考虑功能性因素和非功能因素。功能性因素主要指的是对功能性需求的满足和业务支持,这是在设计架构时的首要考虑。非功能因素主要指的是架构的可用性、可靠性、扩展性、治理能力、响应性能等。
    • 复杂系统在进行分析的时候,根据 DDD 的分析方法,主要步骤有确认角色;确认角色功能;确认问题子域;确认模型、事件、归属;确定界限上下文。
    • 复杂系统遵循的设计原则,主要有:识别核心问题、化繁为简、统一语言、长期价值。
  • 项目设计方案的书写:mp.weixin.qq.com/s/HoQuwu8K7…
    • 一份完备的技术文档,主要包括方案的背景、目的、用例图、时序图、流程图、状态图、数据库设计、接口文档、总结、检查清单、性能要求,这些内容还会根据不同的组织要求有所调整。
  • 支付系统设计方案:mp.weixin.qq.com/s/IMTV462-U…
  • 订单流转的状态模式:juejin.cn/post/696533…
  • 订单流转的状态机实现:juejin.cn/post/720741…
  • 订单防止重复支付实现:juejin.cn/post/712155…
  • 订单系统万能通用设计方案:mp.weixin.qq.com/s/39z-86wog…
  • 短链接系统的设计:mp.weixin.qq.com/s/HgPs1yJDx…
  • MySQL 线上数据平滑扩容:mp.weixin.qq.com/s/Sop5bxyWN…
  • MySQL 数据双写 ES 方案:mp.weixin.qq.com/s/-srzkEGr5…
  • 二维码扫码登录的实现原理:mp.weixin.qq.com/s/gzsZe9PIS…
  • Ali 订单超时关闭解决方案:mp.weixin.qq.com/s/OmbyxkufV…
  • 大批量数据导入导出优化:mp.weixin.qq.com/s/HyuAMdZjT…
  • 海量用户系统的设计,针对用户表:mp.weixin.qq.com/s/3shbv9ivs…
  • 秒杀场景如何通过 Redis 减库存:mp.weixin.qq.com/s/F37Nu2v5p…
  • Redis 队列实现 Java 版的秒杀系统:mp.weixin.qq.com/s/McsaOgVyy…
  • Spring Boot 实现接口幂等性的 4 种方法:mp.weixin.qq.com/s/Be2Vk3hfG…
  • SpringBoot + Elasticsearch 7.6 实现简单查询及高亮分词查询:mp.weixin.qq.com/s/AAyjDg1eN…
  • 接口防重的设计与代码实现,Redis + 注解实现:mp.weixin.qq.com/s/ZpwomffAn…
  • Redis 实现库存扣减操作:mp.weixin.qq.com/s/mbQ506ywh…
  • 松耦合式的权限控制设计:mp.weixin.qq.com/s/QfaW-Hpit…
  • Spring Boot + minio 实现高性能存储服务:mp.weixin.qq.com/s/Umqnuwmxk…
  • Spring Boot 实现万能文件在线预览:mp.weixin.qq.com/s/AJCSqy5kO…
  • 支付系统架构设计以及对应实现:mp.weixin.qq.com/s/54hZpwW7-…
  • 开源支付系统的设计以及实现:mp.weixin.qq.com/s/7Xa2hHdBI…
  • JWT 实现登录认证 + Token 自动续期方案:mp.weixin.qq.com/s/WH_RSsJE4…
  • 优雅的实现 Spring Boot 异步线程间数据传递:mp.weixin.qq.com/s/OjVWL3UTo…
  • 电商系统运营活动功能设计:mp.weixin.qq.com/s/PlvI_uHPW…
  • 微服务鉴权实现设计:mp.weixin.qq.com/s/ixBQTIWzj…
  • 本地多节点缓存刷新方案:juejin.cn/post/700316…
    • 使用 RabbitMQ 的广播模式,使用交换机绑定队列,而队列在每一个服务节点启动后都生成一个唯一队列和交换机绑定,这样就实现了当发现消息给交换机,会有多个不同的队列对消息进行处理。
    • 每当一个节点发生缓存刷新,则可以将这些消息传递给集群中的其他节点,实现缓存、配置等信息的刷新。
  • 分布式中灰度方案设计:mp.weixin.qq.com/s/z2ZB15DN_…
  • 百亿订单的调度方案:www.toutiao.com/article/720…
    • 主要针对订单流程中的超时场景做调度,买家支付超时、商家发货超时、买家收货超时等场景中,海量订单的调度方案。delayQueue:单机,占用内存大;RocketMQ:RocketMQ 5.x 版本已经从延迟消息变成了支持秒级定时消息,时间轮原理。
  • 电商平台取货码系统设计方案:mp.weixin.qq.com/s/uCzc_mDkt…
    • 订单号码远大于取货码号码,如何做订单级别的映射;文章介绍了库表的编号做取货码末尾的方法,单表内的重复,可以直接使用重试解决。
    • 门店唯一和全局唯一的思考不错。但实际上现在的业务场景已经不是这样取货了,都是用取货机扫描包裹,取货码只是为了方便检索,所以门店唯一即可。
    • 保证未核销的取货码唯一,极大降低了难度,避免取货码膨胀。
    • 查询未核销的取货码是否存在,根据查询结果执行插入操作,因为不是原子性存在并发安全,使用分布式锁保证安全。
  • 库存系统架构设计与实践:mp.weixin.qq.com/s/tABKHwoN6…
  • 微信红包的架构设计简介:www.zybuluo.com/yulin718/no…
  • 微信/字节百亿级超大流量红包架构方案:www.toutiao.com/article/721…
  • 加密后的敏感字段如何模糊查询:mp.weixin.qq.com/s/O77aP4767…
    • 先解密再查询:适用于数据量少的情况下,占用内存和 CPU 资源会比较多;
    • 明文映射表:这种情况等于加密效果很差,基本不使用;
    • 数据库层面解密查询:对查询出来的数据在数据库层面解密再模糊查询,即 select * from sys_person where AES_DECRYPT(phone,'key') like '%0537。缺点是无法使用索引来优化查询,且无法保证加解密使用的函数是同一种;
    • 分词密文映射表:新建一张分词密文映射表,在敏感字段数据新增、修改的后,对敏感字段进行分词组合,再对每个分词进行加密,建立起敏感字段的分词密文与目标数据行主键的关联关系;查询时对模糊查询关键字进行加密,用加密的结果对分词密文映射表进行模糊查询,得到目标数据行的主键,再以目标数据行的主键为条件返回目标表进行精确查询;
    • 互联网大厂对用户敏感数据加密后支持模糊查询的方案基本如此。淘宝密文字段检索方案:open.taobao.com/docV3.htm?d…;拼多多密文字段检索方案:open.pinduoduo.com/application…;京东密文字段检索方案:jos.jd.com/commondoc?l…

设计模式

代码编写

行业知识

经典题目

职业成长

  • 构建个人成长路线图:mp.weixin.qq.com/s/UWXxz03Ae…
  • 技术开发的思考与要做的事情:mp.weixin.qq.com/s/ikmGL6P3y…
  • 日常开发提升技术的一些建议:mp.weixin.qq.com/s/-_BPcK80Q…
    • ① 打好基础,深入学习语言特性;② 熟悉日常开发中使用到的工具;③ 总结日常工作中踩过的坑;④ 阅读项目中优秀的代码和设计文档;⑤ 总结一些通用的技术方案;⑥ 参与技术讨论,积极技术分享;⑦ 有 owner 意识,积极攻克项目难题;⑧ 思考项目中可以提升效率的地方;⑨ 熟悉业务,提高自己的核心竞争力;⑩ 查看系统中可能存在的问题,比如接口耗时、慢 SQL,进行优化;⑪ 学以致用,将理论知识运用到实际项目中;⑫ 阅读一些优秀的源码设计;⑬ 多编码、少偷懒,养成编码的好习惯。
  • 程序员怎样才算是在写有技术含量的代码:mp.weixin.qq.com/s/gqO4GaVwW…
  • 试用期总结参考:mp.weixin.qq.com/s/jH5-8_xco…
  • 实习生和试用期的一些注意事项:mp.weixin.qq.com/s/pgO8d06-3…
    • 实习和试用期,更在意候选人的技术基本功和技术思考力
    • 在面对“不就是使用了一个依赖包”这种质疑时,应该:① 最有技术含量的工作确实是用 XX 包实现,但不是有了这个包才有的方案,而是我们制订了方案,这个包满足我们的诉求,可以节省我们的时间才被用到;② 我们不仅仅是解决了 xx 问题,还考虑到了 xx 等方案,这是一个完整的、考虑周到的技术方案升级过程;
    • 不是要大家学习套路,而是说没有来龙去脉的规划会让人疑惑。在讲规划的时候,考虑:① 为什么会这么想,为什么有这样的规划;② 达到这样的目标后会怎么样,对团队、业务的影响是什么。
    • 不要以新人心态看待问题:Everybody matters, every step counts.
  • 职场个人成长、心态和沟通:mp.weixin.qq.com/s/LI5h8U6j1…
  • 重复工作中如何培养匠心:mp.weixin.qq.com/s/nG51m27tw…
    • 更多关注工作,尽管是重复工作,可以从需求看结果、从过程看工作、从可预测性看结论,培养对于重复工作的更多可能性,从细节处看能力,从重复中看匠心。
    • 对技术工作来说,尽可能提供价值空间高、过程对价值贡献高、可预测性低的机会,避免开发者对于技术工作的倦怠,可以更好地激发大家的创造性。
  • 技术人对抗焦虑的加减法:mp.weixin.qq.com/s/7sruMfQDM…
  • 软件研发的道德情操以及同理心:mp.weixin.qq.com/s/_qfcoB0lK…
  • 技术开发的述职与自我审视:mp.weixin.qq.com/s/DjJVcX9h4…
  • 工作中发挥个人能力的不同层级:mp.weixin.qq.com/s/R8RibpWnY…
    • 技术服务业务,业务驱动产品价值。做好业务需求是工作的最低要求,更多的是对个人能力的要求。
    • 利用自己的技术去发掘业务的可能性,解决业务上的瓶颈或者挑战。要做到这个高度需要有足够的积累,要再技术上兼具深度的同时扩展广度,在团队协作项目推进上还需要更积极的主动性和协调能力。
    • 做好本职工作,完成好交付任务的同时,不设边界,积极拓展自身的可能性。这一层要求我们具备更全面的技术规划能力。从需求交付到技术优化再到技术规划,从帮别人干活到给自己找活干再到找活给一批人干。这是格局的变化,是做事角度的改变。整个过程中始终考虑的还是公司利益,团队价值。
  • 爬楼梯还是等电梯(确定性与不确定性的考量):mp.weixin.qq.com/s/P3rqm27IR…
    • 焦虑,是来自于未来的不确定性,以及对自己的不满意。我们往往把“别人贩卖的焦虑”(PUA、35 岁危机)强加到自己的感受中,这种内耗不断反噬着我们的专注力(原本可以用来真正提升自己)。
    • 近些年来,内部晋升等待成本高,不确定性也高(类似于等电梯);跳槽比较累,适应成本高,但是确定性高(类似于爬楼梯)。
  • 打工人如何避免内卷:mp.weixin.qq.com/s/O7Wkyu1D8…
    • 要尽早想好自身的价值,全情投入自身价值的增长,而地位和金钱只是中途顺带的事情,没有达到这方面的目标也无所谓,社会最终也会给予认可的。
    • 内卷和恶性竞争是零和游戏,成为自己才是正和游戏。成为自己需要极强的独立思考能力。这一点可以反思自己在人生所有关键节点中做出的决策,到底是自己真正调研思考得出的结论,还是随大流。
    • 用自己最擅长的方式创造价值,并且通过最适合的杠杆去放大价值。
    • 成为自己,参与正和游戏。适当放弃对外部事物的欲求,才有可能持续保持平和的心态。
  • 程序员如何阅读源码:mp.weixin.qq.com/s/9kfVzG5nN…
    • 阅读源码是程序员的必备技能之一。只会调用 API 对于日常工作来说,还远远不够。看懂别人的代码是怎么写的,对于我们的编码能力、设计能力、架构能力都有极大提升。
    • ① 读哪些:确定阅读范围,包括代码本身、开源组织、各种开源社区;② 看文章:找准主题,总结优缺点、适用场景;③ 写单测:运行程序主线找体感,再打断点看代码抓细节;④ 出总结:和类似的框架、已掌握的知识类比,提炼出其中设计比较优良的点,最后对于没掌握细节,再读一次源码。

职场

  • 职业选择:mp.weixin.qq.com/s/UXCW9JQ2b…
    • 工作怎么选都难免遗憾,知道现阶段自己需要什么,选择一份工作,首先做好,然后熬下去。
    • 工作中 99% 的问题都无法靠辞职来解决,称心如意是妄想,不顺遂才是现实。
    • 坚持自己心中所想,问题都要一个一个解决,委屈都要自己一个一个消化。
  • 职场中沟通协作原则和方法:mp.weixin.qq.com/s/Ivb-nXdSN…

其他