Netflixは、同社製品のプッシュ通知や様々なデバイス間の通信をサポートするWebSocketメッセージングプラットフォーム、Pushyの進化の詳細を共有した。Netflixのエンジニアは、プラットフォームのスケーラビリティと信頼性を確保し、新しい機能をサポートするために、Pushyのエコシステム全体で数多くの改善を実施した。
Pushyは、テレビ、ゲーム機、携帯電話、ウェブブラウザなど、さまざまなデバイス上で動作するNetflixアプリに通知メッセージを配信するサービスのエコシステムの重要な一部である。Netflixのプラットフォームのこの部分は数年前から存在しており、Susheel Aroskar氏はQCon New York 2018でZuul Pushについて語り、動機、目標、初期設計について議論した。
Netflixのソフトウェア・エンジニアであるKarthik Yagna氏、Baskar Odayarkoil氏、Alex Ellis氏は、最近のブログ投稿で、Pushyの歴史的な利用の伸びと、プラットフォームを近代化する必要性について議論した。
過去5年間で、Pushyは数千万の同時接続から数億の同時接続になり、定期的に毎秒30万メッセージを送信するようになった。この成長をサポートするために、Pushyの将来の役割と将来の安定性の両方を視野に入れて、Pushyの過去の仮定と設計上の決定を再検討した。
エンジニアは、スケーラビリティ、パフォーマンス、信頼性を念頭に置いて、通知配信に関わる多くのサービスにわたって改善を実施し、一部を完全に書き直した。チームはPushyのスケーラビリティに取り組み、よりパフォーマンスとコスト効率の高いインスタンスタイプに変更し、ノードあたりの平均同時接続数を60,000から200,000に増加させた。また、接続数に応じた指数関数的なスケーリング・ポリシーを採用し、サーバー・プール全体で接続数を均等にバランスさせている。
Pushyエコシステムの進化(出典:Netflix Technical Blog)
さらに、通知配信フロー(Push Registry)のキャッシュ実装を、NetflixのオープンソースRedisラッパーであるDynomiteから、内部で開発された汎用的なキー・バリュー・データベース・サービスであるKeyValueに置き換えた。MantisジョブをベースにしたMessage Processorは、Apache Kafkaトピックからメッセージを消費するスタンドアローンのSpring Bootサービスに作り直され、自動水平スケーリング、カナリアとレッド/ブラックのデプロイメント、さらに観測可能性を活用するようになった。
ここ数年で、Netflixの通知配信のユースケースは変化し、非同期配信から直接(同期)プッシュやデバイス間メッセージングへの移行がより重視されるようになった。新しい機能には、同じアカウントで登録された顧客のデバイスを検索する機能を提供するデバイス・リスト・サービスなど、プラットフォームの新しいコンポーネントが必要だった。このサービスとプッシュ・レジストリを組み合わせることで、ソースとターゲットのPushyインスタンスを含むデバイス間メッセージングが可能になる。
デバイス間メッセージングのサポート(出典:Netflix Technical Blog)
チームは、多くのカスタムメッセージングのユースケースを可能にするために、3つの異なるレイヤーを持つ内部プロトコルスタックを作成した。WebSocketとPushy、デバイス間プロトコル、クライアントアプリのプロトコルだ。デバイス間プロトコルは、JSONを使用してデバイス間でアプリレベルのメッセージを伝送する。
メッセージング・プラットフォームのさらなる最適化には、検索時間を改善するためのターゲット・デバイス・データのキャッシュ、WebSocket接続管理とチューニング、OkHttpクライアントへの切り替えなどが含まれる。