SlideShare a Scribd company logo
1 of 30
DynamoDBだけで
ソシャゲをつくってみた

   2012-06-05 JAWS-UG
株式会社マイネット・ジャパン
        伊藤 祐策
自己紹介等
• 伊藤 祐策 Ito Yusaku
 – 1982年生まれ(満30歳)
     – Birth on 1982 (30 years old)
 – 釧路高専情報工学科卒
     – Kushiro National College of Technology / Information Eng
 – 電気通信大学システム工学科卒
     – The University of Electro-Communications / Systems Eng
 – 2006年10月 マイネット・ジャパン入社
     – Joined to Mynet Japan Inc Oct 2006.
会社紹介




• 株式会社マイネット・ジャパン
 – 「どこでもドアの実現」が企業理念な会社
• マイネット・ジャパンの関わり
 – 創業後すぐにジョインして5年半
 – 自社サービスをかれこれ6つほど全部関わる
システム構成紹介
System configuration
システム構成
img.falkyrie.jp           (sp|mb).falkyrie.jp


                                        Elastic Load
            Cloud Front                                 DynamoDB
                                         Balancer




            S3
                                    PHP
 Image Files
                          Application Servers



                                                       Memcache Servers
各種サーバーの詳細
• アプリケーションサーバー
 – PHP 5.3.10
 – インスタンスごとのスマフォ/ガラケーの区別
   無し
• Memcacheサーバー
 – Memcached/LibKetamaでConsistentHashing
 – VPC上に構築した都合上、ElastiCacheが使用不
   可
その他のサーバー達
• バッチサーバー
  – PHP 5.3.10
  – 主な仕事はキューの処理
  – EMRの制御も行なっている
• EMR
  – バトルイベントのランキング集計等に使用
  – 定期的に統計情報抽出タスクを実行
  – メンテ時にフルバックアップタスクを実行
開発エピソード
Episode of developments
厳しい現実
• ソシャゲ開発自体そもそも初めてだった。
 – せいぜいFacebookアプリを作った程度
 – ユーザー10万人を超えるサービスも未経験
• クラウド運用の実績なんかなかった。
 – 今まではiDCにラック借りて自前運用の日々
 – 使いたいとは思っていたけど移行とか大変
 – トライアルで色々使ってみたけどどれも微妙
当初の予定
• ストレージはMySQLで実装するつもり
  だった。
 – 商用サービスにNoSQLを採用した実績ナシ
 – 社内にNoSQL経験者は誰もいなかった
• AWSなんかそもそも使う予定がなかった。
 – なんか難しそうだった
 – でもトラブル対応の度にiDC行くのももう嫌
   だった
 – クラウドならなんでもよかった。
 – 旅行へ行きたい。というか実家帰りたい。
ワイルドな選択
• 3月13日、MySQLからDynamoDBへの乗り換
  えを決断し、実装を開始。
 – リリース71日前の話。
 – 決め手は「運用が楽ですよ!」の一言
 – テーブル設計は直感を頼りに作り直し。
• ソースコードを半分くらい捨てた
 – 捨てたのは自分が作った分だけ
 – 他メンバーが作った部分はほぼ全てそのまま
   利用した
ワイルドな時系列

 Start                  Transit                             Release
                                            71 days
Jan           Feb      Mar            Apr             May         Jun




      DynamoDB         DynamoDB
      US East Region   Tokyo Region
      Released         Released
本当にDynamoDBだけで作れるのか?
 Is it possible to implement them only DynamoDB?
DynamoDBにできないこと
• トランザクション
 – START TRANSACTION ... COMMIT / ROLLBACK
• テーブルJOIN
 – SELECT * FROM table1 LEFT OUTER JOIN table2 ...
• 一貫性のあるフルバックアップ
 – mysqldump
• 自由な条件での検索
 – SELECT * FROM table WHERE x=1 AND y=2
本当にDynamoDBだけでできるの?
• トランザクションなんて甘え
 – 無くてもなんとかなる!
• テーブルJOINも甘え
 – JOINなんて使ってたらスケールしませんよね
• フルバックアップも甘え
 – そのバックアップからリストアするつもりあ
   るの?
• 自由な条件での検索は...
 – ここをどう解決するかは腕の見せ所
本当にDynamoDBだけでできるの?

• そもそもソシャゲは殆どの処理において
  ユーザーIDが決定しているので、KVSとの
  相性は非常に良い。
 – 1回のリクエストで参照するのは、自分のデー
   タだけか、自分と誰か1人のデータのみ。
 – キーをユーザーIDにすればKVSと相性抜群
 – KVS型ならスケールもしやすい
本当にDynamoDBだけでできるの?

• ソシャゲは頻繁に仕様変更や拡張をする
  のでNoSQLとの相性も非常に良い。
 – アップデートは基本「毎週」
 – さもないとユーザーが飽きて過疎る
 – データ量が増えてきた時にALTER TABLEは死ね
   る
 – メンテ時間が長くなると公式コミュが荒ぶる
