事件驱动是基本概念,这里不做赘述,参见上篇文章 事件驱动架构。
一、事件驱动
事件驱动是一种编程范式或系统设计模式,其核心思想是:程序的执行流程由外部事件(如用户操作、消息、传感器信号等)触发,而非传统的顺序执行。在这种模式下,程序会监听并响应各种事件,每个事件会触发相应的处理函数(回调函数)。
- 异步性:事件的发生和处理通常是异步的,程序不会阻塞等待事件,而是继续执行其他任务。
- 事件循环:通过一个事件循环不断监听事件队列,当事件发生时,调用对应的回调函数。
- 解耦:事件的产生者和处理者相互独立,通过事件机制通信,降低模块间的耦合度。
二、Actor模型
Actor 的核心结构和工作流
Actor 模型是一种用于处理高并发计算的编程模型。它的核心思想是:万物皆 Actor,每个 Actor 之间通过异步消息进行通信,每个 Actor 独立处理自己的状态,没有共享内存。

图解说明:
- 邮箱:每个 Actor 都有一个专属的消息队列(邮箱)。其他 Actor 发送的消息会先在此排队,等待被处理。这保证了消息的异步和有序传递。
- 行为逻辑:这是 Actor 的“大脑”。它从邮箱中一次取出一个消息进行处理。这种单线程处理方式天然避免了锁的竞争。
- 本地状态:Actor 可以拥有自己的私有数据(状态)。只有它自己能修改其状态,外部只能通过发送消息来请求其改变。这是实现“状态隔离”和“无共享”的关键。
- 处理消息后,Actor 可以做出三种响应:
- 发送消息:给其他 Actor(如
ActorB)或自己发送新消息。 - 创建新 Actor:动态创建更多的 Actor 来分担工作。
- 改变自身行为:为处理下一条消息准备不同的逻辑(成为有限状态机)。
- 发送消息:给其他 Actor(如
Actor模型和传统线程模型对比
Actor模型:

状态存储:私有状态。每个 Actor 独占自己的数据,绝不共享。
通信方式:通过异步消息进行显式通信,发送即忘,无需等待。
并发问题:天然规避了锁和死锁问题,因为状态内部是串行修改的。
扩展性:高度可扩展。Actor 是轻量级实体(非线程),可以创建数百万个,并可在集群中透明分布。
传统线程模型

状态存储:共享内存。多个线程可访问和修改同一数据。
通信方式:通过共享变量进行隐式通信,需要复杂的同步机制(锁、信号量)。
并发问题:极易产生竞态条件、死锁等问题,调试困难。
扩展性:受限于共享资源的竞争,扩展性有瓶颈。
总结:Actor 模型通过消息传递和状态隔离,将复杂的并发问题分解为简单的、独立运行的组件,从而优雅地解决了传统并发编程中的诸多难题
三、Reactor模式
3.1事件驱动模式对比
Reactor模式的核心是事件驱动,它通过一个或多个线程来监听和分发事件,然后将事件处理交给相应的处理器。根据Reactor的数量和线程池的使用情况,可以分为以下三种模型:单Reactor单线程模型、单Reactor多线程模型、主从Reactor多线程模型
传统阻塞I/O模型 (每个连接一个线程)

Reactor事件驱动模型 (少量线程处理大量连接)

3.2 核心组件关系图

3.3 事件循环流程

3.4 Reactor三种模型
图例说明
- Reactor:事件分发中心,负责监听和分发事件。
- Event Demultiplexer:同步事件分离器,底层使用I/O多路复用技术(如select、poll、epoll、kqueue)等待事件发生。
- Event Dispatcher:事件分发器,将就绪的事件分发给对应的事件处理器。
- Acceptor:处理连接事件,接受新连接并创建对应的Handler,注册到Reactor(或SubReactor)中。
- Handler:处理非连接事件,如读、写事件。通常将耗时的业务处理交给线程池。
- Worker Thread Pool:工作线程池,处理业务逻辑,避免阻塞Reactor线程。
3.4.1单Reactor单线程模型
所有操作都在一个线程内完成,包括I/O和业务处理。

3.4.2.单Reactor多线程模型
Reactor线程只处理I/O,业务处理交给线程池。

3.4.3.主从Reactor多线程模型
Reactor模式通过事件驱动和异步处理,实现了高并发服务器架构。不同的线程模型可以根据实际场景进行选择,以达到最佳性能。

四、实时音视频服务设计与实现
仅以视频业务做讲解,图片业务类似
