BrainWarsのアーキテクチャ(OpsWorks & DynamoDB編)

Preview:

Citation preview

BrainWarsの アーキテクチャ

ダウンロード突破!万

@matsukaz2015.03.19

- OpsWorks & DynamoDB編 -

@matsukaz

松下 雅和

株式会社トランスリミット

エンジニア

@matsukaz

松下 雅和

株式会社トランスリミット

エンジニア

• インフラ全般 (AWS, Chef)

• サーバ (Rails, Socket.IO, fabric)

• フロント (cocos2d-x, C++)

• 開発/運用支援 (開発用Docker, Adminサーバ)

• ChatOps推進 (slack, hubot*3)

• その他必要なことはなんでも

(コーヒー豆購入, 卓球王者,

バランスボール&スタンディングデスク布教)

主な担当

書籍

BrainWars 知ってますか?

ゲームの流れ

ホーム

バトル開始!

同一リーグの ユーザと対戦

マッチング

スタンプによる コミュニケーション

3ラウンド・バトル

(現時点で) 25種類のゲームの 中からランダムで決定

x3

1ラウンド 20秒バトル

バトル結果

3ラウンドの 合計点数で勝敗決定

各種SNSへ 結果を共有

毎週日曜24時に ランキング確定と リーグが昇降格

ランキング

面白そうでしょ? (・∀・)

わずか8ヶ月で 1000万突破!

海外ユーザ比率 95.7%

男女比ほぼ同じ

20代が約半数

AKB48もハマる!

乃木坂46や 芸人まで

創業者たち

( ´-`)。oO(ラーメン屋…?)

高場社長

工藤CTOデザイナー 花城氏

BrainWarsの アーキテクチャ

MySQL

ELB

EC2

EC2

S3

OpsWorks

ElastiCache (Redis) DynamoDB RDS

(MySQL)

EC2

SNS

CloudWatch

Route 53

Slack

リアルタイム対戦

Socket Server

API Server

SES SNS SQS

ISP

Admin Server

APK

全体構成

MySQL

ELB

EC2

EC2

S3

OpsWorks

ElastiCache (Redis) DynamoDB RDS

(MySQL)

Easy Deployment, Auto Scale (Load & Time)

EC2

ユーザデータゴースト用 バトルログ

ランキング, 一時データ

プロフィール画像, 言語ファイル, etc

SNS

CloudWatch

Route 53

Slack

リアルタイム対戦

Socket Server

API Server

SES SNS SQS

ISP

Admin Server

プレイ中

MySQL

ELB

EC2

EC2

S3

OpsWorks

ElastiCache (Redis) DynamoDB RDS

(MySQL)

EC2

SNS

CloudWatch

Route 53

Slack

リアルタイム対戦

Socket Server

API Server

SES SNS SQS

ISP

メール送信 送信失敗時

Admin Server

メール送信

MySQL

ELB

EC2

EC2

S3

OpsWorks

ElastiCache (Redis) DynamoDB RDS

(MySQL)

CloudWatch

Route 53

リアルタイム対戦

Socket Server

API Server

EC2

SNS

Slack

プッシュ通知

SES SNS SQS

ISP

Admin Server

device token登録

プッシュ通知

fabric, rake tasks

MySQL

ELB

EC2

EC2

S3

OpsWorks

ElastiCache (Redis) DynamoDB RDS

(MySQL)

CloudWatch

Route 53

リアルタイム対戦

Socket Server

API Server

EC2

SNS

Slack

画像削除

SES SNS SQS

ISP

Admin Server

通報, 問合せ対応

fabric, rake tasks

名前変更, BAN, コイン付与, …

MySQL

ELB

EC2

EC2

S3

OpsWorks

ElastiCache (Redis) DynamoDB RDS

(MySQL)

CloudWatch

Route 53

リアルタイム対戦

Socket Server

API Server

EC2

SNS

Slack

SES SNS SQS

ISP

Admin Server

Auto Scale

その他運用

APKビルド

Dynamic DynamoDB

fabric, rake tasks

MySQL

ELB

EC2

EC2

S3

OpsWorks

ElastiCache (Redis) DynamoDB RDS

(MySQL) SES SNS SQS

Easy Deployment, Auto Scale (Load & Time)

EC2

ユーザデータゴースト用 バトルログ

ランキング, 一時データ ISP

プロフィール画像, 言語ファイル, etc

メール送信

SNS

送信失敗時

CloudWatch

Route 53

device token登録

Slack

プッシュ通知

リアルタイム対戦

Socket Server

API Server

Auto Scale

名前変更, BAN, コイン付与, …

Admin Server

APKビルド

画像削除

全体構成

Dynamic DynamoDB

fabric, rake tasks

BrainWars

OpsWorks

×

OpsWorksの特徴• Chefを利用したアプリケーション管理サービス

• 環境構築とアプリケーションのデプロイを自動化

• 幅広いアーキテクチャをデフォルトでサポート

• Chefのレシピ追加などでカスタマイズも可能

• ELBと自動連携

• オートスケール設定

Instances ELB利用

EIP付与

コストを考慮 して1aのみ(※)

想定外の負荷対応

ピーク時間のみ

※Multi-AZでは、AZ毎に同じ台数のサーバを配置するのが一般的なため

工夫している点• Chefのレシピ追加

• ephemeral diskをマウントして有効活用

• file descriptorなどのチューニング

• monitプロセスを再起動

(チューニング内容が反映されていないため)

• CloudWatch連携(独自メトリクス、ALARM)

工夫している点• カスタムAMI、EBS-Bootによる起動速度向上

(7分以上 → 2分弱に短縮)

http://blog.celingest.com/en/2014/04/25/benckmark-boot-time-comparison-opsworks/

参考データ

課題• デプロイすると勝手にELBと連携しちゃう…

メンテ状態に切り替えて、 ELBからEC2切り離して、 アプリをデプロイっと!

さてEC2に直接アクセスで サーバの動作確認を…えっ? すでにELBで外部に公開されてる?!

ヽ(=´▽`=)ノ