代替実装
The alternative implementations
DynamoDBにもできること
• 条件付きアップデート
 – UPDATE x=1 if x=0
 – 楽観ロックでは必須の機能
 – 条件式部分は等式(A is B)のみ指定可
• インクリメント/デクリメント
 – UPDATE x+=10
 – 更新前、更新後の値もそれぞれ取得可能
トランザクションの代替実装
• Re-Runnable設計にする
 – 2回実行されても大丈夫なように作る
   • 条件付きアップデートを駆使する
   • 更新済みなら処理がスキップされるように作る
 – 途中で失敗したら最初からやりなおす
   • Re-Runnableでさえあれば何度実行しても大丈夫
   • SQSを使って完遂保証をすると完璧!
トランザクションの代替実装
• 基本5フェーズを意識しよう
 – 入力エラーチェック
 – 書込み開始処理
 – 書込み処理
 – 書込み終了処理
 – 出力処理

  ※後戻りはしない。フェーズを混在させない。
条件検索の代替実装
• レンジキー(Range Key)というものがある
 – ハッシュキー+レンジキーで主キーになる
 – 開始点+検索方向(asc/desc)で検索ができる
 – 先頭/末尾からという検索も可能
 – 検索件数制限指定は必須
• レンジキーに指定した属性であれば検索
  は可能
 – 但しページングは無理(全体件数が分からな
   い)
条件検索の代替実装
• Amazon EMR連携でインデックスを作る
 – 全部のデータを読み取るので若干非効率
 – 古くなったデータの掃除が面倒
• SQSでリアルタイム更新インデックスを作
  る
 – 実装は面倒だけど現実的な手段
• Amazon Cloud Searchという選択肢
 – 東京リージョンでは未登場(早く!)
バックアップの代替実装
• Amazon EMR連携でS3へエクスポート
 – HELPの通りやれば簡単に出来る
 – 但し一貫性を保つにはメンテが必須
• ソシャゲの場合リストアという選択肢は
  無い
 – データのリストアはできないと諦めた上で、
   新たに戦略を立て直す
 – 戦略上意味のないことはやらない
Q.苦労した末に何を得られるのか?
    Qestion : What can we get?
答えは2つ
There are 2 answers.
A1.無制限にスケールするストレージ
  Answer#1 : The indefinitely scalable storage.
A2.安心して旅行へ行ける権利
Answer#2 : The long vacation with peace of mind.
その他紹介しきれなかったこと
• 具体的なRe-Runnable設計の実装方法
• リリース後に発生した数々のトラブル
 – そしてそれらの対処方法等
• 監視すべきサーバー性能指標
 – DynamoDB特有の問題があったりなかったり
• 利用料金チューニング
 – Read/Writeそれぞれに対するチューニング手
   法
なんか質問ある?

More Related Content

What's hot

What's hot (20)

Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方インフラエンジニアの綺麗で優しい手順書の書き方
インフラエンジニアの綺麗で優しい手順書の書き方
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
DatadogでAWS監視やってみた
DatadogでAWS監視やってみたDatadogでAWS監視やってみた
DatadogでAWS監視やってみた
 
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
 
Java EE から Quarkus による開発への移行について
Java EE から Quarkus による開発への移行についてJava EE から Quarkus による開発への移行について
Java EE から Quarkus による開発への移行について
 
AWS LambdaとDynamoDBがこんなにツライはずがない #ssmjp
AWS LambdaとDynamoDBがこんなにツライはずがない #ssmjpAWS LambdaとDynamoDBがこんなにツライはずがない #ssmjp
AWS LambdaとDynamoDBがこんなにツライはずがない #ssmjp
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
マイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karateマイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karate
 
20200212 AWS Black Belt Online Seminar AWS Systems Manager
20200212 AWS Black Belt Online Seminar AWS Systems Manager20200212 AWS Black Belt Online Seminar AWS Systems Manager
20200212 AWS Black Belt Online Seminar AWS Systems Manager
 
20200826 AWS Black Belt Online Seminar AWS CloudFormation
20200826 AWS Black Belt Online Seminar AWS CloudFormation 20200826 AWS Black Belt Online Seminar AWS CloudFormation
20200826 AWS Black Belt Online Seminar AWS CloudFormation
 
AWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
 
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
AWSとオンプレミスを繋ぐときに知っておきたいルーティングの基礎知識(CCSI監修!)
 
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!
 
AWS Wavelengthと大阪リージョンのご紹介20210414
AWS Wavelengthと大阪リージョンのご紹介20210414AWS Wavelengthと大阪リージョンのご紹介20210414
AWS Wavelengthと大阪リージョンのご紹介20210414
 
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころPython におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
 
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
 
AWS Black Belt Online Seminar 2017 Amazon DynamoDB
AWS Black Belt Online Seminar 2017 Amazon DynamoDB AWS Black Belt Online Seminar 2017 Amazon DynamoDB
AWS Black Belt Online Seminar 2017 Amazon DynamoDB
 

Viewers also liked

Viewers also liked (8)

DynamoDB活用事例 株式会社マイネット
DynamoDB活用事例 株式会社マイネットDynamoDB活用事例 株式会社マイネット
DynamoDB活用事例 株式会社マイネット
 
