Reddit 引入 Envoy 支持架构改造,性能显著提升

阅读数:5038 2019 年 2 月 12 日 10:35

Reddit引入Envoy支持架构改造,性能显著提升

Reddit 引入 Envoy 到其后端框架,作为服务到服务代理以支持其正在进行的架构改进。通过采用 Envoy 作为服务到服务第 4 层 / 第 7 层代理,他们发现在可观察性、易采用性和性能上有显著的改进。

Reddit 引入 Envoy 到其后端框架,作为服务到服务代理以支持其正在进行的架构改进。随着其架构从单体架构发展到更小的服务,支持和调试其现有框架极为复杂,变得过于昂贵。通过采用 Envoy 作为服务到服务第 4 层 / 第 7 层代理,他们发现在可观察性、易采用性和性能上有显著的改进。

根据 Reddit 的资深软件工程师 Courtney Wang 的说法, 在过去的三年中,Reddit 工程团队的规模和产品复杂性上已经有了显著的增加。这与其后端架构的改进并行进行,因为他们从单一应用程序转向,开始采用更加面向服务的架构 。这些改变已经增加了他们调试其应用程序方式的复杂性,从调查函数调用转变成了跟踪多个服务之间的 RPC。此外,在提供新服务时,工程师需要考虑的注意事项数量也变多了,如今包括了解客户请求行为、重试处理、断路和粒度路由控制。

自从 Reddit 开始把服务从其整体中分离出来,他们一直在使用 Airbnb 的 SmartStack 作为其服务网格。当建立及拆除服务实例时,由SmartStack Nerve 处理注册问题。Nerve 是一个 Ruby 处理进程,在每个实例上运行边车并把它们注册到一个中央 Zookeeper 集群中。为了简化程序开发人员的工作,Reddit 开发了 Baseplate ,这是一个提供健康检查界面和连接到 Nerve 抽象层的通用框架。

Reddit 利用 Synapse (每个实例的 Ruby 进程)来管理其服务端点的发现。Synapse 读取 Nerve 填充的 Zookeeper 注册表,然后把端点条目写入本地 HAProxy 配置文件。HAProxy 作为边车进程运行,处理下流服务流量的代理和负载平衡。

Reddit引入Envoy支持架构改造,性能显著提升

最初的 Reddit 服务架构(来源: Reddit

尽管 SmartStack 的实现保持了相对不变和可操作性,但是,其不断发展的基础架构已经开始不断挑战 SmartStack 所能提供的极限。正如 Courtney Wang 所指出的,这导致团队重新评估服务网格的全景,看看替换它们是否有意义。他们希望解决的关键痛点是:

  • Nerve 和 Synapse 只能接受静态配置、服务注册更新所需的 Puppet 配置更改以及跨其服务集群的更新
  • Synapse 的 HAProxy 配置编写器只提供基本的路由定义
  • 由于 HAProxy 不理解 Thrift (Reddit 的主要内部协议),它们对通过 HAProxy 的流量的观察能力很低

在选取一个新的服务网格的候选者时,Courtney Wang 指出,他们的关键需求是确保对性能无影响、获得代理中的第 7 层 Thrift 的支持,并易于扩展及集成新工具。该团队决定采用 Envoy,因为它符合这些要求,并且他们认为这些权衡是可以接受的。

Envoy 最大的问题是缺乏一流 Thrift 的支持。Courtney Wang 回忆道,他们和 Turbine Labs(Turbine Labs 最近宣布支持 Envoy)合作,为 Thrift 支持合同开发。借助该合作关系,他们可以引入 Thrift 支持的代理路由、请求 / 响应指标和速率限制

他们部署 Envoy 的第一个步骤是取代 HAProxy 以获得基本的 TCP 代理支持。Nerve 和 Synapse 仍将处理服务注册和发现,这意味着它们将无法利用 Envoy 的动态发现服务。这允许他们保持其服务发现层的稳定,同时将 Envoy 部署到生产环境中。通过并行运行 HAProxy 和 Envoy,监听不同的端口,它们能够通过调整配置简单地回滚。这也允许它们针对其 HAProxy 配置审核 Envoy 配置,以验证其 Synapse 配置生成器的准确性。

Reddit引入Envoy支持架构改造,性能显著提升
引入 Envoy 过程中的 Reddit 架构(来源: Reddit

Courtney Wang 表示,Envoy 现在已经顺利地为生产流量服务了近 4 个月了。他说,没有停止的问题,但是,描述了 Envoy 的网络连接处理与 HAProxy 的不同,导致在应用程序连接管理代码中出现意外错误。

借助 Envoy 和新的 Thrift 过滤器,他们发现在网络层有更好的可观察性,包括请求和响应指标,它们在应用程序代码没有更改前是无法获得的。因为 HAProxy 仍然作为边车运行,以便在此过渡期间快速回滚,所以,它们还未能对服务延迟进行准确测量。

随着在代理级采用 Envoy 管理第 4 层流量的成功,Reddit 计划下一步是部署 Enovy 的发现服务 API,该 API 由集中式配置存储支持 。进一步达成的计划包括调查在边缘运行的 Envoy,以取代 HAProxy(针对核心 Reddit 后端应用程序服务)和 AWS ALBs(针对其部分外部入口点)作为负载平衡器。Courtney Wang 认为,这将提供更好的可观察性和服务路由控制,如:遮蔽入站流量和边缘的流量转移。最近,eBay 进行了类似的迁移,利用 Envoy 取代外部入口点的物理负载平衡器,并报告了 Courtney Wang 及团队所期望实现的一些成功。Courtney Wang 希望,更进一步采用 Envoy 将有助于团队把其单一的应用程序拆分成更小的服务。

阅读英文原文: Adopting Envoy as a Service-to-Service Proxy at Reddit

评论

发布