[レポート]PUBG’s architecture (with focus on back end infra) on AWS #AmazonGameTech #AmznGameTechJP

PUBG’s architecture (with focus on back end infra) on AWS

2019年11月20日(水)にアマゾン目黒オフィスでアマゾンウェブサービス社の自社イベント「Amazon Game Developers Conference」が開催されました。

本記事は、セッション「PUBG’s architecture (with focus on back end infra) on AWS」をレポートします。

スピーカー

PUBG Corporation DevOps Engineer Kim JungHun 氏

セッション概要

PUBG Corporationは、世界で50万本以上販売されている PLAYERUNKNOWN'S BATTLEGROUNDS の開発および運営をしています。PUBG は Amazon EC2、DynamoDB、SQS、S3 および CloudFront など Amazon Web Services で提供されるさまざまなサービスを利用しています。本セッションでは、PUBG の バックエンドアーキテクチャと、AWS のサービスが実際にどのように利用されているかを紹介します。

レポート

PUBG とは?

5000万枚の売り上げ

300万人の同時接続 7つのギネス記録

PUBG Architecture Overview

トップタイトル(OutGameと読んでいる) →マッチメーキング →キャラ変更 →戦績の確認

→Angular / MicroService Server .NET Core 3.0(C#)

Donkatsu Dinner を食べるために頑張るバトルロイヤルゲーム

Unreal Engineを利用している

メインシャードとゲームシャードで分けている

メインシャード: WebSocketでクライアントと通信、全てのインスタンスがPrivaet Subnetでバージニアリージョンに置いている

ゲームシャード: UDPで通信、全てのインスタンスがPublic Subnetでバージニアリージョンに置いていて、DBなどは使っていない

メインシャードは一つのリージョン

ゲームシャードは様々なリージョンで作成、地域ごとに存在

データ管理のメインシャードは一つのリージョンで保存している。

メインシャードはPrivate Subnetで、外部からアクセスする場合はPublic Subnetに置いてるPublic Subnetで通信

メインシャードでデータを保管

Server Components In Depth

Micro Service構造になっている。

Micro Service長所

  • サービスの必要な部分だけスケーリング

  • サービスを独立して開発できる

  • 障害が発生しても切り分けしやすい

Micro Service短所

  • サービスディスカバリー機能が必要

  • 運営とモニタリングに手間がかかる

  • PUBGは長所が短所より大きいため、Micro Serviceを選択。

マイクロサービスのサービス依存度がよくわからなくなる

"One project, One binary"から"do different depending on settings"

PUBGでは44のマイクロサービスで動いている。

SQS

サービス同士の通信には、一般的なHTTPとMessaging Queueを利用している。

Direct HTTP Request 重複処理 / 失敗しても大丈夫な物に利用

絶対に処理しないといけない物、非同期に処理するものにQueueを利用

キューを利用すると、マイクロサービスの結合度を下げれる

PUBGのBeta環境では様々なMessage Queue Serviceを使っていたが、最終的にSQSを利用した

→無限のキャパシティー、安定、明示的にメッセージを削除しないとキューに残るから、障害が発生してもキューに残り続ける

DynamoDB

オブジェクトリレーションマッピングが必要じゃないので、DynamoDBを利用。

ユーザーのIDを利用して必要なドキュメントを読んで処理している。

NoSQLの中でもDynamoDBを使った理由

  • フルマネージドでスケーリングしてくれる、費用の節約

  • 瞬間的なバーストを障害なく処理できる

CloudFront

S3をOriginにしてCloudFront可能。

OutGame Sererと連結された時もアップデートでWebSocketが対応し、CloudFrontを利用できるように

CloudFrontとGlobal Acceleratorも出たが、全時間帯で安定的なレイテンシーの方が重要なので、CloudFrontを利用。

Logging Infra

System Game LogとOutGameLogはKinesisに流してElasticsearchと、Kafka LogStreamに投げて、KafkaでE Suports 用のリアルタイム分析

S3のログ分析はData Tech TeamがAirflow + Spark (/Dynamo)で

Monitoring

Server Metrics: DataDog, Promotheusを利用して収集

SystemLogs: Elasticdearch, Kibana

Kubernetes Migration

メインシャードをKubernetesに切り替え

コミット後自動でJenkinsでビルド、S3とECRにアップロード。 CodeDeployでECS/EC2に配布。

初期はCodeDeployでデプロイしていたが、合計で100プロジェクトになってしまった。

TerraformとCodeDeployでは多すぎで管理できなくなった。

テストインフラの設定も必要で、サービスされるプラットフォームも増え、必要なテストインフラも必要になった。

テストサーバーもインフラが複雑で管理が難しい。

サービスが増えるにつれて作業量も比例して増えた

→KubernetesにMigrationした。

Terraformなどでは人が手動で触ったリソースを管理してくれないが、Kubernetesは手動で触っても自動で管理してくれる

明示的な配信管理が可能になり、環境のコピーも容易に。

コンテナの隔離された環境とリカバリー機能で障害の対処に役にたった

デプロイの流れ

Repository -> Jenkins -> ECR -> YAML -> EKS

合計で13クラスターを運用

8クラスターは本番、3クラスターはQAテスト環境(10~30のテスト環境)、2クラスターは内部管理用

EKS: マネージドで管理でき、IAMとの結合が便利

Kubernetesは全ての問題を解決する魔法の杖ではない(学ばないといけないことがたくさん)

  • YAML作成方法

  • 動作の理解

  • 相互作用するアプリケーションの理解

などなど..

Kubernetesに致命的とも言えるバグもあったりした

→大規模なクラスターしか影響が起きないバグなども

"Kubernetes is hard, and not a sliver bullet"

明らかに長所があってわかって使うなら強力なツール

QA

Q. Fargateを使うことは考えなかった?

A. タスクの作成コストがKubernetesと同じくらいで、あんまりメリットがない

Q. EKSを活用する際社員の学習コストは辛くなかったか?

A. 教育プロセスを通過できるようにする制度を作っていきたいけど、難しい

Q. Fifo Queueを使ってるのか?

A. FifoQueueを使っていない。スタンダードQueueを使って 一度伝承される、内部で重複しないようにしている

まとめ

44もの大規模なサービスが動いて正直驚きました。

大規模なアーキテクチャの話が聞けてとても面白かったです!!