見出し画像

#5_WFSのサーバサイドを支える技術

こんにちは。 WFSでサーバエンジニアをしている藤田です。

この度、WFSのブログが開設されましたので、現在のWFSのゲームのサーバサイドを支える技術について紹介させていただければと思います。

特に、私たちが2021年から2022年にかけてリリースしたゲームにおける採用技術を中心にまとめたいと思います。

サーバ構成

まず、サーバ構成ですが、最近リリースしたゲームは基本的に全て以下のような構成になっています。

大きく分けて、お客様がアクセスするゲームAPIサーバ(API Server)と、開発者やカスタマーサポートの方がアクセスするAdmin-Toolです。

Admin-Toolはゲーム自体の管理やお客様からのお問合せに対応するためのものなので、ゲームAPIサーバと同じデータベースを参照しています。

構成管理はKubernetesを利用しており、Google Cloud PlatformのGoogle Kubernetes Engine(GKE)上で稼働しています。

WFSにはオンプレミスで稼働しているサーバはなく、全てクラウドサービスを利用しています。
特に、2021年以降にリリースしたゲームは全てGoogle Cloud Platformを利用しています。

データベースは、メインのデータベースとしてCloud Spanner、用途によってはMemcachedやRedisを利用しています。

また、ログの収集解析にはBigQueryを利用しています。

言語

次に、WFSのサーバエンジニアが普段実装している言語について、用途などにも触れながら簡単に紹介したいと思います。

PHP

ゲームAPIサーバはPHPで実装しています。
ですから、WFSのサーバエンジニアが一番多く触れる言語はPHPということになります。

現在は7.4系です。年末に向けてそろそろ8.1系へのバージョンアップ準備を始めないといけないですね。

フレームワークはSlim Frameworkを使っています。
ゲームAPIサーバ、と書いているように、サーバ実装の大部分はゲームAPIの実装であり、一般的なWebサイトを構築するわけではないため、シンプルなフレームワークであるSlimを採用しました。
実際、HTTP ServerRequestを構築し、ルーティングしてもらって以降はほとんどフレームワークの機能はつかっていません。

また、もう一方の大きな機能であるAdmin-ToolはWebベースのツールです。しかし、画面構成などはReactをつかっており、サーバ実装はやはり大部分がAPIの実装です。よって、Admin-Toolのサーバ実装もゲームAPIサーバと同様にあまりフレームワークの機能はつかっていません。

また、PHPの開発環境として以下のような静的解析ツールやコード自動整形ツールを活用しています

  • PHPStan

  • psalm

  • PHP_CodeSniffer

それから、個人的には上記ツールの並びに入れてもいい気がしていますが、多くのサーバエンジニアがPHP StormやIntellijを使ってコードを書いています。

TypeScript

実はWFSのサーバエンジニアはTypeScriptを書く機会が結構多いです。
なぜなら、上ですこし触れましたが、Admin-ToolがWebベースであるためです。

WFSが提供しているゲームでは運用やお客様からの問い合わせの対応が多くあるため、管理ツールの重要性は高く、作業ウエイトとしてもゲームAPIの実装の次に多くなっています。

フレームワークとしてはReactを、それにコンポーネントライブラリとしてMUIを使っています。

最近、React v16 + Material-UI (v4系)からReact v18 + MUI (v6系)にアップデートしたので、その時の話を別の機会にできればと思います。

FlatBuffers

これはちょっと説明が必要なのですが、WFSではデータスキーマの管理にFlatBuffersを使っています。データのシリアライズには使っていません。
こちらは、サーバエンジニアだけでなくクライアントエンジニアも利用しており、サーバ/クライアント間でやりとりされるデータのスキーマや、内部データのスキーマを定義しています。また、コードの自動生成も行っています。

CI/CD

最後にCI/CDについて紹介したいと思います。

Jenkins

WFSではCIツールとして主にJenkinsを使っています。
PHPの静的解析やテストといったCIはもちろんのこと、CDの起点としても利用しており、後述のArgoCDにバトンタッチする作りになっています。
また、クライアントアプリのCIや、マスタデータ管理にも利用しています。よって、サーバ/クライアントエンジニアだけではなく、プランナーなどゲームに携わる多くのチームメンバーが触れるツールです。

ただ、Jenkinsについては運用コストが常に問題になっており、Github Actionsなど別のツールが使えないか、現在検討しているところです。とはいえ、現時点でJenkinsはWFSの主力CIツールとして活躍中です。

ArgoCD

KubernetesのCDとしてはArgoCDを利用しています。
ArgoCDのbest practiceにあるとおり、サーバ本体のリポジトリとKubernetesマニフェストのリポジトリは分かれており、サーバのコードが更新されてJenkins上でのテストが終わると、Jenkinsのジョブでそのまま開発環境のマニフェストの更新とArgoCDのsyncまでやっています。
本番環境は、KubernetesマニフェストのPRの作成とマージを起点として、ArgoCDのsyncなどを確認しながら進めて、デプロイしています。

まとめ

以上、WFSではどのような言語で開発し、どのようなサーバ環境に、どのようにデプロイしているかおおまかにまとめました。

ここでは紹介できなかった技術もまだまだありますし、この記事で触れた技術の中でも、管理ツールのフレームワークアップデートの話や、コンテナ + PHP + Cloud Spanner + Apple Siliconと組み合わさった時にビルド時間の問題がでて工夫しているところなど、細かい話はまだまだありますので、また改めてご紹介できればと思います。


この記事が気に入ったらサポートをしてみませんか?