奈飞(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/
评论