为了处理 TCP 连接,有两种相互竞争的 Web 架构,即基于线程的架构和事件驱动的架构。
基于线程的架构
实现多线程服务器的最古老方法是遵循“每个连接线程”方法。为了控制和限制运行线程的数量,可以使用单个调度程序线程以及有界阻塞队列和线程池。
调度程序在 TCP 套接字上阻塞新连接并将它们提供给有界阻塞队列。超出队列边界的 TCP 连接将被丢弃,允许接受的连接以理想且可预测的延迟运行。
事件驱动架构
将线程与连接分离,事件驱动架构只允许线程用于特定处理程序上的事件。
这个创意概念让 Reactor Pattern 脱颖而出并大显身手。基于此架构构建的系统由事件创建者和事件消费者组成。
反应堆模式
反应器模式是用于 TCP 连接处理的事件驱动架构最流行的实现技术。简单来说,它使用单线程事件循环,阻塞事件并将这些事件分派给相应的处理程序。
只要注册了事件处理程序来处理它们,其他线程就不需要阻塞 I/O。考虑 TCP 连接,我们可以轻松地将事件引用到这些实例:已连接、输入就绪、输出就绪、超时和断开连接。
反应器模式将模块化应用程序级代码与可重用反应器实现分离。为了实现这一点,reactor 模式的架构由两个重要的参与者组成 —— Reactor 和 Handler。
反应堆
Reactor 在单独的线程中运行,它通过将工作分派给适当的注册处理程序来对 I/O 事件(例如已连接、输入就绪、输出就绪、超时和断开连接)做出反应。
处理程序
处理程序执行实际工作或需要通过 I/O 事件完成的响应。 Reactor 通过调度适当的处理程序来响应 I/O 事件。
Jim Coplien 和 Douglas C. Schmidt 于 1995 年出版的“程序设计的模式语言”是详细解释反应堆模式的书籍之一。