複数のゲームタイトルを運営するDeNA。グローバルに展開し、膨大なトラフィックを誇るタイトルを数多く持っています。その事業を安定的かつローコストで運用していくため、DeNAは内製で独自のゲームサーバー基盤を開発し続けてきました。
その任務を担うソリューション事業本部ゲームサービス開発部サーバー基盤グループは、内製ゲームサーバー基盤「Takasho」を開発。開発工数の削減や品質の向上を目的として、ゲームサーバーとして共通で必要になる機能を楽に実装できる仕組みを提供しています。
より多くの人にゲームを安定して楽しんでいただくために、日々開発・運用を続ける「Takasho」チームについて、2名のエンジニアに話を聞きました。
目次 [隠す]
内製ゲームサーバー基盤「Takasho」を開発
ーーまずは、ソリューション事業本部ゲームサービス開発部について、どんな組織でどんなミッションを担っているのか教えていただけますか?
勝倉:ソリューション事業本部は「一人ひとりにWow!」をミッションとして、ソリューション提案を強みに、パートナーが本当に欲しているものの探究、新たな価値創造につなげることを目指しています。
中でもゲームサービス開発部では、これまで培ってきたゲームのバックエンドサービス構築ノウハウを軸に、ゲームはもちろん他のサービスに対してもソリューションの提案・構築やナレッジの共有を期待される部署となっています。
ーーおふたりが所属する、サーバー基盤グループは、具体的にどんな業務をしているんでしょうか?
勝倉:内製ゲームサーバー基盤である「Takasho(たかしょう)」の開発と、「Takasho」を使ったゲームタイトルのバックエンドサービスの構築を主な業務としています。
ーー「Takasho」とは何でしょうか?
勝倉:DeNAにはもともと、複数のタイトルが相乗りする形の「Sakasho(さかしょう)」と呼ばれる共通ゲームサーバーが存在していました。
この共通ゲームサーバーは、ガチャやログボといったソーシャルゲームでよくある機能が再利用できる形で提供されていたり、膨大なトラフィックを捌き切るインフラ管理のノウハウが集約されていました。
そのため、新規のタイトルが効率的にリリースでき、運用も安定していたので一定の成功を収めることはできたと言えます。
一方で、複数タイトルが相乗りする構成であるため、タイトル独自の仕様を入れづらく、尖ったゲーム性を実現する上での制約となっていた部分がありました。
ーーなるほど、汎用性は高かったが、拡張性に欠けていたと。
勝倉:はい。ですので、「よくある機能が再利用できる」、「インフラ管理のノウハウが集約されている」といった「Sakasho」の良さを残しつつ、ゲーム性にマッチしたタイトル独自仕様の導入を可能にする目的で開発をスタートしたのが「Takasho」です。
海老沼:簡単に言うと、「できるだけ低い開発・運用コストで高い可用性を保ちつつ、大規模の負荷を難なく捌くことができることを目指したゲームサーバー基盤」ということになります。
ーー「Takasho」の技術構成を教えてください。
勝倉:前述の通り「Takasho」は、「よくある機能が再利用できる」と「独自の仕様を導入できる」という半ば矛盾した要件を満たしつつも、「インフラ管理のノウハウが集約」できることを求められていまして、これを実現するための形として採用されたのが「フレームワーク」というアプローチになります。
一般的に「基盤」といった場合にイメージされるのは、「Sakasho」のような「複数の利用者に向けて提供されるサービス」かと思いますが、「Takasho」は基盤と言いつつ、
・ライブラリとしての共通機能
・DBスキーマ管理や自動生成のためのツールチェーン
・IaCで管理されたインフラ構築ツール
を主な提供物としています。
技術スタックとしては、コアな部分としては以下を利用しています。
・Go:バックエンドロジックを記述するための言語
・GKE(Google Kubernetes Engine):バックエンドサービスのホスティング
・Cloud Spanner:データベース
・gRPC:C# SDKから「Takashoサーバー」の呼び出しにおける通信
その他、機能要件・非機能要件に応じて、Google Cloudが提供するサービスや、ArgoCDやOpen Matchなど、Kubernetesを活かすような技術を採用していたりします。
ーー運用実績については?
海老沼:これまで 「Takasho」を利用した複数のゲームタイトルをリリースしていて、どのタイトルも大きな障害は少なく、安定して運用できていると思います。
ふたりとも「Takasho」チームが初の職場
ーーここに至るまでのキャリアについて簡単に教えていただけますか?
勝倉:2019年に新卒入社で「Takasho」チームに配属され、今年で4年目になります。
海老沼:私はその1年後に入社し、エンジニア研修を経て「Takasho」チームにジョインしました。今年の4月で3年目になります。
ーーおふたりとも「Takasho」チームが初の職場だったわけですね。具体的にどんな開発をしたか、それぞれ教えていただけますか?
勝倉:1年目は、ゲームAPIの開発をしていました。なかでもゲーム内通貨の消費周りの実装は大変でした。
ーーどのあたりで苦労されたんでしょうか?
勝倉:ゲーム内通貨は「Takasho」のデータベースではなく、プラットフォーム(AppStoreやGooglePlay)との連携を提供しているLCXという別の内製mBaaSが管理しています。
ですので、通貨消費の場合は「mBaaS から残高を減らす」「購入アイテムを付与する」という処理を、ミッション達成報酬などでの付与の場合は「mBaaSの残高を増やす」「ミッションを達成済みにする」といった、分散トランザクションを正しく処理する必要がありました。
加えて、「クライアント側に、購入が失敗した際のリカバリー手順の複雑さを露出させたくない」などの理由から、これらの処理を非同期で実装する必要があったりと、かなり複雑な要件の機能だったのですが、インフラ構成を含む設計から実装までを任せてもらえたのは、大きな成長につながったと思います。
ーー2年目以降で印象に残っている仕事はありますか?
勝倉:gRPCペイロードの独自暗号化の実装です。
「Takasho」では、タイトル側で汎用的に利用できるよう、サーバーコードレスアークテクチャ(https://www.slideshare.net/harutootake/dena-209468047)のコンセプトのもとに設計されています。
このコンセプトを一言で表すなら「クライアントにユーザーデータを変更する権限を与えてしまう」です。
これによって、ユーザーデータの詳細をサーバー側が知っておく必要がなくなるので、「カードゲームにおけるデッキ」「格闘ゲームにおけるキャラクター」といったものを「ユーザーの持ち物」として抽象的に管理できるようになります。
一方で、クライアントに「ユーザーデータの変更権限を与える」ということは、その変更が正規のものなのか、改竄されたものなのかを判定することが非常に難しくなります。
そのため、「そもそも改竄されない」というところで守り切る必要が出てきます。これを満たすための実装はいくつかあるのですが、「Takasho」ではその中で通信経路の多重暗号化と独自の証明書ピンニングを実装しています。暗号化に関しては、アルゴリズムに脆弱性が見つかる場合も考慮して、独自のアルゴリズムを実装しています。
ーー新卒2年目とは思えない充実した仕事ぶりですね。
勝倉:そうなんです。2年目でも「やりたいです!」という意思表示をすれば、年次で却下されることはないというのは「Takasho」チームならではだと思います。このチャレンジングな機会にアサインしてくれた上長には今でも感謝してます。
ーー海老沼さん、入社直後に印象に残っている仕事はありますか?
海老沼:ジョインして約3ヵ月後に担当した「デプロイフローの整備」があります。
「Takasho」としてのファーストタイトルのリリースが近づいてきたタイミングで、本番のデプロイフローについて要件の整理から、Kubernetesのエコシステム調査(「Takasho」はGKEを採用しているため)、検証、導入まで、一通り任せていただきました。
技術的にチャレンジングな仕事でしたが、元々興味があり自分の成長につながるチャンスだとも思ったので、LE(リードエンジニア)と話して挑戦しました。
入社直後から大きな仕事にチャレンジできる
ーーその後はどんなお仕事に注力されたのでしょうか?
海老沼:印象に残っているのは、2021年の4〜6月頃、自分の担当しているタイトルのリリース前にやった負荷試験ですね。
DBのロック競合やキャッシュの実装漏れ、外部サービスのレイテンシ悪化など、インフラ、アプリケーション、DBそれぞれで見つかったいろいろな問題の対処が必要だったので大変でしたが、この経験を通じて技術面ではかなり成長を感じました。
このあたりの経験については、学生に向け、DeNAで働くエンジニアが自身のキャリアを紹介するイベント「DeNA TechCon 2021 Winter」で発表させていただきました。
https://techcon2021.dena.dev/winter/session-win06
最近は、各タイトルで監視の仕組みを気軽に導入できるような基盤を作ったり、ブルーグリーンやカナリーといったデプロイ方式を使えるようにするツールの検証など、さまざまなおもしろい仕事にチャレンジできています。
ーー勝倉さんの最近のお仕事はいかがですか?
勝倉:3年目からは「与えられたタスクをこなす」というよりも、「Takashoに必要なものを考えてタスクを定義する」という役割を任されるようになりました。
いくつか大きな役割がありましたが、今回は「継続的ベンチマーク」のお話をします。
解決したかった課題としては、負荷試験にかかっていた膨大な人的・金銭的コストです。秒間10,000回を超えるリクエストを再現するためには、サーバー側のリソースはもちろん負荷を生み出すための環境にも膨大な費用がかかります。
負荷をかけてボトルネックが見つかれば、システムやコードを最適化する、という作業を目標のレイテンシを下回るまで続けます。
負荷試験は1〜2カ月に及びますが、見つかるボトルネックの中には、インデックスが使われていない、ヒット率の低いキャッシュキー設計、N+1クエリなど開発段階で気づけそうなものも多くありました。
こうした課題に対し、
・負荷試験はボトルネックを見つけるためではなく、負荷がかかっても問題ないことを確かめるための段階であるべき。
・テストケースを追加するかようにベンチマークコードを追加することができれば、開発段階から最低限のパフォーマンスは担保した状態にできるはず。
という発想から「継続的ベンチマーク」というソリューションを構築しました。
まだファーストバージョンが動き始めたばかりという状態ではありますが、それでも既に枯れたと思われていたAPIの中からN+1クエリを検出してくれたりと、一定の有効性は確認できたと思っています。
「技術に対して真摯であること」がチームの共通認識
ーー海老沼さんは「Takasho」チームに途中参加されたわけですが……。
海老沼:ジョインして最初は、ゲーム独自の知識をインプットするのに苦労しました。普段ソーシャルゲームはあまりやっていなかったので、プレゼントボックスやミッションなどゲーム独自の概念だったり、イベントを管理するマスターデータなどを理解するのに時間がかかりました。
ただ、このあたりのオンボーディングは改善したので、今は少しは楽になったかなと思います。
ーー具体的にどんな改善が?
海老沼:ドキュメントをかなり整備しました。ゲーム独自、「Takasho」独自のリソースについてそれぞれ役割からベストプラクティスまでをチームで分担し、議論しながらまとめました。
他にも各タイトルの機能名や用語とサーバーリソースの対応表を作ったりしています。
ーー「Takasho」チームに携われることの楽しさって何でしょうか?
海老沼:DeNAのゲーム開発を支える基盤として、大規模ユーザーを抱えながら長期的に安定した運用を行っていけるように、さまざまな観点から調査/検証を行い適切な技術選定をする必要があります。技術検証にちゃんとコストをかけられるので、新しいものを含めさまざまな技術に触れられるのは単純に楽しいです。
他にも、ゲームはリリース時やイベントの度にユーザーが集中するのですが、自分が負荷試験したサービスがちゃんとそのスパイクに耐えられているのは非常に達成感がありました。
ーー「Takasho」のチームの構成、人数、雰囲気について教えてください。
海老沼:マネージャー1人、LE(勝倉)1人を含めてメンバーは全員で7名で、雇用形態もさまざまなメンバーで構成されています。割と落ち着いているメンバーが多いのかなと思います。
ーー働き方やメンバー間のコミュニケーションの取り方の特徴はありますか?
勝倉:コミュニケーションに関しては非常にフラットで「誰が言ったかではなく、何を言ったか」を地で行くような雰囲気を感じています。
フルリモートですが、コミュニケーションは活発なように思います。毎日朝会を実施し、だれがなにをしているのかはお互いに同期されていますし、疑問点があればすぐにhuddleやmeetで相談しあっています。
海老沼:他には輪読会や他のチームとの知見共有を行う勉強会を週1でやっていたり、運用の振り返り(ポストモーテム)や本番のインフラ費用確認なども行っていますね。
ーー開発中にチームで大事にしていることなど、教えてください。
勝倉:「技術に対して真摯であること」は全員の共通部分だと感じています。「必要な技術を適切に使い、正しく動き続けるものをつくる」ことが重要であり、「誰の意見なのか」とか「最新の技術なのか」といったことが判断基準になることはありません。とはいえ、最新の技術動向に関するキャッチアップを疎かにしているわけではなく、毎週チーム内での勉強会を開催し、継続的に研鑚を積むようにはしています。
また「仕様通りにつくればいい」というある種の作る側の理屈に満足することなく、複数のタイトルに携わっている「Takasho」メンバーだからこそ持っている知見をもとに、仕様に載っていない、企画が真にユーザーに提供したい体験を聞き出し、仕様を最適化する立ち回りも重要視しています。
海老沼:サービスを継続的に安定して運用していくため、障害が発生した後はポストモーテムと呼ばれる振り返りのドキュメントを書き、チームで再発防止策などを話し合うようにしています。
また、普段の開発で感じた非効率な作業や後回しにしがちな小さい改善も進められるように仕組み化しています。
他にも、いろいろなタスクがある中で、各メンバーのやりたいことや成長を考えて仕事を分担していることなども大事にしていますね。
グローバル展開を担うシステムへ
ーー今後、「Takasho」に関して、どのように発展させていきたいとお考えなのか、おふたりが思い描く未来について教えてください。
勝倉:グローバル展開に対応することが、非常に重要なテーマであると考えています。
世界中の人にdelightを届けることが当社のミッションであることはもちろん、非常にありがたいことに、世界的に有名なIPを版元さまからお借りして、ゲーム開発を任せていただける機会に恵まれていますので、事業戦略としても重要です。
エンジニアとしても、世界中の人が乗っかるシステムを技術選定から設計・実装までやることは貴重な体験で、チャレンジングであると同時に、やりがいも相当なものであると思っています。
海老沼:これからも「Takasho」を使った新しいタイトルをリリースしていく予定なので、今後はより開発・運用の効率化やナレッジを蓄積していくことが重要になってくると考えています。
複数のタイトルで利用できるライブラリやインフラのモジュールなどの共通基盤を整備したり、パフォーマンス改善を効率的に行える仕組みを作っていきたいと考えています。
ーー最後に、「Takasho」チームで働くことで得られる“特別な”やりがいなどありましたら、教えてください。
勝倉:「Takasho」チームは、知識に貪欲で技術に真摯なエンジニアの集まりです。
求められる領域も広域なため、個々のメンバーに求められる守備範囲も非常に広域であり、一定の難しさや大変さはあります。
しかし、これに立ち向かっていく中で成長できることは間違いないですし、リリース直後の膨大なリクエストを受けながらも、サービスを供給し続けているメトリクスには、えも言われぬ達成感があります。
海老沼:DeNAのエンジニアは本質的な部分を大事にする人が多いと感じます。ただ目の前の仕事をこなすだけでなく、目的は何なのか、何を達成できると一番うれしいのかなどを一緒に考えて仕事ができるのはすごくやりがいがあって楽しいです。
学びに対して貪欲な人が多いので、日々学び、成長できるいい環境だと感じています。
※本記事掲載の情報は、公開日時点のものです。
※本インタビュー・撮影は、政府公表のガイドラインに基づいた新型コロナウイルス感染予防対策ガイドラインに沿って実施しています。
編集:フルスイング編集部 撮影:小堀 将生