🏭 第 7 章 · 实战应用

Redis / Nginx / Netty 的事件循环 · 三种 Reactor 形态 · 惊群修复

① 三种 Reactor 部署形态对比

点击切换查看:单 Reactor 单线程(Redis 5.x)、单 Reactor + 工作线程池、多 Reactor 主从(Nginx / Netty)。

① 单 Reactor + 单线程 (Redis)
② 单 Reactor + 工作池
③ 多 Reactor 主从 (Nginx/Netty)
→ 选择一个模式后点击播放

② Redis / Nginx / Netty 架构差异速查

🔴 Redis

事件循环: 1 个主线程
触发模式: LT(水平触发)
关键文件: ae.c / ae_epoll.c
多核利用: 多个 Redis 实例 + 集群
6.0 新特性: IO Threads(仅网络读写并行)
跨平台: ae.c 抽象层 (epoll/kqueue/evport)
哲学: 简单为美,单线程无锁

🟢 Nginx

事件循环: 1 master + N worker(每核 1 个)
触发模式: ET(边沿触发)
关键文件: ngx_epoll_module.c
多核利用: 进程隔离,每核一个 worker
惊群: accept_mutex 或 SO_REUSEPORT
跨平台: ngx_event_actions (epoll/kqueue/select)
哲学: 极致性能,进程隔离

🟣 Netty

事件循环: 1 boss + N worker(线程)
触发模式: ET (EpollEventLoop)
关键类: EpollEventLoop / NioEventLoop
多核利用: 线程池 + 主从 Reactor
惊群: SO_REUSEPORT (Linux 3.9+)
跨平台: EventLoopGroup 抽象
哲学: 通信框架,职责分离

③ 惊群(Thundering Herd)问题演示

多个 worker 都在 epoll_wait 同一个 listen_fd——一个新连接来时谁会被唤醒?观察不同方案的差异。

📡 一个新连接到达 listen_fd...
→ 选择方案后点击"模拟连接到达"