前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >案例研究:Netflix通过gRPC提高开发者工作效率并击败惊群问题

案例研究:Netflix通过gRPC提高开发者工作效率并击败惊群问题

作者头像
CNCF
发布2019-12-05 13:37:27
1.1K0
发布2019-12-05 13:37:27
举报
文章被收录于专栏:CNCFCNCF
案例研究:Netflix

Netflix:通过gRPC提高开发者工作效率并击败惊群问题

公司:Netflix

地点:加利福尼亚州洛斯加托斯

行业:流媒体供应商

挑战:

Netflix使用HTTP/1.1开发了自己的技术堆栈,用于服务间通信,覆盖了为Netflix产品提供动力的总微服务的98%。几年来,这一堆栈支持了公司流媒体业务的强劲增长。但到2015年,平台团队意识到它还“使我们正在努力的一些架构模式永久化,并且大规模影响了工程的生产力,”运行平台工程总监Tim Bozarth说。用于与远程服务交互的客户端通常包含手写代码,这非常耗时,“有机会产生问题,引入的错误,以及产生额外的复杂性,”他说。此外,当团队构建定义API的服务时,没有明确的方法来注释和准确描述API的功能,从而使发现、审计和理解生态系统中可用的API变得具有挑战性。为了寻找新的解决方案,该团队还希望服务客户端跨语言工作,重点是Java和Node.js.

解决方法:

有人在内部构建RPC堆栈,但经过长达一个月的多项技术评估后,运行平台团队选择实现并扩展gRPC。“在将所有这些职责集中在一个易于使用的软件包中,这方面gRPC处于领先地位,”Bozarth说。gRPC是由Google开发的高性能RPC(远程过程调用)框架,针对云原生计算环境的大规模,多平台特性进行了优化。它跨语言、云和数据中心连接服务,并将移动设备连接到后端服务器。

影响:

作为团队最大驱动力的开发人员生产力得到了很大提升。例如,对于每个客户端,数百行的自定义缓存管理代码被原型中的2-3行配置所取代。创建一个可能需要2-3周的客户端现在只需几分钟。结果,上市时间减少了几个数量级。此外,客户端不再包含手写代码这一事实意味着与远程服务交互时出现的错误要少得多。延迟也得到了改善。“我们看到了面向gRPC的服务P99延迟的惊人减少,”Bozarth说。 “我们还看到了延迟窗口一直在全面缩小。”


“有许多人为客户端的复杂性和运营的挑战而苦苦挣扎,他们选择在gRPC中重写他们的应用程序,因为gRPC带来的价值非常可观。” - TIM BOZARTH,平台工程总监,NETFLIX

对于等待下一季Stranger Things的1.3亿Netflix用户中的大多数,远程过程调用(RPC)可能并不意味着什么。

但对于负责提高公司开发人员生产力的运行平台团队而言,RPC正在成为构建和支持Netflix用户期望的高可用性服务的瓶颈。

Netflix已经开发了自己的技术堆栈,用于使用HTTP/1.1进行服务间通信,“所有服务通信的粘合剂”覆盖了Netflix产品总计98%的微服务,平台工程总监Tim Bozarth说。几年来,这一堆栈支持了公司流媒体业务的强劲增长。

但到2015年,Bozarth的团队意识到它还“使我们正在努力的一些架构模式永久化,并且大规模影响了工程的生产力,”他说。用于与远程服务交互的客户端通常包含手写代码,这非常耗时,“会产生问题的机会,引入的错误,以及繁殖的额外复杂性,”他说。此外,当团队构建定义API的服务时,没有明确的方法来注释和准确描述API如何运行或查看,审核和理解服务和生态系统存在哪些API。

“当我们选择gRPC时,我们认为它会得到采用,许多其他人在开源中构建有用的东西。我认为这个赌注在很大程度上得到了回报。” - WILLIAM THURSTON,高级软件工程师,NETFLIX

