书接上文,如果我们真的搭建了一台拥有 25 个核心的虚拟机,并在上面安装了 Kong,它其实是无法承受五万 QPS 压力的——因为此时单机 TCP 连接数已经达到了十万以上,强如 Nginx 也顶不住的。
在经典的 HTTP 反向代理场景下,单机 Nginx 的 QPS 极限大约为一万,一旦超过这个限制,性能将不再增长甚至开始下降,用户体验也会迅速恶化。因此,我们需要对应用网关进行拆分。
从逻辑上讲,应用网关执行的是“反向代理+数据过滤”任务,并没有要求应用网关只能由一台服务器来承担。换句话说,应用网关理论上不是单点,只要多个节点的行为一致,它们就可以共同承担五万个 QPS 的真实用户流量。
我们只需要在多台机器上安装相同版本的应用网关软件,并在它们之间同步配置文件即可。Kong 采用的策略是让多个实例连接到同一个 PostgreSQL 数据库,每五秒钟从数据库获取一次最新的配置。如果数据库出现故障,那么它将保持内存中的现有配置继续运行。
Kong 集群追求的是“最终一致性”,而不是追求五秒钟的得失,这反而让系统格外地容易扩展,格外的健壮。在最后一章中,我们还将看到使用类似思维的“DNS 分布式拆分”。这种简单直接的思维颇具俄罗斯人暴力美学的典范,在后面讨论列存储 ClickHouse(俄罗斯人开发的开源列存储数据库)时还会出现。
应用网关拆分方案已经呼之欲出了——在多台应用网关前面放置一个 TCP 负载均衡器,系统架构如图 5-4 所示。
负载均衡器是一种将网络流量分发到多个计算资源(例如服务器、虚拟机、容器等)进行处理的设备,图 5-4 中的 TCP 负载均衡器就是俗称的“四层负载均衡”。在云计算兴起之前,负载均衡器主要依靠硬件实现,用于将单机无法承受的大流量分散到多台物理机上共同承担。如今,软件定义网络(SDN)已经通过廉价的商用硬件颠覆了这一领域,这是我们下一章的主题,到时会详细阐述。
除了提升系统容量外,负载均衡器还具备一些高级功能:
尽管应用网关和负载均衡器是两个不同的概念,但在容量不是特别大(例如不超过 1Gbps)的系统中,它们往往由同一个软件来扮演,例如 Kong 网关就同时具备这两种能力。
📙 高并发的哲学原理 《Philosophical Principles of High Concurrency》
Copyright © 2023 吕文翰