写点什么

[大厂实践] Twitter 客户端负载均衡实践

作者:俞凡
  • 2025-10-26
    上海
  • 本文字数:2137 字

    阅读完需:约 7 分钟

本文介绍了 Twitter 在客户端负载均衡技术方面的实践,以牺牲中心化控制为代价,构建更高性能的负载均衡系统。原文:Client-Side Load Balancing: Concepts, Benefits & Practical Uses



当我们运行数千后端服务时,即使路由上的一个小延迟也会减慢所有服务的速度。客户端负载均衡将路由决策从中间层转移到客户端,从而减少开销并提高了速度。Twitter 就采用了这种模式,从而满足业务需求,避免路由瓶颈。我们来看看这种模式是如何工作的,以及为什么重要。

什么是客户端负载均衡?

传统负载均衡依赖于中央路由器,这个中间层会接收每一个客户端请求,并将其转发到后端服务器。路由器是整个路径中的关键部分。


客户端负载均衡消除了这一额外传输环节。每个客户端都会收到一份可用后端服务器列表,将这份列表存储在本地,并据此决定将请求发送至何处。这使得路由过程更快、更可靠,也更易于扩展。


不再是由一台路由器独自承担所有工作,而是每个客户端都分担相应的任务。


客户端负载均衡的优势

  1. 降低延时


请求直接从客户端发送至服务器,无需经过中央路由器,从而避免因路由器而产生的延迟问题。


  1. 无单点故障


如果某个客户端出现问题,其他客户端仍能继续正常工作。整个系统不存在可能导致整体崩溃情况的单一关键节点。


  1. 更优的流量分配


每个客户端都会自行分配流量,将负载均匀分配到所有服务器上。


  1. 本地控制


客户端会根据实时反馈做出路由决策,可以迅速重试,也可以在必要时暂停操作。


  1. 易于扩展


随着服务增多,添加新的客户端或服务器并不会使中央路由器不堪重负,该系统能够自然的进行扩展。

Twitter 如何使用客户端负载均衡

Twitter 使用名为 Finagle 的库来管理服务之间的通信。此外还构建了名为 Aperture 的客户端负载均衡器。该系统能够处理跨数千微服务的请求路由。


Aperture 利用一组虚拟服务器,为每个客户端分配一小块区域。这种方法有助于 Twitter 保持请求路由的快速且公平性。随着时间推移,Twitter 对四种不同的 Aperture 系统进行了试验。

Aperture 类型


  1. Mesh topology(网状拓扑)



在网状架构中,每个客户端都与每个服务器建立连接。这种方式能提供最大的可见性,但连接成本很高。


  • 在小型系统中运行良好

  • 但在大型集群中无法扩展

  • 存在过多的开放连接和过高的内存使用量


Twitter 很早就摒弃了这种设计。


  1. **Random aperture(随机孔径)


每个客户端都会随机连接到后端服务器的一组子集。


  • 易于实施

  • 减少连接数量

  • 但随机性可能会导致不均衡。一些客户端可能会连接到较慢的服务器。


  1. 确定性孔径 —— 离散环结构



这是 Twitter 最常用的方法。服务器以固定的环形排列方式布置,每个服务器根据一致性哈希获得固定位置。


  • 客户端获得固定大小的窗口(即 aperture),进入环形区域

  • 窗口基于客户端 ID 设定,因此是稳定的

  • 请求会被均匀且可预测的分发


如果需要,窗口大小可根据流量情况进行扩大或缩小,从而在不使服务器过载的情况下更易于管理负载。


  1. 确定性孔径 —— 连续环结构



此版本采用连续哈希空间(类似于从 0 到 1 的一个圆环)。服务器根据权重或容量被映射到该空间中。


  • 客户端从哈希环中选择分段

  • 适用于服务器负载变化的情况

  • 更具灵活性,但稍微复杂一些


无论是离散环还是连续环,都能提供强大的控制功能,能帮助 Twitter 在数百万次请求中管理延迟和公平性。

实际运作方式

客户端会记录每次请求所花费的时间。如果延迟增加或队列变长,就会扩大窗口大小,连接更多服务器。如果流量减少,就会缩小窗口大小。


在该窗口(Aperture)内,Twitter 采用二进制幂次选择(P2C)的方式来选定服务器:


  • 从该窗口中随机选取两个服务器

  • 将请求发送至当前待处理请求较少的那个服务器


这种方法简单却有效,能够避免热点问题,并保证响应时间。

另一个用例:Lyft 的 Envoy

Lyft 采用 Envoy(一款开源边缘和服务代理工具),运行在每个服务内部,并负责处理客户端的路由。


与 Twitter 类似,Envoy 也从服务发现工具中获取到一组可用后端服务器列表,决定将流量发送至何处,重试失败的请求,并在本地记录指标数据。


这使得 Lyft 能够对流量进行精细控制,同时又能避免路由器过载。该架构有助于 Lyft 在数千个容器之间实现扩展。

客户端负载均衡的缺点

  1. 服务器列表过时:如果后端服务器崩溃,某些客户端可能不会立即察觉。

  2. 客户端复杂度增加:客户端必须处理路由逻辑、重试和延迟策略,增加了代码量和责任。

  3. 全局意识降低:每个客户端只能看到系统部分区域,可能会错过更广泛的趋势,比如全球负载分布不均。

  4. 内存使用量更高(在某些设计中):网状结构或大型窗口可能需要打开大量连接。

总结

客户端负载均衡以集中控制为代价换取速度和灵活性。Twitter 的 Aperture 系统使用智能算法和稳定的环形结构实现低延迟路由流量。其他公司,如 Lyft,也采用了类似设计。虽然这种方法增加了客户端复杂性,但消除了中心化瓶颈,在大规模应用中会产生巨大影响。




你好,我是俞凡,在 Motorola 做过研发,现在在 Mavenir 做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI 等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

发布于: 刚刚阅读数: 3
用户头像

俞凡

关注

公众号:DeepNoMind 2017-10-18 加入

俞凡,Mavenir Systems研发总监,关注高可用架构、高性能服务、5G、人工智能、区块链、DevOps、Agile等。公众号:DeepNoMind

评论

发布
暂无评论
[大厂实践] Twitter 客户端负载均衡实践_架构_俞凡_InfoQ写作社区