虽然该公司的其他人考虑在内部建立一个新的RPC系统,但Bozarth和团队开始对几种技术进行为期一个月的评估。最后,他们选择了gRPC。Bozarth说:“在将所有这些职责集中在一个易于使用的软件包中,这方面gRPC处于领先地位。我们最关心的事情是IDL(proto)中的架构理解,它被打包为gRPC的一部分,以及源自该proto的代码生成。到目前为止,这些对我们来说是最有趣的,因为它们解决了我们大规模面临的两个非常关键的问题:没有清晰的API以及大量的手写客户端代码。”

除了解决那些以生产力为导向的问题之外,团队还想要一个与Java没有特别结合的解决方案,因为Netflix的工程师也开始使用其他语言,比如Node.js、Python和Ruby,而gRPC在跨语言兼容性和代码生成提供承诺。Java应用程序的实现进展顺利,团队花了八个月在自己的内部RPC堆栈中存在的自定义部分移植和部署到gRPC环境中。

使gRPC与其他语言协同工作需要付出更多努力。“如果你有一个Java服务器和一个Node.js客户端,从协议的角度来看,跨语言生成和通信工作非常好,”Bozarth说。“在实际特征完整性和习语方面,其他语言中用于定制的机制有何不同。因此,使用Node.js,我们必须进行大量的增强和大量的包装。我们花了将近一年的时间来合并拦截器机制,但我们能够将整个拦截器层贡献给JavaScript。这是一个巨大的胜利。”(现在Node.js和Java之间的流量在Netflix上通过gRPC完成。)

“通过改变服务器如何利用gRPC机制自适应地限制并发性,我们已经能够有效地打败惊群问题。gRPC使它在架构上变得简单,我们能够以前所未有的方式着手。“ - TIM BOZARTH,平台工程总监,NETFLIX

随着gRPC的到位,开发者工作效率始终是团队最大的推动力,得到了很大的提升:例如,对于每个客户端,消除了数百行自定义缓存管理代码。“我们已经将一个非常繁琐,容易出错的过程转变为可能有两到三行注释,在原型文件中进行额外定义,我们只是为您生成这些交互,”高级软件工程师William Thurston说。创建客户端的时间从2-3周缩短到几分钟。“你可以在几分钟内开始运行应用程序,然后让在几个小时内完成应用程序,”Bozarth说。上市时间在使用gRPC前通常是三周,现在已经减少了几个数量级。

此外,客户端不再包含手写代码这一事实意味着这意味着已消除了常见的应用程序错误源。Thurston说:“它实际上是无错误的代码,因为它经过严格的审查和生成,可以提高生产力并降低运营负担。”

延迟也有效果。“我们已经看到了面向gRPC的服务P99的惊人减少,”Bozarth说。“我们还看到了延迟窗口一直在全面缩小。”

“我们相信,随着我们前进,gRPC对我们来说是一个非常强大而重要的基础。” - TIM BOZARTH,平台工程总监,NETFLIX

今天,Netflix的内部服务到服务通信的很大一部分都在gRPC上运行。“采用已取得成功并继续向前发展,特别是在Java领域,”Bozarth说。所有新的Java开发都是从支持gRPC的应用程序开始的。虽然没有重写现有应用程序,但他说,“有许多人为客户端的复杂性和运营挑战而苦苦挣扎,他们选择在gRPC中重写他们的应用程序,因为它的价值十分明显。”

该团队还发现gRPC对于涉及自适应并发限制的项目非常有价值 - 这对于任何需要最高服务可用性的业务来说都是一个关键问题 - 他们已经开源了。“通过使用gRPC技术改变服务器随时间自适应地改变并发限制,我们已经能够有效地打败惊群问题,”Bozarth说。 “gRPC使它在架构上变得简单。我们能够以前所未有的方式着手。”

作为gRPC的早期采用者,Bozarth和Thurston表示他们已经从社区中获益,就像他们所回馈的一样。“我们选择gRPC的原因之一就是我们打赌它会得到采用,并且会有很多其他人在开源中构建有用的东西,我认为很大程度上已经得到了回报,”Thurston说。

对Netflix来说,这是他们想身处的位置。“随着行业的变化以及新的、强大的技术的出现,我们在采用曲线上已经相当早,”Bozarth说。“但如果你正在尝试构建一个大型分布式系统,RPC对其长期成功至关重要。我们相信,随着我们前进,gRPC对我们来说是一个非常强大而重要的基础。”

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-12-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档