SREチームの@cubicdaiyaです。つい先日メルカリでOSSとして開発・公開しているスマホアプリ向けのプッシュ通知用ゲートウェイサーバであるGaurunがGCM、APNsともにHTTP/2を利用したプッシュ通知に対応したので紹介します。
ちなみにロゴも出来ました。
Gaurun〜A general push notification server in Go〜
繰り返しになりますが、GaurunはメルカリでOSSとして開発・公開しているスマホアプリ向けのプッシュ通知用ゲートウェイサーバです。GCMやAPNsへのプッシュ通知処理をHTTP + JSONベースの非同期処理APIでラップして大量のプッシュ通知を素早く送信することができるのが特徴です。
メルカリのプッシュ通知のシステムもこのGaurunにより構築されています。クライアントとの通信にはHTTPが利用できるので前段にnginxをロードバランサーとして配置してGaurunサーバを足すだけで簡単にスケールできる構成になっています。
詳しくは以下の「nginxとGoでつくるメルカリのプッシュ通知システム」をご覧ください。
GaurunとHTTP/2
以下は古い(v0.5.0より前の)バージョンでのGaurunの処理フローです。
Gaurunを開発した当時はまだHTTP/2は利用可能ではなく、GCMとAPNsとでそれぞれ異なるプロトコルを利用して通信する必要がありました。具体的にはGCMはHTTPS、APNsはTLS上で独自プロトコルで通信する必要があり、クライアントから受け取ったJSONからGCMとAPNsのどちらに通知するかを判別していました。
GCMはHTTPSなこともあって比較的ハンドリングが容易な一方、APNsの方はプロトコルの性質上一部の処理の(特にエラーの)ハンドリングを行うのが難しく、timeout_error
やkeepalive_idle_timeout
といったAPNs専用のオプションを用意する羽目になったり、TCPのコネクションプールを自前で管理する必要があるといった事情からロジックが複雑になっていました。
しかし、現在のGoはHTTP/2をサポートしており、APNsもHTTP/2に対応したAPNs Provider APIを提供しています。そろそろ頃合いかなと思い、今年の春にGaurunのコードを刷新してGCMとAPNsとの通信部分にHTTP/2を利用する実装に切り替えました。APNs Provider APIとのつなぎ込み部分にはRobotsAndPencils/bufordを利用しています。GCMの方はGoのバージョン上げるだけなので楽ちんですね。
まとめ
GaurunのHTTP/2サポートについて解説しました。元々クライアント側から見るとGaurunはHTTP + JSONベースのAPIを提供しているだけでHTTP/2を利用しているかどうかはさほど重要ではないのですが、サーバ側から見るとHTTP/2を利用するようになったことで特にAPNsとの通信処理が大幅に高速化されたのが今回の変更によってもたらされる大きなメリットではないかと思います。
メルカリで新設のエンジニアポジション、Backend System Engineerについて
話は変わりますが、メルカリでは先月からミドルウェア開発専任のエンジニアポジションであるBackend System Engineerの募集をはじめました。
https://www.mercari.com/jp/jobs/backend/www.mercari.com
業務内容はGaurunをはじめとする周辺ミドルウェアやそれらを利用したシステムの開発になります。以下はその一例です。
- 大量ユーザ向けのプッシュ通知システムの開発
- gRPCによるMicroservicesアーキテクチャを実践したシステム(認証、課金等)の開発
- JSON-RPCベースのAPIゲートウェイの開発
- OpenRestyによるログ分析基盤のためのフロントサーバの開発
開発言語はGoがメインです。興味がある方はぜひご連絡ください。