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

2019 年 2 月 12 日

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 服务架构(来源: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配置生成器的准确性。



引入 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


2019 年 2 月 12 日 10:356064
用户头像

发布了 199 篇内容, 共 64.9 次阅读, 收获喜欢 270 次。

关注

评论

发布
暂无评论
发现更多内容

leetcode练级-只出现一次的数字

幸福三寸日光

算法 LeetCode js

Python 3.6.1 官方文档练习——初入江湖(三)

Sicolas Flamel

Python python教程

【应用异常监控利器Sentry搭建与学习笔记】

卓丁

golang Docker Sertry Fasthttp CI/CD

字节跳动:高级人才的五个基本素质

池建强

人才培养

“数据资产”究竟是“数据”还是“资产”

马踏飞机747

大数据 数据中台 数据治理 数据资产

Mobileye如何在云上进行深度学习模型训练

Randy

自动驾驶 学习 AI AWS

手把手透析C语言堆内存申请malloc及扩容realloc

卓丁

c 堆内存管理 heap memory malloc realloc

Lucene的Smart CN实现分词、停用词、扩展词

Page

中文分词 lucene 停用词 扩展词 SmartCN

Service Provider Interface介绍

Skysper

spi

职位拆解:互联网-运营

Breeze

行业资讯 移动互联网 运营 AARRR

ARTS打卡 week 1

猫吃小怪兽

ARTS 打卡计划

John 易筋 ARTS打卡Week 01

John(易筋)

ARTS 打卡计划

鄙视链 & 全栈

伯薇

学习 能力提升 全栈

Kubernetes 资料集合

倪朋飞

学习 Kubernetes 架构模式

向往优雅的代码

Janenesome

编码习惯 读书

Linux如何调试内存泄漏

程序喵大人

c c++ C#

我的读书生涯-小学到大学: 没有成长, 只有不断加深的疑惑

lmymirror

人生 读书 经历 半虚构

Spring Data R2DBC 入门

稻草鸟人

MySQL WebFlux springboot R2DBC

LeetCode 1048. Longest String Chain

liu_liu

LeetCode

你所不知道的淘宝325秘密

毒手疯波

ios 淘宝 325

ARTS week 1

刘昱

Java 火焰图

wong

Java flamegraph

修改Tomcat窗口的名称

阡陌r

Java tomcat 踩坑 实施

LeetCode 241. Different Ways to Add Parentheses

liu_liu

LeetCode

游戏夜读 | 刀塔选手比较老吗?

game1night

ARTS 第一周

Forelax

ARTS 打卡计划

【ARTS】Week 1

Amos

ARTS 打卡计划

leetcode练级-只出现一次的数字 升级版

幸福三寸日光

算法 LeetCode js

我的 Windows Terminal 配置

FeiLong

Windows Terminal

ARTS 01 - 为什么写作在远程工作中那么重要?

Calvin

ARTS 打卡计划

转行程序员浅谈Linux下的多线程编程

WB

Linux 多线程 转行程序员

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