2025.1 期
2025.1 期
1.31
- 一种轻量分表方案-MyBatis拦截器分表实践:针对日增 100W、仅依赖近一周数据的亿级核心表,对比归档与 Sharding-JDBC 后选择基于 MyBatis 拦截器的轻量分表——
@Intercepts拦截 StatementHandler.prepare、用 MetaObject 改写 BoundSql 的 SQL 表名为按周生成的周期表(如order_info_20240107_20240113);针对周临界点查不到上周数据的痛点,采用每张周期表冗余上一周数据的「双倍滑动」策略,配合监听 binlog(DRC / Canal)做异步双写,规避业务串行执行两次 SQL 的性能损耗。
1.30
一日一技:如何使用Cursor学习开源项目:以 Cline 源码为例演示用 Cursor 学习开源项目的正确姿势——先看项目文件结构定位关键目录(如
src/core/assistant-message),再通过@folder精准锚定上下文针对单个功能(如 replace_in_file 的 XML 解析与文件改写流程)连续追问,最后让 Cursor 把核心逻辑翻译成可运行的 Python Demo 加深理解,强调「提问越具体返回越具体」,反对一上来让 AI 解释整个项目。实战;单点登录,前后端分离 Spring OAuth2:基于 Spring Security OAuth2 + SpringBoot 2.6.2 搭建前后端分离 SSO 案例工程,通过 SwitchHosts 配置 sso/client1/client2 三个域名 + Nginx 反向代理规避跨域,鉴权侧用
InMemoryClientDetailsServiceBuilder注册 client 凭证与authorization_code授权类型、实现AuthenticationEntryPoint在未登录时重定向到登录页,客户端按 OAuth2 标准配置 access-token-uri / user-authorization-uri / user-info-uri,演示一次登录后多客户端互信跳转。MyBatis-Plus内置的主键生成策略有大坑,要注意!:MyBatis-Plus 雪花算法的 workerId 取自 JVM 进程名 hash、dataCenterId 取自 MAC 地址,K8s/Docker 集群下极易碰撞导致主键重复;推荐替换为 Seata 改良版雪花算法——把 timestamp 与 sequence 用一个 AtomicLong 合并存储、启动时仅取一次系统时间戳后只靠
incrementAndGet自增(sequence 溢出自动进位到时间戳),从根本上解除与系统时钟的强绑定、彻底规避时钟回拨,workerId 改为取 MAC 低 10 位保证范围 [0,1023]。
1.29
这才叫分布式限流算法!:系统梳理限流的设计原则(多级、动态阈值、灵活维度、解耦、容错、监控)与四种单机算法——固定窗口、滑动窗口、漏桶、令牌桶的原理、Go 代码实现与优缺点对比,再延伸到分布式限流的两类落地方案:基于 Redis + Lua 保证原子计数的中心化限流,以及基于 Sentinel 集群流控的 token-server 模式,给出限流选型建议(突发流量选令牌桶、平滑整形选漏桶、低成本场景用滑动窗口)。
什么是多租户?SaaS 架构设计是怎样的?全网最全多租户系统设计方案:从「租户 vs 用户」概念入手系统讲解 SaaS 多租户架构,划分基础设施 / 组织权限 / 业务数据三层隔离,对比竖井隔离(强隔离、计费简单但成本高、迭代慢)、共享模式(高效低成本但租户互相影响、计费复杂)与分域隔离(基础域共享 + 专用域竖井)三种模式的取舍;建立租户/用户/组织/员工/解决方案/产品/资源域/云资源的概念模型,并落地到租户上下文识别、按隔离模式区分计费计量、应用层「租户运营平台模块」的整体应用架构。
1.26
本地玩转 DeepSeek 和 Qwen 最新开源版本(入门+进阶):用 Ollama 一键拉起 DeepSeek R1 蒸馏版(基于 Qwen 蒸馏,可本地跑)与 Qwen2.5 系列,通过 Spring AI Alibaba 的
spring-ai-alibaba-starter+spring-ai-ollama-spring-boot-starter注入 ChatClient 即可对接;进阶部分引入云原生 AI 网关 Higress(基于 Istio/Envoy)做生产化治理,支持 API Key 池均衡与自动熔断、消费者二次分租、模型按比例灰度、兜底模型降级,以及提示词模板/AI 缓存/数据脱敏等热装载插件,调用方用 OpenAI 协议即可路由到任意后端模型。终于有人说清楚AI开发的全流程了!:覆盖需求分析→开发→测试→发布→监控反馈的完整 AI 应用开发流程,强调通过 AI OPS(如 Dify)让产品/业务自主完成需求调研与可行性验证;开发阶段从 RT、Token、QPM、调用成本、效果五维做 LLM 选型(小任务用 qwen2.5-7b、复杂任务用 qwen2.5-72b),通过多模型对比实验调优 Prompt,借助链路分析定位耗时瓶颈、Token 消耗与异常节点;总结 RT 优化三板斧——按任务选规模、精简 Prompt Token、用 Multi-Agent 拆解复杂任务替代单 Agent 长 Prompt。
MySQL索引学习笔记:从响应时间/扫描行数/返回行数三个查询开销指标切入,结合 EXPLAIN 的 ref 与 ALL 访问类型对比说明索引价值;引入「三星索引」评价体系(相关记录聚集、顺序一致、覆盖查询列)与 InnoDB 聚簇索引/二级索引/覆盖索引的存储原理,讲解索引列顺序按选择性优先的设计原则、最左前缀法则失效场景、以及 ORDER BY 命中索引的边界条件(前导列为常量可填补间隙、排序方向需一致、范围查询会阻断后续列),逐条给出 Sakila 表上的反例 SQL。
SpringBoot 项目处理跨域的四种技巧:解释同源策略与 CORS 规范(简单请求 vs OPTIONS 预检请求)后,给出 SpringBoot 处理跨域的四种方案:Nginx 反向代理层直接配置
Access-Control-Allow-*、配置类实现WebMvcConfigurer.addCorsMappings、注册CorsFilter过滤器(优先级高、能规避业务拦截器异常导致 addCorsMappings 失效)、以及微服务架构下在 SpringCloud Gateway 网关统一配置 CORS 让内部服务无感知。
1.24
- 如何快速搭建一个属于自己的网站?:以阿里云低代码平台「魔笔」为例演示快速建站全流程——先准备 VPC + 交换机 + RDS MySQL(亦可用 ROS 模板一键部署),再基于企业官网模板创建应用、配置数据库集成、通过可视化拖拽编辑新闻数据和折线图组件并绑定 SQL 数据源,最后完成域名 ICP 备案与 DNS 解析发布上线,整体规避了传统建站的服务器搭建、前后端编码与运维成本。
1.22
如何提高网站排名?:从搜索引擎的爬虫抓取→预处理(去 HTML 标签与停用词、构建正排/倒排索引、计算超链接关系)→索引排序三阶段工作原理出发,给出四类 SEO 优化方向:优化网站结构(去除 flash/动态 URL、降低层级、URL 简短含关键词、启用 HTTPS、避免下划线破坏分词)、选择有商业价值的关键词、优化页面 title/description/正文并重视 Google Core Web Vitals 的用户体验指标、以及通过发布高质量内容吸引高权重站点的外部链接。
8G的容器Java堆才4G怎么就OOM了?:阿里同学复盘饿了么应用「容器 8G、Java 堆 4G、MaxDirectMemorySize 1G」却仍被 OS kill 的 OOM 案例,通过 NativeMemoryTracking、jemalloc 调参、pmap+gdb dump、Arthas 等手段层层定位,最终发现由 7 个不同 ClassLoader 分别加载了 netty 的 PooledByteBufAllocator,每个实例都拥有独立 1G 配额且通过 UNSAFE.allocateMemory 绕过 JVM DirectMemory 限制,导致堆外内存实际占用突破 1G,给出「排查 Java 堆外占用先看 netty」的经验结论。
1.19
Redis实现分页+多条件模糊查询组合方案!:基于 Redis 的 ZSet(ZADD/ZREVRANGE/ZREM)做分页排序、用 Hash + HSCAN 模式匹配实现模糊条件查询,组合方案是将筛选条件编码进 Hash field(如 id:姓名:性别),按匹配串生成或命中对应的 ZSet 用于分页,并通过给生成集合设置过期时间、命中续期、写入时同步插入或定时更新等手段在性能与实时性之间做权衡。
4 种 MySQL 同步 ES 方案,yyds!:对比 MySQL 同步 ES 的四种方案——同步双写(简单实时但强耦合易丢数据)、MQ 异步双写(解耦高性能但有延迟)、基于 timestamp 的 SQL 抽取(无侵入但时效差,典型工具 Logstash)、基于 Binlog 的实时同步(无侵入高性能但系统复杂),并梳理 Canal、阿里云 DTS、LinkedIn Databus、Maxwell、Flink、CloudCanal、yugong 等主流 CDC 工具的原理与选型建议。
1.18
架构思考与实践:从通用到场景的转变:作者以业务架构作为打开企业黑盒的「镜子」,借 TOGAF「价值流映射到业务能力」与中国电信 CRM 流程框架案例说明顶层抽象的作用,提出在基础建设已较完备的成熟公司应从通用架构转向场景架构——放弃一劳永逸幻想、做场景归类与优先级分级、强化基础理论、深入业务内容,并结合《恰如其分的软件架构》的「风险驱动」原则反思架构师应避免被自己画的圈所困、用结构化思维持续向远方牵引。
如何保证mongodb和数据库双写数据一致性?:区分 Redis 缓存延迟双删场景与 MongoDB 作为大字段/JSON 文档存储场景,给出「先写 MongoDB 再写关系库」方案——通过把 mongo id 写入主表保证未关联的 MongoDB 数据等同垃圾不影响业务;修改操作采用新增文档+更新 mongo id 字段替代原地更新,老数据由 MQ 异步删除并配合 RocketMQ 重试与死信队列;新增产生的垃圾文档则用定时 job(按 in_time 缩小扫描窗口、多线程或缩短周期)或借鉴 Redis 的随机删除策略进行清理。
Guava的这些骚操作,让我的代码量减少了50%:盘点 Guava 中替代嵌套 Map 的五类结构——Table(双键 Map,支持 rowKey/columnKey 取值、转置、转嵌套 Map)、BiMap(双向 Map,inverse 共享视图、value 不可重复需 forcePut 强制覆盖)、Multimap(一键多值,可选 ArrayListMultimap/HashMultimap/TreeMultimap)、RangeMap(区间映射)、ClassToInstanceMap(按类型安全存取实例),并配合 ImmutableMap 等不可变集合用更少代码替代手写嵌套结构。
1.16
一定要写单元测试!为了早点下班!:腾讯云作者从开发体验视角论证单测价值——单测提供秒级反馈循环避免打断思维、用「原子正确性」把 Debug 范围从整应用收敛到函数组合层;在 AI 辅助编程下,单测充当将长任务拆解为「小任务→检查」分治链路的关键校验机制;前端开发者不写单测往往源于「冷启动」成本,可通过紧邻被测函数写测试(TS 用 require.main === module、Go 用 _test.go 约定)、采用 Vitest 的 In-Source Testing 与零配置直接 npx vitest 来消除门槛。
1.5万字+30张图盘点索引常见的11个知识点:以 InnoDB 为背景从数据结构、物理存储、特性、字段数四个维度划分索引类型,用 user 表为例图解数据页内分组+页目录二分定位、多数据页通过页号双向链表与上层目录页形成 B+ 树聚簇索引,对比聚簇索引(叶子存全列)与二级索引(叶子存索引列+主键 id)的差异,并逐条讲解单列/联合索引、回表、覆盖索引、最左前缀、索引下推(MySQL 5.6+ ICP)、索引失效、隐式类型转换、order by 与 group by 利用索引、前缀索引、唯一与普通索引选择等共 11 个索引知识点。
分布式架构知识体系:阿里技术从 SOA 到 MSA 的演进梳理分布式架构知识体系,覆盖节点与网络模型、TCP/UDP 与时钟(NTP、逻辑时钟、向量时钟)、ACID/CAP/FLP/DLS/BASE 一致性理论与 CALM 原则、CRDT 数据结构、Paxos/Raft/Gossip/ZAB 等共识算法,按场景列举 HDFS/Ceph、HBase/ES/Redis/Spanner、Hadoop/Spark/Flink、Kafka/RocketMQ、Zookeeper、Dubbo/HSF、ELK/Zipkin、区块链等典型实现,并从可用性、数据管理、设计与实现等角度给出设计模式选型清单。
1.15
微服务常见限流方案及TSF限流原理:梳理微服务限流的目的(防过载、防暴力破解、保 QoS、控成本)与公平/灵活/解耦/可观测四原则,对比单机/集群/按业务对象限流三种粒度,并对固定窗口计数器、滑动窗口计数器、漏桶、令牌桶四种算法做实现原理与优缺点比较;限流后处理建议涵盖拒绝、阻塞重试、调权负载均衡、返回 HTTP 429 与日志记录;最后剖析腾讯 TSF 的动态配额分配限流——通过 tsf-ratelimit-master 中控按各实例历史流量预测分配配额,SDK 侧用令牌桶执行限流,支持全局限流与基于标签限流以按 API、调用方、用户等多维生效。
5分钟迅速掌握领域驱动设计的40个关键概念:高度凝练《领域驱动设计:软件复杂性应对之道》的 40 个关键概念,按五大类组织——构造块(分层架构、关联、Entity、Value Object、Service、Aggregate、Factory、Repository、Specification)、柔性设计(释意接口、无副作用函数、断言、概念轮廓、孤立类、闭合操作)、战略设计(Bounded Context、Continuous Integration、Context Map、Shared Kernel、Customer/Supplier、Conformist、Anti-corruption Layer、Open Host Service、Published Language)、精炼(Core Domain、Generic Subdomain、Highlight Core、Segregated Core、Abstract Core)与大型结构(Evolving Order、System Metaphor、Responsibility Layer、Knowledge Level、Pluggable Component Framework)。
1.14
谷歌身份验证器是怎么工作的?:图解谷歌身份验证器(2FA)的工作原理——启用阶段服务器为用户生成 secret 并以含 issuer/account/secret 的 URI 编成二维码,用户用 Authenticator 扫描后本地存储 secret;登录阶段客户端与服务端基于相同 secret 用 TOTP 算法每 30 秒生成 6 位密码并比对一致才放行,并讨论 HTTPS 传输与 secret 加密存储的安全性,以及 6 位 100 万组合 + 30 秒窗口下暴力破解需每秒 30000 次尝试的难度。
图解+案例,理解和实战 OAuth2 认证授权:OAuth2 是 RFC 6749 定义的开放授权标准(非身份验证);文章用图解梳理四种授权方式——authorization_code(先拿授权码再换 token,适合带浏览器的 Web 应用)、implicit(隐式模式,直接把 token 拼在重定向 URI,适合 SPA 但安全性低)、password(用户把账密交给可信客户端换 token)、client_credentials(M2M 服务间通信),并基于 Spring Security + MySQL + JWT 提供完整可运行工程,覆盖
loadUserByUsername自定义认证、TokenEnhancer在 access_token 中附加账户信息,以及 ApiPost 验证四种授权流程的端到端调用。浅入浅出——MySQL索引:从硬盘 I/O 远大于内存计算这一前提出发,逐层推导索引选型——哈希表 O(1) 但不支持范围查询、有序数组写入成本高、平衡二叉树高度过深导致 I/O 多,最终落到 B+ Tree:非叶子节点只存索引让 M 阶更大、叶子节点构成有序链表使范围扫描只需定位起点;进而讲透 InnoDB 聚簇索引与二级索引的回表机制、覆盖索引、联合索引最左前缀原则、前缀索引的长度权衡、
order by是否触发Using filesort与sort_buffer、优化器算基数/算行数选错索引时用force index或analyze table干预。
1.12
新活动平台建设历程与架构演进:B 站用户技术中心活动中台两年迭代复盘,将平台定位为同时承载 No Code / Low Code / Pro Code 三种模式的低代码 CMS,按「短线技术优化保业务、长线技术升级促业务」分三阶段推进:一阶段用 iframe + previewWarp 透明浮层方案解决画布跨页面拖拽与全真预览、用一体化数据源面板让线上配置出错降 30%+;二阶段重构数据模型为 ComponentData / LayerData / ApiData 三类 + 制作页四大模块解耦、用 woodman 转换器无损迁移 50+ 组件、设计 5 层渲染框架统一 B/C 端渲染器、抛弃 antd tree 改用 reactDnD + 扁平树重写图层模块、上线工程化开发工具 eva-cli;三阶段补齐 Low Code 代码块开发与 Pro Code 片段加载器,并通过 eva-server 框架预渲染优化 C 端性能。
数据实时更新的多种实现方式:对比短轮询(定时器频繁请求、HTTP 三次握手/四次挥手浪费、数据更新延迟)、长轮询(服务端挂起请求直至数据更新或超时,减少无效请求但长时间挂连占用线程内存)、WebSocket(基于 TCP 全双工,握手用
Upgrade: websocket+Sec-WebSocket-Accept完成 101 协议切换后双向推送,需心跳维护)、SSE(基于 HTTP 单向长连接,Content-Type: text/event-stream,客户端用EventSource接收,仅支持文本不支持二进制),并给出 Node + Vue 完整示例,结论是按场景选型:低频更新走轮询、需双向交互走 WebSocket、纯服务端推送走 SSE。缓存之美——如何选择合适的本地缓存?:对比三种 JVM 本地缓存的演进与选型——Guava Cache 基于类 ConcurrentHashMap 结构,支持
expireAfterWrite/expireAfterAccess两种过期、maximumSize/maximumWeight+ FIFO/LRU 容量控制和recordStats监控,但性能受限;Caffeine 是 Guava 升级版,靠异步淘汰清理、JDK8 ConcurrentHashMap 优化(链表+红黑树、synchronized+CAS 分段锁降级)以及 W-TinyLFU(窗口缓存 + TinyLFU 过滤器 + 主缓存淘汰段/保护段)算法大幅提升命中率与吞吐;Ehcache 引入堆内 + 堆外 + 磁盘三级存储突破 JVM 内存制约并支持集群解决缓存漂移;最终建议 JDK8+ 单机读多写少场景优先 Caffeine,分布式一致性敏感场景用 Ehcache。
1.11
微服务架构中的服务注册与发现实现原理:横向对比四款注册中心——Eureka 通过 Server 间对等复制 + Client 心跳 + 自我保护机制(15 分钟内 85% 节点心跳异常即停止剔除并暂停同步)牺牲一致性走 AP;Zookeeper 用临时 ZNode + Watch 机制感知服务上下线,依赖 ZAB 协议走 CP,选主或半数节点不可用时整集群不可用;Nacos 支持 CP(Raft)/AP(Distro Async)双模式可由
nacos.core.protocol.distro.data.sync.mode切换,默认 AP,且具备 DNS/RPC 双发现、健康检查、动态配置、动态 DNS;Consul 用 Go 实现、Server/Client 角色分离,靠 Raft 走 CP,原生支持多数据中心和 TLS 互通。弃用 RestTemplate,来了解一下官方推荐的 WebClient !:阐述 Spring 5+ 弃用 RestTemplate 改推 WebClient 的根本原因——基于 Reactor 的非阻塞 I/O、函数式 fluent API、流式传输支持、更优错误处理,且 Spring Web 6.0 后 RestTemplate 已无法在
HttpRequestFactory设置请求超时;给出 Spring Boot 3 下完整用法:用HttpClient配合ChannelOption.CONNECT_TIMEOUT_MILLIS+responseTimeout+ReadTimeoutHandler构建 WebClient,retrieve().bodyToMono().block()同步调用,subscribe(response, error)异步处理,通过onStatus(HttpStatus::is4xxClientError, ...)分别拦截 4xx/5xx 错误,捕获WebClientResponseException与WebClientRequestException区分服务端响应异常与客户端超时。71.7万/秒到1.4万/秒!数据库查询优化实战:菜鸟消费者运营策略平台用 CPU 缓存行思想(「缓存的加载粒度 > 查询粒度」)解决 Lindorm 状态查询 QPS 放大问题:状态表主键
(userId, graphId, vertexId)利用 Lindorm 最左前缀范围查询,先把缓存加载粒度从单行(userId, graphId, vertexId)提升到(userId, graphId),数据库查询量级降到原来 23.5%、均摊查询耗时降 65%;再激进推到(userId)粒度,将 71.7 万/秒查询压到 1.4 万/秒加载(命中率 97.95%)、均摊耗时只剩 0.02 ms;同时强调缓存加载需空对象占位防穿透、写入侧用 Lindorm LSM Tree 顺序写 + MetaQ 重试 + 时间戳多版本保证一致。
1.10
Ranger学习:从大数据安全方案选型切入,对比 Kerberos(基于对称密钥三阶段 TGT 流程,强在跨服务认证 + SSO,弱在只控制服务级访问、无细粒度授权,通常需配合 LDAP)、Apache Sentry(CDH 系基于角色的细粒度授权,支持 Hive 列级和 HDFS 元数据但只覆盖 Hive/HDFS/Impala/Solr/Kafka)、Apache Ranger(HDP 系,统一支持 HDFS/YARN/Hive/HBase/Storm/Knox/Solr/Kafka/Nifi 的细粒度授权与审计);并总结 Ranger 核心特性——通过中央 UI/REST API 集中安全管理、RBAC/ABAC/Tag-Based(结合 Atlas)多授权模型、对各 Hadoop 组件标准化授权方法、集中审计与 Kerberos 集成,定位是「认证交给 Kerberos、授权与审计交给 Ranger」。
JVM 核心知识体系:阿里技术团队 JVM 全景体系梳理,从 class 文件结构(magic / constant_pool / access_flags / fields / methods / attributes 等字段把类比作「数据库」)讲到加载机制:JVM 通过 JNI 校验
public static void main签名启动入口;类加载器分 Bootstrap(C++ 实现加载<JAVA_HOME>/jre/lib)/ Extension(ExtClassLoader extends URLClassLoader加载java.ext.dirs)/ System(AppClassLoader加载-classpath)三层,自定义类加载器通过覆写findClass/loadClass实现外部加载并遵循双亲委派;再延伸覆盖堆/栈/方法区/计数器内存布局、内存回收、执行引擎、调优工具,以及 JPDA(JVMTI/JDWP/JDI)框架配合 ASM/CGLIB/DCEVM 实现字节码增强与热替换。
1.9
简化代码模块设计:两种高效编程范式:沉淀两种可复用的代码模块组织范式——领域模型驱动范式按 DDD 围绕实体(生命周期内由标识定义)、值对象(无标识、属性变即非己)、聚合(聚合根 + 关联实体/值对象,对外统一事务)建模,用 Repository 屏蔽存储细节、Facade 屏蔽三方依赖实现依赖倒置、Factory 封装复杂构造,并将领域服务细分为 BaseUpdateDomainService / BaseBizDomainService / UserCaseDomainService 三类;过程驱动范式则抽象
AbilityNode.execute(context)原子能力点,按召回/补全/过滤/排序/渲染等阶段分包,通过AbilityChain编排引擎读取 JSON 流程协议串行或并发执行能力点,配合切面做埋点和预校验,适合渲染链路或重领域服务等数据处理流程场景。这才叫 API 接口开发!:以契约式设计(Design by Contract)为指导思想,从「设计-优化-安全-维护」四个维度系统梳理 API 接口开发要点——设计侧强调关注点分离、自我表达、MECE 互斥穷举、快速失败、幂等性、URI 前缀版本化六大原则;优化侧给出批量、异步、并行、空间换时间、池化、预处理、SQL 深分页改写、锁粒度控制、合适存储选型、压缩传输十类手段;安全侧覆盖加密、加签验签、Token/JWT、防重放(timestamp+nonce)、限流、黑白名单、脱敏、防 SQL 注入、RBAC、HTTPS;维护侧主张文档与代码绑定(swagger)和分级日志规范。
Linux 文件描述符是什么?:通过分层架构图解 Linux 文件描述符的本质——进程打开文件时由内核分配的整数索引,分别从用户空间、内核空间、文件系统三层展开:每个进程维护独立的文件描述符表(fd 0/1/2 固定为 stdin/stdout/stderr),表项指向系统级 open file table,再由 vnode 表抽象静态元信息,最终落到 inode 数组存放权限、所有者、时间戳等真实文件信息,多 fd 可指向同一 file table 项以共享文件状态。
Mybatis 拦截器实现单数据源内多数据库切换:针对「单数据源下多个同结构数据库」的分库查询场景,给出不引入 Sharding-JDBC 的轻量实现:在 MyBatis Executor.query 拦截器中用装饰器模式包裹 SqlSource,调用 getBoundSql 后通过 JSqlParser 的 TablesNamesFinder 解析出所有表名,按动态库名前缀拼接成
dbName.table,再用反射回写 BoundSql 的 sql 字段;AbstractDBNameInterceptor 抽象通用逻辑、子类实现 getSpecificDBName 即可按业务参数(如设备 ID)切换目标库。聊聊Druid连接池的内部原理及推荐配置:以源码视角剖析 Druid 连接池工作机制——init 时启动 LogStats、CreateConnection、DestroyConnection 三个后台线程,通过 empty/notEmpty 两组 Condition 协作完成借还;CreateConnectionThread 监听 empty 信号创建连接并 put 到池尾,DestroyConnectionThread 按 timeBetweenEvictionRunsMillis 周期执行 shrink 探活销毁(phyTimeoutMillis 物理超时、minEvictableIdleTimeMillis 空闲淘汰、保留 minIdle、keepAlive 探活)与 removeAbandoned 泄漏回收;getConnection 走 LRU 栈式置换并按 testOnBorrow/testWhileIdle 探活,recycle 时归还到池尾发 notEmpty 信号,并给出生产环境推荐配置与监控建议。
1.8
设计模式基础之——模板模式业务实战:以抽奖系统为业务实战切入,演示模板模式「算法步骤稳定、具体实现可变」的应用方式——抽奖的 12 步主流程(校验、扣次数、获取奖品、抽奖等)固定不变,「参数校验」和「奖品获取」按活动类型(按时间/按次数/按金额)变化;采用 Go 风格的接口+组合替代继承,定义 BehaviorInterface 抽象变化点,Lottery 模板类编排不变流程,TimeDraw / TimesDraw / AmountDraw 等子类实现变化逻辑,从而做到高内聚低耦合。
伴鱼大数据权限系统的设计与实现:面对早期数据仓库「裸奔」无权限管控的问题,伴鱼基于 LDAP 做统一身份认证、Apache Ranger 做授权(HiveServer2、Presto Coordinator 同时认证+授权,HDFS NameNode 仅授权),引入用户组提升管理效率,按 P0/P1/P2 划分权限等级,并区分 Access 正向授权与 Mask 数据脱敏两类策略;通过 Atlas 元数据中心异步捕获建表事件自动初始化权限策略,统一打通 Presto、Hive、HDFS、Metabase 报表权限收敛,配合工单化申请流程实现「管控与效率」平衡。
深入剖析SQL死锁-两条SQL之间的死锁原因:针对
INSERT ... ON DUPLICATE KEY UPDATE批量插入并发出现死锁的场景,作者通过SHOW ENGINE INNODB STATUS死锁日志 + 自编译 MySQL 源码在row_mysql_handle_errors设置断点的方式还原根因:MySQL 对该语句逐行处理而非原子提交,处理重复键时先加间隙锁(gap lock),多个事务在同一页持有相同间隙锁后再各自申请插入意向锁,由此形成循环等待;结论是死锁由「分行处理 + 间隙锁 + 并发」三因素共同触发,而非简单的行锁冲突。
1.7
开发同学如何理解业务?:从开发视角拆解「理解业务」的四级递进——理解实现(梳理需求、接口入参出参与调用流程,仅完成功能交付)、理解需求(追问用户是谁、使用场景、要解决什么问题)、理解业务(区分用户与客户、业务给客户/公司带来的价值)、理解行业(友商打法、公司在行业的位置与战略);并提出「上下游质检」思想——前端要对上游需求文档、设计稿、接口文档把关,配合圆桌研发模式、参与业务会议、亲身体验产品三种实操方法,避免沦为工具人。
万字详解高可用架构设计:以海恩法则、墨菲定律、熵增原理为引子,从「事前预防—发现—恢复—总结」四阶段全景梳理高可用架构——用「N 个 9」可用性指标与故障分量化考核,将服务分为核心/重要/一般/工具四级并差异化部署;按接入层(域名、DNS 防劫持、高防 IP、API 网关限流)、应用层(水平扩展、无状态、回滚灰度、幂等、超时、异步、降级、failover/failfast/failback/failsafe 容错)、数据层(CAP/BASE、柔性事务 XA/TCC/异步确保/最大努力通知、冗余备份)分层设计;运营侧补齐灰度(金丝雀/滚动/蓝绿)、容灾备份、同城/异地多活、常态化全链路压测、故障复盘机制。
1.6
从头到尾说一说Java时间日期体系的前世今生:从 Unix 时间纪元为何选 1970-01-01(32 位最多表示 68 年)讲起,先理清 GMT(基于地球自转的本初子午线时间)与 UTC(基于铯-133 原子钟、用闰秒对齐 UT1)的本质区别,再回顾 JDK 时间体系演进——
java.util.Date的不可单独表示日期/时间、月日从 0 起算、年减 1900、不支持时区且可变;Calendar仍然可变且笨重;最终 Java 8 借鉴 Joda-Time 落地 JSR-310,用 Instant(时间戳)、LocalDateTime(无时区的日历时间)、Duration(抹去时区的时段)、ZonedDateTime(带时区时刻)厘清语义;并以夏令时回拨、闰年(4 年/100/400 规则)、闰秒(23:59:60)等真实事故警示开发者「存在即有原因」。为什么 HashMap 不能一边遍历一边删除?:从字节码层面解释 foreach 对集合等价于 Iterator.next(),再深入 HashMap 源码定位
ConcurrentModificationException的根因——HashIterator.nextNode每次检查modCount != expectedModCount即抛异常,而HashMap.remove、KeySet.remove、EntrySet.remove三种路径调用removeNode后只递增modCount不同步expectedModCount,唯有HashIterator.remove在删除后同步两值;put 替换 key 不会触发,put 新 key 因结构变更同样会抛;结论是遍历期间增删元素必须走Iterator.remove()。IO模型介绍(select、poll、epoll):从用户态/内核态视角拆解一次 IO 的「等待 + 拷贝」本质,依次对比阻塞 IO、非阻塞 IO、IO 多路复用、信号驱动 IO、异步 IO 五种模型,并深入分析 select/poll/epoll 三者差异——select 受 1024 fd 上限与用户内核态拷贝、双重遍历之苦,poll 用动态数组突破 fd 数量限制,epoll 通过红黑树管理 fd、回调机制替代轮询、就绪队列只回传可读 fd 三板斧实现高效,同时区分 LT 水平触发与 ET 边缘触发的语义差异。
真实案例解析缓存大热key的致命陷阱:京东双 11 大促复盘一个 1.5M 大热 key 引发 Redis 雪崩的真实事故,定位根因是本地 JVM 缓存失效瞬间的缓存击穿叠加 Redis 单分片 200M 带宽限流(1.5M key 仅能撑 133 QPS),治理方案:序列化由 JSON 换 Protostuff 把对象从 1.5M 降到 0.5M、gzip 压缩再降到 17K、回源 Redis 加线程锁收敛并发、定期监控带宽阈值,预防层面强调设计阶段评估大 key、上线前压测、定期优化升级。
多线程读写锁产生死锁的故障解决方案:腾讯一次 trpc-go 服务 OOM 的协程泄漏排查,pprof 定位到大量协程 gopark 在 RWMutex.RLock/Lock 上,根因是同一协程在持有读锁时重入 RLock 触发死锁(R0→R1→W0→R0 循环依赖);深入剖析 golang RWMutex 的 writer-preferring 实现(readerCount/readerWait/writerSem/readerSem 四个字段精妙协作),并给出三条规避范式:锁粒度要小、临界区禁止嵌套函数调用、谨慎使用 defer 释放锁;附带 pthread 与 C++17 shared_mutex 的优先级策略对比。
日常工作,MQ的8种常用使用场景:系统梳理 MQ 在日常开发中的 8 类典型应用场景——异步处理(注册后发短信/邮件解耦主流程)、服务解耦(支付与库存通过 RocketMQ 通信)、流量削峰(秒杀按消费能力拉取)、延时任务(订单超时自动取消)、日志收集(Kafka + ELK 集中化)、分布式事务(半事务消息 + 本地事务 + 反查机制)、远程调用(微众基于 RocketMQ 自研金融级 RPC)、广播通知(订单支付成功事件多系统订阅),每个场景配 RocketMQ/Kafka/RabbitMQ 代码示例。
1.5
- 代码质量与技术债系列分享之一 - 如何做好 Code Review:从 CR/CL/LGTM 名词解释切入讲述 modern Code Review 的意义与原则——只要 CL 提升整体代码健康度就应批准合入,基于技术事实而非个人偏好沟通;发起方做好 checklist 自审、控制单次评审 200-400 LOC、低于 500 LOC/小时、单次不超 60 分钟;评审内容按设计/功能/复杂度/测试/命名/注释/风格优先级递减检查,遵循 CLEAN(Cohesive/Loosely Coupled/Encapsulated/Assertive/Nonredundant)设计原则,配合京东实际代码 bad case 讲解三元嵌套、魔法字符串、200 行 validate 函数等典型反例。
1.3
- 一文详解架构设计的本质:阿里技术从「道法术」三层重构架构师认知体系,主张架构师的天职是最大化客户利益而非追逐技术潮流,架构过程是对自然增熵的减熵过程;以登陆火星为思想实验串起「业务建模→概念建模→架构推导→系统落地」全流程,系统分析章节给出实体分析(空间拓扑/连接性/顺序/成员/所有权关系)与功能分析(功能 = 主体 + 操作 + 操作对象)方法论,系统设计章节引入 TOGAF 四层框架(业务/数据/应用/技术架构)与 UML 工具集,覆盖用例驱动、领域驱动、四色建模、CRC、CQRS 五种建模方法。
1.2
读书笔记|程序员的README:阿里工程师入职一年后回读《程序员的 README》的章节笔记,覆盖入门期「新人入职→成长试炼→贡献价值」三阶段、学习方法(前置学习/实践学习/跟班结对/副业项目)、提问礼仪(先自查、设时限、记过程、批量同步请求)、技术债四象限(谨慎/鲁莽 × 有意/无意)、防御式编程十条(避免空值、不可变、早抛晚捕、智能重试 backoff、构建幂等、释放资源)、日志分级与监控、依赖管理(语义版本号、避免循环/钻石/版本冲突依赖)、测试类型与确定性原则、Code Review 双向礼仪、软件交付四环节(构建/发布/部署/展开)与特性开关。
浅谈API错误码设计:京东物流团队从痛点出发讨论 API 错误码设计三原则——快速追踪溯源、简单清晰易记、信息描述清晰,规范统一 Response 格式(code/message/data 三段式);重点提出错误码传递机制:下层错误码 A 与本层错误码 B 合成 AB 向上层传递,让链路携带各模块故障分支信息;附冷链外单无妥投时间的真实咨询案例(5 个环节优化到 2 个环节);末章探讨全链路错误码系统设计——通过 traceId + 日志格式
traceId|应用错误码|错误码信息描述+ 错误码 Agent + MQ + ES 实现跨 20+ 系统的故障快速定位。
1.1
- Nacos 3.0 的这个设计,值得我们学习:Nacos 3.0-ALPHA 把 API 从过去「系统间调用 vs 运维管理」两类粗分类细化为四类,并配套差异化认证机制——集群内部访问与运维 API 默认 ServerIdentity 验证,控制台 UI API 用用户名密码做身份与权限认证,客户端/应用程序 API 默认不开启安全认证;这种按调用方角色精细化划分 API 与认证方式的设计思路,可作为日常 API 设计与管理中兼顾安全性与易用性的参考范式。
