Sentinel 限流降级源码分析
Sentinel 是阿里开源的流量治理组件,滑动窗口的 QPS 统计算法和令牌桶的限流实现是它的核心。本文深入源码一探究竟。 一、Sentinel 的核心概念 1.1 资源(Resource)——需要保护的代码片段 1.2 规则(Rule)——限流/熔断/降级规则 1.3 入口(Entry)——SphU.entry() 获取资源访问许可 1.4 核心架构——责任链模式(Slot Chain) 二、滑动窗口统计 2.1 固定窗口的缺陷——窗口切换时的”突刺”现象 2.2 滑动窗口算法——窗口细分 + 滑动 2.3 Sentinel 的 LeapArray ——环形...
Dubbo 服务暴露与引用的完整流程
Dubbo 的 @DubboService 和 @DubboReference 背后,一次 RPC 调用经历了怎样的服务暴露和服务引用过程? 一、Dubbo 的核心架构 1.1 服务提供者 Provider、服务消费者 Consumer、注册中心 Registry、监控中心 Monitor 1.2 URL 驱动模型——一切皆 URL 1.3 三层模型——Business / RPC / Remoting 二、服务暴露流程 2.1 ServiceBean.onApplicationEvent()——Spring 容器启动后触发 2.2 export() → doE...
Netty 线程模型详解
Netty 的高性能离不开其精巧的线程模型。从 Boss 线程接收连接到 Worker 线程处理 IO,主从 Reactor 模型如何落地? 一、Netty 线程模型概述 1.1 BossGroup 和 WorkerGroup 的职责划分 1.2 EventLoop——Netty 的线程抽象 1.3 一个 EventLoop 绑定一个线程——thread-safe 的保证 二、EventLoopGroup 的创建 2.1 NioEventLoopGroup——Boss / Worker 的创建 2.2 线程数设置——new NioEventLoopGroup(1) vs ...
RocketMQ 事务消息在订单场景的落地
下单扣库存 + 发送消息,如何保证两个操作的一致性?RocketMQ 的事务消息提供了一套优雅的解决方案。 一、分布式事务的诉求 1.1 订单创建 + 发送”订单创建成功”消息的场景 1.2 如果先创建订单后发消息——消息可能没发出去 1.3 如果先发消息后创建订单——订单可能没创建成功 二、RocketMQ 事务消息的原理 2.1 两阶段提交——发送 half 消息 → 执行本地事务 → 提交/回滚 2.2 Half 消息——对消费者不可见 2.3 事务状态回查——checkLocalTransaction() 2.4 TransactionListener 接口——e...
Kafka 消息可靠性设计
消息中间件最怕两个问题:丢了和重了。本文从 Producer、Broker、Consumer 三个角度给出完整的可靠性设计方案。 一、消息可靠性的三端模型 1.1 Producer → Broker → Consumer 的传递链路 1.2 每一端都有丢失的可能 1.3 “至少一次” vs “最多一次” vs “精确一次” 二、Producer 端——保证发送不丢失 2.1 acks = -1(all)——所有 ISR 副本确认 2.2 retries 重试机制——网络抖动导致临时失败 2.3 max.in.flight.requests.per.connection——重试引发乱...
Kafka 高性能原理
Kafka 为什么这么快?PageCache、sendfile、顺序写盘——这些底层技术的巧妙组合成就了 Kafka 的超高吞吐。 一、Kafka 的 IO 模型 1.1 基于磁盘的消息持久化——不是内存队列 1.2 为什么用磁盘还能这么快——六字秘诀”顺序写 + 零拷贝” 1.3 传统 IO 的 4 次拷贝 + 4 次上下文切换 二、零拷贝(Zero Copy) 2.1 sendfile() 系统调用——DMA 直接传输 2.2 2 次拷贝 + 2 次上下文切换 2.3 mmap() 内存映射——另一种零拷贝 2.4 Kafka 中的 FileChannel.transferTo...
缓存击穿穿透雪崩处理方案
面试必问的”缓存三兄弟”——击穿、穿透、雪崩。本文将三者放在同一场景下,给出从识别到解决的完整方案。 一、三种问题的定义与区别 1.1 缓存穿透——查询不存在的数据,缓存和数据库都没有 1.2 缓存击穿——热点 key 过期,大量请求打到数据库 1.3 缓存雪崩——大量 key 同时过期或 Redis 宕机 1.4 一张图区分三种场景 二、缓存穿透的解决方案 2.1 布隆过滤器——原理与实现 2.2 布隆过滤器在 Redis 中的应用——RedisBloom 模块 2.3 Guava BloomFilter 的本地实现 2.4 缓存空值——简单但有局限性 2.5 参数校验——在网关...
Redis 分布式锁实现方案
从最简单的 SETNX 到 Redisson 的看门狗机制,再到 RedLock 算法,分布式锁的演进中包含了多少并发安全的设计思想。 一、分布式锁的核心要求 1.1 互斥性——同一时刻只有一个客户端持有锁 1.2 防死锁——锁的持有者崩溃后锁能被释放 1.3 解铃还须系铃人——谁加的锁只能谁来解 1.4 可重入性——同一客户端可重复获取 二、V1:SETNX + EXPIRE 的原子性问题 2.1 SETNX key value + EXPIRE key ttl——两步不是原子的 2.2 在 SETNX 和 EXPIRE 之间崩溃 → 死锁 2.3 Redis 2.6.12 之前...
Redis String 类型详解
Redis 的 String 类型能存数字、能存 JSON、能存二进制,底层到底用了什么数据结构?其他类型的内部编码又是什么? 一、RedisObject——一切数据的基础 1.1 type——对外暴露的类型(String/List/Hash/Set/ZSet) 1.2 encoding——内部编码(int/embstr/raw/ziplist/skiplist 等) 1.3 ptr——指向实际数据的指针 1.4 refcount——引用计数,用于共享对象 二、String 的三种内部编码 2.1 in...
Spring Boot 启动流程源码剖析
一行 SpringApplication.run() 背后发生了什么?从 main 方法到 Tomcat 启动,全程拆解 Spring Boot 的启动流程。 一、启动入口 SpringApplication.run() 1.1 @SpringBootApplication 的三个核心注解 1.2 创建 SpringApplication 实例——推断应用类型(Servlet/Reactive) 1.3 设置 Initializers 和 Listeners——SPI 机制获取 二、Environment 准备 2.1 prepareEnvironment()——加载配置...