Flink + Prometheus + Grafanaによるアクセスログの可視化とAlerting
Flink + Prometheus + Grafanaによるアクセスログの可視化とAlertingFlink + Prometheus + Grafanaによるアクセスログの可視化とAlerting
Flink + Prometheus + Grafanaによるアクセスログの可視化とAlerting
 
Prometheus
PrometheusPrometheus
Prometheus
 
Prometheus 監視で変わるもの
Prometheus 監視で変わるものPrometheus 監視で変わるもの
Prometheus 監視で変わるもの
 
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
アナザーエデンにおける非同期オートセーブを用いた通信待ちストレスのないゲーム体験の実現
 
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
グラフデータベースNeo4Jでアセットダウンロードの構成管理と最適化
 
AWS Black Belt Online Seminar AWS 体験ハンズオン 〜 Amazon DynamoDB テーブル作成編 〜
AWS Black Belt Online Seminar AWS 体験ハンズオン 〜 Amazon DynamoDB テーブル作成編 〜AWS Black Belt Online Seminar AWS 体験ハンズオン 〜 Amazon DynamoDB テーブル作成編 〜
AWS Black Belt Online Seminar AWS 体験ハンズオン 〜 Amazon DynamoDB テーブル作成編 〜
 
当たり前を当たり前に:Agile2017レポート
当たり前を当たり前に:Agile2017レポート当たり前を当たり前に:Agile2017レポート
当たり前を当たり前に:Agile2017レポート
 

Similar to DynamoDBだけでソシャゲを作ってみた

初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし
Oonishi Takaaki
 
Data Engineering at VOYAGE GROUP #jawsdays
Data Engineering at VOYAGE GROUP #jawsdaysData Engineering at VOYAGE GROUP #jawsdays
Data Engineering at VOYAGE GROUP #jawsdays
VOYAGE GROUP
 
MySQL Casual Talks Vol.3 LT
MySQL Casual Talks Vol.3 LTMySQL Casual Talks Vol.3 LT
MySQL Casual Talks Vol.3 LT
Tomohiro Ikeda
 
動画共有ツール
動画共有ツール動画共有ツール
動画共有ツール
tamtam180
 
次世代エンタープライズの開発環境をライブで読み解く
次世代エンタープライズの開発環境をライブで読み解く次世代エンタープライズの開発環境をライブで読み解く
次世代エンタープライズの開発環境をライブで読み解く
Shin Takeuchi
 

Similar to DynamoDBだけでソシャゲを作ってみた (20)

初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし
 
sysloadや監視などの話(仮)
sysloadや監視などの話(仮)sysloadや監視などの話(仮)
sysloadや監視などの話(仮)
 
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
スマートフォン×Cassandraによるハイパフォーマンス基盤の構築事例
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
Data Engineering at VOYAGE GROUP #jawsdays
Data Engineering at VOYAGE GROUP #jawsdaysData Engineering at VOYAGE GROUP #jawsdays
Data Engineering at VOYAGE GROUP #jawsdays
 
Data Engineering at VOYAGE GROUP #jawsdays
Data Engineering at VOYAGE GROUP #jawsdaysData Engineering at VOYAGE GROUP #jawsdays
Data Engineering at VOYAGE GROUP #jawsdays
 
つぶLT20121215
つぶLT20121215つぶLT20121215
つぶLT20121215
 
MySQL Casual Talks Vol.3 LT
MySQL Casual Talks Vol.3 LTMySQL Casual Talks Vol.3 LT
MySQL Casual Talks Vol.3 LT
 
Zabbix study5lt
Zabbix study5ltZabbix study5lt
Zabbix study5lt
 
動画共有ツール
動画共有ツール動画共有ツール
動画共有ツール
 
使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!使ってみた!ioMemoryで実現する噂のAtomic write!
使ってみた!ioMemoryで実現する噂のAtomic write!
 
NTT DATA と PostgreSQL が挑んだ総力戦
NTT DATA と PostgreSQL が挑んだ総力戦NTT DATA と PostgreSQL が挑んだ総力戦
NTT DATA と PostgreSQL が挑んだ総力戦
 
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
PHP+MySQLを使ったスケーラブルなソーシャルゲーム開発
 
MySQL Cluster 新機能解説 7.5 and beyond
MySQL Cluster 新機能解説 7.5 and beyondMySQL Cluster 新機能解説 7.5 and beyond
MySQL Cluster 新機能解説 7.5 and beyond
 
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
 
Xen Nic
Xen NicXen Nic
Xen Nic
 
Minix Learning
Minix LearningMinix Learning
Minix Learning
 
次世代エンタープライズの開発環境をライブで読み解く
次世代エンタープライズの開発環境をライブで読み解く次世代エンタープライズの開発環境をライブで読み解く
次世代エンタープライズの開発環境をライブで読み解く
 
Voicepic@FukuiMASeminar
Voicepic@FukuiMASeminarVoicepic@FukuiMASeminar
Voicepic@FukuiMASeminar
 

DynamoDBだけでソシャゲを作ってみた