声明:学习完李运华《从 0 开始学架构》,有一种醍醐灌顶,豁然开朗的感觉。为了能够对其概念有一个深入的理解,并且掌握其总结的方法论。特意对本课程做一个提炼,形成自己的知识体系。毕竟能给别人讲清楚了,才能说明自己真的掌握了。本文的引用仅限自我学习如有侵权,请联系作者删除。
高性能架构设计的设计点在哪里?
(1)尽量提升单服务器的性能,将单服务器的性能发挥到极致。
(2)如果单服务器无法支撑性能,设计服务器集群方案。
(3)具体的实现及编码,架构设计决定了系统性能的上限,实现细节决定了系统性能的下限。
单服务器高性能的关键点是什么?
(1)服务器如何管理连接(I/O 模型:阻塞、非阻塞、同步、异步)
(2)服务器如何处理请求(进程、多进程、多线程)
单服务器高性能模式有哪些?
(1)PPC:Process Per Connection,每次有新的连接就新建一个进程去专门处理这个连接的请求。

变体prefork:PPC 模式中,当连接进来时才 fork 新进程来处理连接请求,由于 fork 进程代价高,用户访问时可能感觉比较慢,prefork 模式的出现就是为了解决这个问题。prefork 就是提前创建进程(pre-fork),让用户访问更快、体验更好。如下:

应用场景:prefork 模式和 PPC 一样,还是存在父子进程通信复杂、支持的并发连接数量有限的问题,因此目前实际应用也不多
(2)TPC:Thread Per Connection,每次有新的连接就新建一个线程去专门处理这个连接的请求。其含义是指每次有新的连接就新建一个线程去专门处理这个连接的请求。与进程相比,线程更轻量级,创建线程的消耗比进程要少得多;同时多线程是共享进程内存空间的,线程通信相比进程通信更简单。

变体prethread:和 prefork 类似,prethread 模式会预先创建线程,然后才开始接受用户的请求。

应用场景:Apache 服务器会首先创建多个进程,每个进程里面再创建多个线程,Apache 服务器 MPM worker 模式默认支持 16 × 25 = 400 个并发处理线程
(3)Reactor:PPC 模式最主要的问题就是每个连接都要创建进程,连接结束后进程就销毁了,这样做其实是很大的浪费。为了解决这个问题,一个自然而然的想法就是资源复用,即不再单独为每个连接创建进程,而是创建一个进程池,将连接分配给进程,一个进程可以处理多个连接的业务。Reactor 模式也叫 Dispatcher 模式(在很多开源的系统里面会看到这个名称的类,其实就是实现 Reactor 模式的)是“事件反应”的意思。即 I/O 多路复用统一监听事件,收到事件后分配(Dispatch)给某个进程。可以理解为"来了一个事件我就有相应的反应",此为"同步"。
应用场景:Nginx 采用的是多 Reactor 多进程的模式。
(4)Proactor:Reactor 是非阻塞同步网络模型,因为真正的 read 和 send 操作都需要用户进程同步操作。这里的“同步”指用户进程在执行 read 和 send 这类 I/O 操作的时候是同步的,如果把 I/O 操作改为异步就能够进一步提升性能,这就是异步网络模型 Proactor。而 Proactor 可以理解为“来了事件我来处理,处理完了我通知你”,此为"异步"。
应用场景:理论上 Proactor 比 Reactor 效率要高一些,异步 I/O 能够充分利用 DMA 特性,让 I/O 操作与计算重叠,但要实现真正的异步 I/O,操作系统需要做大量的工作。目前 Windows 下通过 IOCP 实现了真正的异步 I/O,而在 Linux 系统下的 AIO 并不完善,因此在 Linux 下实现高并发网络编程时都是以 Reactor 模式为主。
我是快乐的一只,一只快乐的我。如果我的文章对你有所帮助,请随手点个在看吧,您的鼓励将是我坚持创作下去最大的动力。
公众号请搜索:“快乐的一只”

本文探讨了高性能架构设计的关键点,包括提升单服务器性能、服务器集群方案等。详细介绍了PPC、TPC、Reactor和Proactor四种单服务器高性能模式及其应用场景。

1175

被折叠的 条评论
为什么被折叠?



