目录

  1. 总结对比
  2. 各模型原理简介
  3. 经典实现

1. 总结对比

模型核心机制适合场景复杂度
多线程/线程池OS 调度计算密集型、小规模并发
协程 (Coroutines)用户态调度高并发 Web 服务、I/O 密集型低 (开发体验好)
事件驱动 (NIO)状态机/回调网关、长连接、代理服务
Actor(Message Passing)消息传递分布式、高可靠、无锁化设计
Disruptor无锁环形队列超高吞吐、极低延迟 (金融/日志)极高

2. 各模型原理简介

基于多线程的任务并行 (Thread-based / Preemptive Multitasking)

这是最传统、也是你提到的线程池所属的范畴。

flowchart LR Client[Client Requests] --> ES[ExecutorService] ES --> Queue[Blocking Queue] ES --> WT[Worker Threads] Queue --> WT WT --> Task[Run Task] WT --> Queue OS[OS Scheduler] -. time slice .- WT

协作式多任务:协程 (Coroutines / User-level Threads)

这是你提到的第二种,也是目前高并发的主流。

flowchart LR App[App] --> G[Goroutines] G --> Sch[Go Scheduler] Sch --> P[P: Processor] P --> M[M: OS Thread] M --> OS[Kernel]

事件驱动与非阻塞 I/O (Event-driven / NIO)

这是 Node.jsNetty 能够支撑高并发的秘密。

flowchart LR Client[Clients] --> Channel[Channel] Channel --> EventLoop[EventLoop Group] EventLoop --> Selector[NIO Selector/epoll] EventLoop --> Pipeline[ChannelPipeline] Pipeline --> H1[Handler In] H1 --> H2[Handler Out] H2 --> Channel
flowchart LR C1[Client 1] --> EV[Redis Event Loop] C2[Client 2] --> EV C3[Client N] --> EV EV --> EP[epoll/IO Multiplexing] EV --> Q[Command Queue] Q --> Exec[Single-thread Execute] Exec --> EV

Message Passing

Actor模型

这是一种完全不同的思维方式,常见于分布式系统或高可靠应用(如 WhatsApp 的后端)。

flowchart LR A1[Actor A] --> M1[Mailbox A] A2[Actor B] --> M2[Mailbox B] A3[Actor C] --> M3[Mailbox C] M1 --> A1 M2 --> A2 M3 --> A3 A1 -- message --> M2 A2 -- message --> M3 A3 -- message --> M1

CSP 模型 (Communicating Sequential Processes)

这是 Go 语言设计的核心理念。

flowchart LR P1[Producer 1] --> Ch[(Channel)] P2[Producer 2] --> Ch Ch --> C1[Consumer 1] Ch --> C2[Consumer 2]

LMAX Disruptor (无锁环形缓冲区)

如果你追求的是极低延迟的单机高并发(比如高频交易系统),这是顶级方案。

flowchart LR P1[Producer 1] --> RB[Ring Buffer] P2[Producer 2] --> RB RB --> C1[Consumer 1] RB --> C2[Consumer 2] C1 -. sequence .- RB C2 -. gating .- RB

3. 经典实现

线程池

Java ThreadPool

原理:线程池通过预先创建一定数量的线程,复用这些线程来执行大量短生命周期的任务,避免频繁创建/销毁线程的开销。

核心架构 D2 图示:

D2 Diagram
qtopie.github.io

优势:

典型应用:Web 服务器、RPC 框架、异步任务调度

简单代码示例:

ExecutorService pool = new ThreadPoolExecutor(4, 8, 60, TimeUnit.SECONDS,
	new LinkedBlockingQueue<>());
pool.submit(() -> System.out.println("Hello ThreadPool"));
pool.shutdown();

协程

Go Routine

原理:Goroutine 是 Go 运行时调度的用户态线程,创建和切换开销极小。通过 channel 实现 CSP 并发通信。

核心架构 D2 图示:

D2 Diagram
qtopie.github.io

优势:

典型应用:Web 服务、爬虫、分布式系统

简单代码示例:

go func() {
	fmt.Println("Hello Goroutine")
}()

事件驱动

Netty

原理:基于 Java NIO,采用 Reactor 事件驱动模型,单线程可处理成千上万连接。

核心架构 D2 图示:

D2 Diagram
qtopie.github.io

优势:

典型应用:分布式系统通信、微服务网关

简单代码示例:

EventLoopGroup boss = new NioEventLoopGroup();
ServerBootstrap b = new ServerBootstrap();
b.group(boss, new NioEventLoopGroup())
 .channel(NioServerSocketChannel.class)
 .childHandler(new ChannelInitializer<>() {
	 protected void initChannel(SocketChannel ch) {
		 ch.pipeline().addLast(new MyHandler());
	 }
 });
b.bind(8080);

Redis 单线程事件循环

原理:单线程事件循环,I/O 多路复用,极致优化命令处理路径。

优势:

典型应用:缓存、消息队列、排行榜等


Actor模型

Akka

原理:基于 Actor 模型,每个 Actor 独立、无共享状态,通过消息传递通信。天然无锁,易于扩展。

核心架构 D2 图示:

D2 Diagram
qtopie.github.io

优势:

典型应用:IM、分布式任务调度、金融风控

简单代码示例(Scala):

class HelloActor extends Actor {
	def receive = {
		case msg: String => println(s"Hello $msg")
	}
}
val system = ActorSystem("sys")
val actor = system.actorOf(Props[HelloActor])
actor ! "Akka"

Disruptor

LMAX Disruptor

原理:采用无锁环形缓冲区,利用 CAS 原子操作和缓存行填充,极大减少延迟和上下文切换。

核心架构 D2 图示:

D2 Diagram
qtopie.github.io

优势:

典型应用:金融高频交易、日志系统、实时数据处理

无锁环形缓冲区,极致低延迟,常用于金融高频交易、日志系统等。