サーバサイドからクライアント、ツールまで、Node.jsを利用
DeNAでは、スマートフォン向けのソーシャルゲーム開発プラットフォームとして、クライアントアプリ開発用のゲームエンジン「ngCore」(ngCore Client)、開発ツールの「ngBuilder」(ngGoBuilder)を提供しており、ソーシャルゲームのサーバサイド実装をサポートする「ngServer」を現在開発中だ。
ngCoreでは開発時におけるデバイスへの配信サーバとしてNode.jsが使われており、ngBuilderでもNode.jsを利用。そして、ngServerはNode.jsをベースとしたサーバサイドフレームワークだ。Node.jsを採用している理由として、篠崎氏はまず「より多くの接続数に対処できること」を挙げた。
「特にスマートフォン向けのソーシャルゲームでは、リアルタイムの要求が増加し、いわゆるC10K問題が現実味を帯びてきている。そのため、大量の同時接続を処理するうえで十分なパフォーマンスを発揮できることが重要なポイント」
ほかにも、Node.jsはメモリ使用効率に優れており、「スレッドを使ったサーバプログラムと比較すると、かなり有効にメモリ資源を使えている」という。
すでにNode.jsのサーバを使ってサービスを展開しているMobageのソーシャルゲームとして、篠崎氏は「SKYFALL」と「VIP LIFE」の2つを紹介。これらはDeNAのグループ会社である米国ngmoco社のタイトルで、米国のAndroidマーケットなどでベータ公開されている。
これらのゲームの開発では、Node.jsのバージョンアップが早すぎる、モジュールのアップデートについていけないといったように、Node.jsを採用したことに起因する問題にも直面した。中でも一番苦労したのが、CPUスパイクの問題だという。
「一定の負荷がかかった状態で運用していると、いつの間にかCPUスパイクが発生するようになってしまった。なかなかその原因が特定できなかったが、最終的にはNode.js自体の問題であることが分かった」(篠崎氏)
その根本的な原因は、Node.jsが採用するJavaScriptエンジン「V8」のGC(ガベージコレクション)で、大きなヒープメモリが確保されたときに同様の問題が起きていたそうだ。Node.jsはV8のアップデートを取り込んでいくため、もし新バージョンのV8に未知のウイークポイントがあれば、そのままNode.jsにも取り込まれてしまう。プロダクションのサーバでは、Node.jsのリリースバージョンを使うのか、あるいはカスタマイズのバージョンで運用するのかなど、検討したうえで自社の方針を決断する必要があるだろう。
こうした経験をもとに開発されたサーバサイドフレームワークが、ngServerだ。篠崎氏は、「奇をてらわないスタンダードな構成」としながら、図1のアーキテクチャを紹介。デバイス(スマートフォン)からJSONが送られると、ngServerのコントローラはJSONを返す。デバイス側はそれをもとに、デバイス上でレンダリングを行う。従来の携帯電話(フィーチャーフォン)のソーシャルゲームのように、サーバからデバイスにswfファイルやレンダリングされたHTMLファイル、イメージなどが送信されることはなく、やりとりされるのはJSONのみとすることでNode.jsの強みを最大限に活かす仕組みだ。
なお、ngCoreはもともと米国サンフランシスコに拠点を置くngmoco社の技術であり、ngServerのプロジェクトも基本的に東京-サンフランシスコ間での共同開発で進められている。篠崎氏は最後に、この開発体制についても紹介。距離や時差など共同開発における課題は多いが、篠崎氏が最も留意しているのは、アメリカ人と日本人との「気質の違い」だという。
例えばレビューなどで、日本人は「問題がある」「バグ」「ひどい」「動かない」など、否定的な表現から入る場合が多いが、アメリカ人は「すばらしい」「すごい」「これいいね」といった言葉の後に、「ところで提案だけど……」と意見を述べる。
「こちらもポジティブな言葉や、いわゆる褒め言葉を使ったほうが、明らかに意思疎通もうまくいく。それが信頼関係にもプラスに作用することを、身をもって学んだ」(篠崎氏)