同時接続 700 万、秒間 2 万通という Nintendo Switch 向けプッシュ通知システム NPNS の資料を読んで

これは任天堂発表者へのラブレターです

資料は以下からダウンロード可能です。

【任天堂様ご登壇事例】Nintendo Switch (TM) 向けプッシュ通知システム「NPNS」

AWS はよくわからないので Erlang/OTP 視点のみです。

ejabberd

ejabberd はフランスの ProcessOne という会社が開発している XMPP サーバです。XMPP が何かはここでは説明しません。

ejabberd は TLS や XML 周りの性能を出すため C で書かれている以外、他はすべて Erlang/OTP で書かれています。

ejabberd の歴史はとても古く、自分が Erlang を学び始めた頃にはすでにありました。オープンソースなので当時すべてのソースを読みプロセスの構成や gen_server の使い方などを学んだことを覚えています。

ejabberd はプラガブルでとても良くできています。一時期は Facebook が採用していたほどです。大規模でもスケールし、安定して稼働します。

これを選択したのは本当に素晴らしいセンスとしか言いようがありません。

1779万台

2018 年 3 月末時点での Nintendo Switch の販売台数だそうです。恐ろしい数です。その台数に対してプッシュ通知を送ってるのは正直想像ができません。

同時接続 700 万台、秒間 2 万通、月間 200 億通 … もうわけがわかりません。性能要件も 1 億台と書かれています。あいた口がふさがりません。

なんという性能、なんという要件、本当に凄いです。


すごすぎて悔しいので Erlang/OTP ユーザ視点で見てみることにします。

Erlang/OTP ユーザ視点

資料を見ると ejabberd は自前で改造していると書かれています。改造内容が「プロセス構造」と書いてあり、いやそれ根本から修正しているし、というオチ。ガチでした。

つまり、ただ ejabberd を使っているのではなく、ゴリッゴリ Erlang/OTP を書いてチューニング、というかリライトレベルで書き直し性能を上げたり省メモリ化をしているようです。すごい。

さらにクラスター同期に利用される Mnesia も止めて自前で Consul の運用に切り替えています。これも現実的で良いです。

おそらく運用台数がかなり多いのではないでしょうか。Mnesia の同期はそれほど重いものではないのですが、台数が多いとそれなりにしんどくなることが多いため止めたと考えています。

省メモリ化

fast_tls (C 拡張) に手を入れているようです。発表者のお一人が元組み込出身のようなので、その辺はお手の物なのでしょう。

Hibernate を活用して接続したあとに寝かせておくという方針をとりメモリをとにかく減らしているのがわかります。Erlang/OTP は TCP のコネクション維持のためにかなりメモリを食べるためです。

お金で物を言わせるのではなく、省メモリ化することでコストを下げるのを意識しているのが技術者の鏡に思えます。

最近は課題をお金で殴る話を聞く事が多かったので、この少しでもコストを下げるという話がとても良かったです。

任天堂の売上は一兆円を超えており、お金で殴る選択肢も取れたはずです。お金で殴らない戦略を取れる体制が整ってるのは凄いことだと思います。

大量切断

実は TCP 張りっぱなしで辛いのは大量切断です。メモリがはねます。これの対策が具体的に書かれていないのでとても気になりました。

ログ出力

ログ出力に何を使っているかは書かれていませんが、crash.log で汚さないというのは本当に重要です。よく Erlang/OTP は困ったらクラッシュさせればいいとか言われますが、それはただの素人以下です。

実際はクラッシュログをいかに出さないようにコードを書くかです。クラッシュするのは「あくまで想定外が起きた時だけ」というように設計するべきです。クラッシュログを出さないのはとても重要になります。

独自機能

TCP の接続維持の話はとても勉強になりました。この辺の話が Erlang/OTP でどう実現したのかが書いてあったら・・・と思いましたが、AWS のイベントで Erlang/OTP の話をするのは微妙と判断されたのでしょう。

hot code loading

衝撃だったのはこれです。つまり Erlang/VM を落とさずにアップデートする仕組みです。TCP コネクションも切れません。

緊急時とはいえこれを採用できるくらい考えられた設計ということなのでしょう。頭が上がりません。

まとめ

安全に寄せながらも一億台という要件に答えるための仕組みを作り上げて、今も元気に可動しているということでしょう。

どのくらいかかって、何名でという話が書いていないのでわかりませんが、これほど素晴らしいシステムを作り上げるのはとても大変だったように思います。

今後 Nintendo Switch は右肩上がりで売れていくのでしょう、そうなるとこのシステムの負荷もガンガン上がっていくことになります。それを Erlang/OTP を利用している仕組みが安定してプッシュ通知を提供していると胸が熱くなります。

何より任天堂は世界の Nintendo です。つまり世界中にプッシュ通知を送っているわけです。そのため 24/365 止まってはいけないシステムが必要になります、これこそまさに Erlang/OTP が得意とする世界です。Erlang/OTP 素晴らしい事例の一つに思えます。

本当に素敵な事例をありがとうございます。胸をときめかせながら資料を読ませていただきました!


発表者の方と少しだけお話をする機会があり「なぜ外で発表することにしたんですか?」と聞いたところ技術者に少しでも任天堂に興味を持ってもらいたいからという話をされてました。

資料にも書いてありましたが、任天堂ではキャリア採用も行っているそうです。

興味があったら応募してみてはいかがでしょうか?