奈飞的 Pushy:可扩展 WebSocket 平台的演进,可处理 100Ms 的并发连接

作者:Rafal Gancarz
  • 2024-10-29
    北京
  • 本文字数:1295 字

    阅读完需:约 4 分钟

奈飞(Netflix)分享了 Pushy 的演进细节,它是一个 WebSocket 消息投递平台,支持公司产品在许多不同设备上的推送通知和设备之间的通信。奈飞(Netflix)的工程师对 Pushy 生态系统进行了大量的改进,以确保平台的可扩展性和可靠性,并支持新功能。

Pushy 是服务生态系统的一个重要组成部分,它向运行在各种设备上的奈飞(Netflix)应用程序发送通知消息,包括电视、游戏机、手机和网络浏览器。它作为奈飞(Netflix)平台的一部分已经存在很多年了,Susheel Aroskar 曾在 2018 年纽约 QCon 上谈到了 Zuul Push,讨论了它的动机、目标和最初的设计。

在最近的一篇博客文章中,奈飞(Netflix)的软件工程师 Karthik Yagna、Baskar Odayarkoil 和 Alex Ellis 讨论了 Pushy 使用的历史增长以及平台现代化的必要性:

在过去的五年里,Pushy 已经从数千万个并发连接发展到数亿个并发连接,并且每秒发送的消息数经常达到 30 万条。为了支持这一增长,我们重新审视了 Pushy 过去的假设和设计决策,着眼于 Pushy 未来的角色和未来的稳定性。

工程师们对通知投递中涉及的许多服务进行了改进,在考虑可扩展性、性能和可靠性的情况下完全重写了一些服务。为了解决了 Pushy 的可扩展性问题,该团队切换到了更高性能且更具成本效益的实例类型,并将每个节点的平均并发连接数从 6 万个增加到 20 万个,剩余空间增加到 40 万个。该服务还依赖于基于连接数量的指数级扩展策略,以便在服务器池中均衡连接数。

Pushy 生态系统的演进(来源:Netflix 技术博客)

此外,该公司用内部开发的通用键值数据库服务 KeyValue 取代了来自奈飞(Netflix)开源 Redis 包装器 Dynomite 的通知投递流(Push Registry)中的缓存实现。基于 Mantis 作业的消息处理器,被重新设计成一个独立的 Spring Boot 服务,该服务使用 Apache Kafka 的主题消息,以利用自动水平扩展、金丝雀和红 / 黑部署,以及更高的可观测性。

多年来,奈飞(Netflix)的通知投递用例发生了很多变化,越来越强调从异步投递转向直接(同步)推送和设备到设备的消息投递。新功能需要平台中的新组件,例如设备列表服务 (Device List Service),它提供了查找使用同一帐户注册的客户设备的能力。该服务与 Push Registry 相结合,实现了涉及源和目标 Pushy 实例的设备之间的消息传递。

设备间消息传递支持(来源:Netflix 技术博客)

该团队创建了一个内部协议栈,以支持许多定制的消息投递用例,它具有三个不同的层:WebSocket 和 Pushy、设备到设备的协议和客户端应用程序协议。设备到设备的协议使用 JSON 在设备之间传输应用程序级消息。

消息投递平台的进一步优化包括缓存目标设备数据以缩短查找时间、WebSocket 连接管理和调优,以及切换到 OkHttp 客户端。

作者介绍

Rafal Gancarz 是一位经验丰富的技术领导者和专家。目前,他正在帮助星巴克打造具有可扩展性、弹性和成本效益的商务平台。此前,Rafal 曾为思科、埃森哲、凯德、ICE、Callsign 等公司设计和构建大规模、分布式和基于云的系统。他的兴趣涉及架构与设计、持续交付、可观测性和可操作性,以及软件交付的社会技术和组织方面。

原文链接:

https://www.infoq.com/news/2024/09/netflix-pushy-websocket/