∑(゚д゚lll)

BrainWars

DynamoDB

×

DynamoDBの特徴

ご存知ですよね?

(時間なくて書けなかった…)

Tables• バトルログ

• ユーザがバトルしたときの操作ログ

• PKはHash & Range、HashにはユーザID、

RangeにはトレーニングID (25種類)

• データ量は約80GB、アイテム数は1億弱

• 通常はWriteのみ、Readは後述するケースのみ

通常対戦時Socket Server

API Server

host guest

待機中ユーザが 2人になると マッチング ②

socket接続 socket接続① ①

通常対戦時Socket Server

API Server

host guest

問題の取得

問題データを共有

通常対戦時Socket Server

API Server

host guest

結果の送信

操作データを相互送信

結果の送信

操作ログ保存⑦

相手がいなかったら どうしよう?

((((;゚Д゚))))

相手がいないときSocket Server

API Server

host

マッチング 待ち ②

socket接続①

・・・

相手がいないときSocket Server

API Server

host

タイムアウトで 切断 ③・・・

ゴーストを 要求 ④ 対戦相手を

ランダムで選んで 操作ログを返却

相手がいないときSocket Server

API Server

host

・・・

結果の送信⑦

操作ログ保存⑧

ghost

操作ログと 対戦 ⑥

スタンプは? 無反応になる?

ちょっとした ロジックで

反応するように実装

弊社デザイナー 「いやぁ、♥送ったらいっぱい♥きたわ」 「オレ、モテるかもしんねー(*ノω・*)テヘ」

社長 「昨晩はsocketサーバ落ちてたわ」 「それゴーストですよ」

socketサーバ 落ちたらどうしよう?

((((;゚Д゚))))

socket死亡時Socket Server

API Server

host

接続失敗 ②

socket接続①

・・・

あとは相手が いないときと動きは一緒! 緊急時の動作も兼ねてた!! ありがたやーヽ(=´▽`=)ノ

宣伝

ただいま メンバーを募集中!

• エンジニア

• プロデューサー

• CFO/COO候補

• デザイナー

• プランナー

5億DL〜 17億DL〜5億DL〜

世界をターゲットに DL数で億超えを目指す

社内勉強会 T-Cube (Translimit Tech Talk)

バランスボールや スタンディングデスク

お待ちしてます!