SlideShare a Scribd company logo
1 of 145
Download to read offline
サーバー未経験者が
ソーシャルゲームを通して知った
サーバーの事
2014/2/8 ゲームサーバ勉強会

株式会社gumi
古閑学/@_mamehiko_
自己紹介
古閑 学/@_mamehiko_
株式会社gumi 東京オフィス エンジニア
2013/12で3年目。
肩書きは(名ばかり)スペシャリスト
最近はcocos2d-xでクライアントエンジニア
以前はコンシューマーでプログラマを8年程
2児の娘のパパ
会社外で話すのは初めて

自己紹介
gumiって?

自己紹介
自己紹介(gumiでは)

2011

2012

自己紹介

2013

上記サーバーサイドの開発をしてました。
騎士道とドラゴンジェネシスでは元リードエンジニア
今日のお話

今日のお話

上級者
サーバー未経験からソーシャルゲームを
通して得た経験をさらけ出します。
インフラ

開発

コード失敗事例とか
当時の思い込みとか

初心者
アジェンダ

アジェンダ

前提

最後に

トライアル&エラー編

キャッシュ
Redis

2011∼
2012∼

まとめ

ギルドバトル編
マスターデータ
バトル
マッチング
アジェンダ

アジェンダ

前提

最後に

トライアル&エラー編

キャッシュ
Redis

2011∼
2012∼

まとめ

ギルドバトル編
マスターデータ
バトル
マッチング
前提
言語
python2.7

Webフレームワーク
Django1.4以上

DataBase
MySQL5.5

前提
アジェンダ

アジェンダ

前提

最後に

トライアル&エラー編

キャッシュ
Redis

2011∼
2012∼

まとめ

ギルドバトル編
マスターデータ
バトル
マッチング
初めてのソーシャルゲーム
構成

2011∼

TokyoTyrant

ロードバランサ

Appサーバー

MySQL

memcached
RDS(MySQL)
マスターデータ
プレイヤーデータ
ギルドデータ
などが一つのDBに

2011∼
RDS(MySQL)
マスターデータ
プレイヤーデータ
ギルドデータ
などが一つのDBに
つまり全部入り

2011∼
なんか、クエリってのを
減らした方がいいらしい
後、KVSってのがあるらしい
なんか、クエリってのを
減らした方がいいらしい
後、KVSってのがあるらしい

雰囲気でやってた時代!

※あくまで個人の発言です
KVS(TokyoTyrant)

2011∼

TokyoTyrant

ロードバランサ

APサーバー

MySQL

memcached
データの選定
例えばこんなゲーム
プレイヤーには体力がある
体力を消費してクエストを進める
クエストを進めると経験値が入る
経験値が入るとレベルアップする

2011∼
例えばこんなゲーム
プレイヤーには体力がある
体力を消費してクエストを進める
クエストを進めると経験値が入る
経験値が入るとレベルアップする
あるあるソーシャルゲーム

2011∼
更新の高いものをKVSへ
プレイヤーには体力がある
体力を消費してクエストを進める
クエストを進めると経験値が入る
経験値が入るとレベルアップする
SQL減らしたいしね!

2011∼
うまくいった
ようにみえたが。。。
例えばこんなコード

2011∼

#  この中はトランザクション内という仮定

try:

        #  プレイヤーの体⼒力力を消費

        player.consume_̲vitality()
        #  プレイヤーの経験値アップ

        player.add_̲experience()
except:
        #  エラー起きたらDBをロールバック

        transaction.rollback()
else:

        #  問題なければDB更更新。経験値が増える。

        transaction.commit()

体力→KVS

経験値→DB
※実際のコードとは異なります
例えばこんなコード

2011∼

#  この中はトランザクション内という仮定

try:

        #  プレイヤーの体⼒力力を消費

        player.consume_̲vitality()
        #  プレイヤーの経験値アップ

        player.add_̲experience()
except:

←ここでエラー

        #  エラー起きたらDBをロールバック

        transaction.rollback()
else:

        #  問題なければDB更更新。経験値が増える。

        transaction.commit()

体力→KVS

経験値→DB
どうなるか
どうなる?
#  この中はトランザクション内という仮定

try:

        #  プレイヤーの体⼒力力を消費

        player.consume_̲vitality()
        #  プレイヤーの経験値アップ

        player.add_̲experience()
except:
        #  エラー起きたらDBをロールバック

        transaction.rollback()
else:

        #  問題なければDB更更新。経験値が増える。

        transaction.commit()

2011∼

体力は消費される
経験値付与でエラーが起きる
どうなる?
#  この中はトランザクション内という仮定

try:

        #  プレイヤーの体⼒力力を消費

        player.consume_̲vitality()

2011∼

体力は消費される
経験値付与でエラーが起きる

        #  プレイヤーの経験値アップ

        player.add_̲experience()
except:
        #  エラー起きたらDBをロールバック

        transaction.rollback()
else:

        #  問題なければDB更更新。経験値が増える。

        transaction.commit()

体力だけが消費される
ユーザーの不利益となる
原因は様々
単純にバグッてる
アクセス過多
サーバーが息をしていないetc...

2011∼
原因は様々
単純にバグッてる
アクセス過多
サーバーが息をしていないetc...
想定外の事が起きるんです

2011∼
回避策
順番を変える

2011∼

#  この中はトランザクション内という仮定

try:

        #  プレイヤーの体⼒力力を消費

        #  player.consume_̲vitality()
        #  プレイヤーの経験値アップ

        player.add_̲experience()
except:

        #  エラー起きたらDBをロールバック

        transaction.rollback()
else:

        #  問題なければDB更更新。経験値が増える。

        transaction.commit()

#  プレイヤーの体⼒力力を最後に消費

player.consume_̲vitality()

DB更新後に移動
ユーザー視点で考える

2011∼

エラーケース
変更前

1.体力も減らないが、経験値も増えない
2.体力だけが減り、経験値は増えない
ユーザー視点で考える

2011∼

エラーケース
変更前

1.体力も減らないが、経験値も増えない
2.体力だけが減り、経験値は増えない

エラーケース

変更後

1.体力も減らないが、経験値も増えない
2.体力は減らないが、経験値は増える
ユーザーにはお得!!
根本解決ではないが、
回避のテクニック
学んだこと

DBとKVSの整合性は難しい

2011∼
さらにクエリを減らす
構成

2011∼

TokyoTyrant

ロードバランサ

APサーバー

RDS

memcached
参照の多いデータ
マスターデータ
プレイヤー
プレイヤーのカードとか

2011∼
参照の多いデータ
マスターデータ
プレイヤー
プレイヤーのカードとか

軽くする=キャッシュしかないと思ってた

2011∼
あるあるキャッシュバグ

2011∼

更新したはずが昔のデータを参照している
キャッシュ削除忘れ
回避策
更新箇所ではDBから取得
#  プレイヤーデータをDBから取得

2011∼

player  =  player.objects.get(player_̲id=”111”)
更新箇所ではDBから取得

2011∼

#  プレイヤーデータをDBから取得

player  =  player.objects.get(player_̲id=”111”)

DBで不整合を起こす率は減った
ただ、キャッシュから取得している所では
タイミング次第で表示ずれが起きる
学んだこと

キャッシュを多用すると
バグりやすいし、
バグも見つけにくい

2011∼
2011年まとめ

KVSの基本的な使い方を学ぶ

2011∼
アジェンダ

アジェンダ

前提

最後に

トライアル&エラー編

キャッシュ
Redis

2011∼
2012∼

まとめ

ギルドバトル編
マスターデータ
バトル
マッチング
ユーザーが順調に増えてきた
さらに

2012∼
○日後に広告打つんで
さらにユーザー増えますよ!

おぉ、いいっすね!
さらに

2012∼
○日後に広告打つんで
さらにユーザー増えますよ!

おぉ、いいっすね!

負荷大丈夫ですよね?
フカ!

大丈夫です(震え声)
色々きつくなるかも

2012∼

ロードバランサ

Appサーバー

memcached

Redis
RDS
負荷対策を考える

2012∼

ロードバランサ

容易
加は
追
Appサーバー

memcached

Redis
RDS
負荷対策を考える

ロードバランサ

2012∼

使用

方法
の
見直
し

Appサーバー

memcached

Redis
RDS
問題はRDS
負荷対策を考える

2012∼

スケールアップ
サーバーそのものを増強。CPUとかメモリとか。
増強する性能に限界がある

スケールアウト
サーバーの台数を増やす事で処理性能をあげる
色々きつくなるかも

2012∼

ロードバランサ

Appサーバー

memcached

Redis
RDS
どれくらいかがわからない。。
負荷対策を考える

2012∼

スケールアップ
サーバーそのものを増強。CPUとかメモリとか。
増強する性能に限界がある

スケールアウト

採用

サーバーの台数を増やす事で処理性能をあげる
規模不明だし
初期構成

2012∼

マスターデータ
ギルド
プレイヤー
イベント
スケールアウト(垂直)
マスターデータ

ギルド

プレイヤー

イベント

2012∼
スケールアウト(水平)

2012∼

マスターデータ

ギルド

プレイヤー1 プレイヤー2 プレイヤー3 プレイヤー4

イベント
スケールアウト(水平)

2012∼

マスターデータ

シャード
を分割

ギルド

プレイヤー0
〃4
〃8
〃12

イベント

プレイヤー1
〃5
〃9

プレイヤー2
〃6
〃10

〃13

〃14

プレイヤー3
〃7
〃11
〃15
シャードの決定

2012∼

#  プレイヤーIDはユニークである事が前提

player_̲id  =  “hamspamegg”

#  適当なハッシュ関数などで数値にし、シャードの分割数で余りを求める
#  16  =  playerのDBの総シャード数
#  0〜~15の値が取得出来る

player_̲db_̲number  =  _̲hash(player_̲id)  %  16

※実際のコードとは異なります
うまくいった
ようにみえたが。。。
障害

2012∼

マスターデータ

ギルド

プレイヤー0
〃4
〃8
〃12

イベント

プレイヤー1
〃5
〃9

プレイヤー2
〃6
〃10

〃13

〃14

プレイヤー3
〃7
〃11
〃15
原因

2012

ある処理だけ分割が効いていなかった
初期化に入れていた空文字が
特定のシャードを指していた
#  プレイヤーIDはユニークである事が前提

player_̲id  =  “”

if  何かの条件:
        player_̲id  =  getHoge()
else:
        #  偽の処理理....  player_̲idが””のまま
        ...
player_̲db_̲number  =  _̲hash(player_̲id)  %  16
どうなる?

2012∼

プライマリキーがAUTO INCREMENTの
IDの場合、同構成のテーブルでも、
各シャードで同じIDが存在する
player_idが空文字列で上書きされ、
元々持っていたユーザーからは
特定できなくなる
どうなる?

2012∼

プライマリキーがAUTO INCREMENTの
IDの場合、同構成のテーブルでも、
各シャードで同じIDが存在する
player_idが空文字列で上書きされ、
元々持っていたユーザーからは
特定できなくなる

つまり、データが消える!!
復活
プレイヤーの行動ログから、
想定されるデータの洗い出し
ただ、残っていないログもあり、
完全な復活は難しかった

2012∼
学んだこと

2012∼

スケールアウトは原因の特定が困難な事も
入念なデバッグと、ログを仕込もう
引き続き分割(おまけ)
ユーザー数の減少。。

2012∼
ユーザー数の減少。。

2012∼

負荷は下
がる
ユーザー数の減少。。

2012∼

負荷は下
がる

が

コストが
かかる!

!
RDSはコストかかる。。

2012∼

マスターデータ

ギルド

プレイヤー0
〃4
〃8
〃12

イベント

プレイヤー1
〃5
〃9

プレイヤー2
〃6
〃10

〃13

〃14

プレイヤー3
〃7
〃11
〃15
統合

2012∼

マスターデータ

シャード

ギルド

プレイヤー0
〃4
〃8
〃12

イベント

プレイヤー1
〃5
〃9
〃13

プレイヤー2
〃6
〃10
〃14

そのまま

プレイヤー3
〃7
〃11
〃15

コスト削減
逆を言えば
分割も楽

2012∼

マスターデータ

シャード

そのまま

ギルド

プレイヤー0
〃4
〃8
〃12

イベント

プレイヤー1
〃5
〃9

プレイヤー2
〃6
〃10

〃13

〃14

プレイヤー3
〃7
〃11

アプリのソースに
変更いらず

〃15
学んだこと

負荷が少なくとも、
スケール可能な設計にしよう

2012∼
2012年まとめ

DBの分割について学ぶ

2012∼
ここまでが主なトライアル&エラー
アジェンダ

アジェンダ

前提

最後に

トライアル&エラー編

キャッシュ
Redis

2011∼
2012∼

まとめ

ギルドバトル編
マスターデータ
バトル
マッチング
集大成
いつもの会話
25人vs25人のギルドバトル
をしたいんだけど

おぉ、いいっすね!

ギルドバトル
いつもの会話
25人vs25人のギルドバトル
をしたいんだけど

おぉ、いいっすね!

負荷大丈夫ですよね?
フカ!

大丈夫です(震え声)

ギルドバトル
例えばこんなバトル

ギルドバトル

ギルドvsギルド
プレイヤーにはHP、行動力、攻撃力等がある
行動力を消費して別のプレイヤーを攻撃する
対象プレイヤーは一人の時もあれば複数もある
与えたダメージはギルドにポイントとして入る
基本構成

マスタデータ

マスターデータ

ギルド

プレイヤー0
〃4
〃8
〃12

プレイヤー1
〃5
〃9

プレイヤー2
〃6
〃10

〃13

〃14

プレイヤー3
〃7
〃11
〃15
改善
基本構成

マスタデータ

昔からあるこれ

マスターデータ

ギルド

プレイヤー0
〃4
〃8
〃12

プレイヤー1
〃5
〃9

プレイヤー2
〃6
〃10

〃13

〃14

プレイヤー3
〃7
〃11
〃15
マスターデータ

マスタデータ

今まではjsonをマスターDBにいれて参照
キャッシュがあれば、キャッシュから取得
参照度は一番高い
Appサーバーでのメモ化とかも
マスターデータ

マスタデータ

Appサーバー

マスターデータ
③

ロードバランサ

①
②
memcached

① Appサーバーのメモリにアクセス
② キャッシュにアクセス
③ DBにアクセス
というのが2012まで
マスターデータ
Appサーバー
(マスターデータ)

ロードバランサ

マスタデータ

マスターデータ

①
memcached

① Appサーバーにマスターデータがある!!
どういうこと?
以前

マスタデータ

1. jsonの内容をDBに保存
2. DBにアクセスしてデータを取得
どういうこと?
以前

今

マスタデータ

1. jsonの内容をDBに保存
2. DBにアクセスしてデータを取得

jsonをAppサーバーに展開
マスターデータ

マスタデータ

Appサーバー

全てがマスターデータを持つ
ロードバランサ

Appサーバーで完結するので高速
デメリット?

マスタデータ

Appサーバーでのプロセスが大きくなる
が、約1年運用した結果でも今の所問題なし

デプロイ時にメモリは解放されます
というわけで
基本構成
マスターデータ

マスタデータ

マスターデー

タのDBを使わ

なくなった

ギルド

プレイヤー0
〃4
〃8
〃12

プレイヤー1
〃5
〃9

プレイヤー2
〃6
〃10

〃13

〃14

実際はソースの名残で一部使ってますが...

プレイヤー3
〃7
〃11
〃15
アジェンダ

アジェンダ

前提

最後に

トライアル&エラー編

キャッシュ
Redis

2011∼
2012∼

まとめ

ギルドバトル編
マスターデータ
バトル
マッチング
今まで通りにやると。。。
単体攻撃

バトル

ギルド

プレイヤー0
〃4
〃8
〃12

プレイヤー1
〃5
〃9

プレイヤー2
〃6
〃10

〃13

〃14

Attack!!

プレイヤー3
〃7
〃11
〃15
複数攻撃

バトル

最大17

箇所への

アクセス
!

ギルド

プレイヤー0
〃4
〃8
〃12

プレイヤー1
〃5
〃9

プレイヤー2
〃6
〃10

プレイヤー3
〃7
〃11

〃13

〃14

〃15

Attack!!x16
さらに、ギルドバトルだと
同時に起きる可能性も

これでもまだ半分以下

バトル
見るからにきつい
問題点

バトル

対象のDBが多いと、管理が難しくなる
アクセスが大変。というかしたくない
対応策
ギルドバトル専用DB

バトル

ギルド

プレイヤー0
〃4
〃8
〃12

プレイヤー1
〃5
〃9

プレイヤー2
〃6
〃10

〃13

〃14

ギルドバトル1

ギルドバトル2

〃3
〃5

〃4
〃6

〃7

〃8

New!!

プレイヤー3
〃7
〃11
〃15
必要なデータの選定

バトル

ギルド
ギルドメンバーのレベル
ギルドメンバーの職業
ギルドメンバーのカード
ギルドメンバーのカードのレベルとかとか
マッチング

バトル

ギルド

バッチサーバー
プレイヤー

バトルの数十分前にcronでバッチが流れる
対戦ギルドの組み合わせを決める
マッチング

バトル

ギルド
#  マッチングIDの発⾏行行

matching_̲id  =  uuid4()

バッチサーバー
プレイヤー

対戦の組み合わせごとに
マッチングID(UUID)を発行する
マッチング

バトル

ギルド

スナップショット
ギルドバトル

バッチサーバー
プレイヤー

マッチングIDを元にギルドバトルDBを選択し、
スナップショットを取る
分割特定はプレイヤーDBの
特定と同じロジック
閉じた戦い

バトル

ギルドA

ギルドB

ギルドC

ギルドD

ギルドE

ギルドF

ギルドバトルDB
うまくいった
が
まだ問題が

一つのDBに集まったとはいえ、
同時に攻撃した場合に問題が起きる
レース・コンディション

バトル
レースコンディション
mame

バトル

hiko

体力100

体力100

mameとhikoのデータを取得

mameとhikoのデータを取得
hikoに攻撃
mameに攻撃
save()
save()
mame視点

バトル

mame

hiko

体力100

体力100

mameとhikoのデータを取得

mameとhikoのデータを取得
ここで攻撃
したから

hikoに攻撃
mameに攻撃

hikoの体力は
save()
100未満(のはず)
save()
一方。。

バトル

mame

hiko

体力100

体力100

mameとhikoのデータを取得

mameとhikoのデータを取得
ここで攻撃
したから

体力100のデータ
を取得

hikoに攻撃
mameに攻撃

hikoの体力は
save()
100未満(のはず)
save()

体力100のまま
save
実際は。。

バトル

mame

hiko

体力100

体力100

mameとhikoのデータを取得
た事に
っ

が無か
攻撃
る!
な
ここで攻撃
したから

mameとhikoのデータを取得
体力100のデータ
を取得

hikoに攻撃
mameに攻撃

hikoの体力は
save()
100未満(のはず)
save()

体力100のまま
save
対応策
唯一の共通オブジェクト
GuildBattleManager
matching_id
ギルドA

ギルドB

バトル
唯一の共通オブジェクト

バトル

更新処理は必ずManagerを通す
Managerで行ロックをかける
共通オブジェクトなのでデッドロック無し
順番

バトル
mame

hiko

体力100

体力100
一旦処理が止められ

Manager
mameとhikoのデータを取得

hikoに攻撃

save()
順番

バトル
mame

hiko

体力100

体力100
mameの処理終了後に流れ出す

Manager
mameとhikoのデータを取得
mameとhikoのデータを取得
hikoに攻撃

mameに攻撃

save()
save()

攻撃を受けた後のデータが
取得される
順番

バトル
mame

hiko

体力100

体力100
mameの処理終了後に流れ出す

Manager
mameとhikoのデータを取得
mameとhikoのデータを取得
hikoに攻撃

mameに攻撃

トランザクションは必須
save()
save()

攻撃を受けた後のデータが
取得される
うまくいった
本当に!
これで全てが終わったかに見えた
アジェンダ

アジェンダ

前提

最後に

トライアル&エラー編

キャッシュ
Redis

2011∼
2012∼

まとめ

ギルドバトル編
マスターデータ
バトル
マッチング
終わらないマッチング
日ごとに増えるユーザー
日ごとに増えるデータ
日ごとに延びるマッチング時間
日ごとに短くなる睡眠時間

マッチング
改善

マッチング

ギルド

スナップショット
ギルドバトル

バッチサーバー
プレイヤー

バッチサーバーから直接ギルドバトルDBにコピーしていた
改善

マッチング

ギルド

#  ギルドIDの対戦リスト

guild_̲ids  =  ([1,  2],[3,4],[5,6])

バッチサーバー

Redis

プレイヤー

Redisに
対戦ギルドの組み合わせのIDのみのリスト
を入れる
改善

マッチング

ギルド

バッチサーバー
プレイヤー

Redis

ジョブサーバー

Redisに対戦リストが入っていないかを常に問い合わせる
改善

マッチング

ギルド

,2] [5,6]
[1
[3,4
]
ギルドバトル

バッチサーバー

Redis

ジョブサーバー

プレイヤー

Redisに入っている対戦リストから
組み合わせのIDをポップし、
並列でスナップショットを取る

スナップショット
終わるマッチング

マッチング

Redisのデータ操作は
アトミック性が保証されている
対戦リストが増えて処理が終わらなくなったら
ジョブサーバーを増やす
マッチング時間が5分の1に

俺が泣いた
アジェンダ

アジェンダ

前提

最後に

トライアル&エラー編

キャッシュ
Redis

2011∼
2012∼

まとめ

ギルドバトル編
マスターデータ
バトル
マッチング
キャッシュ

最後に

余り使っていない
キャッシュが残るバグは今でもある
今までは重いクエリをごまかしていた
それよりもDBのindexを適切に張る
Jetprofiler

重いクエリを検知してくれる
indexミスなのでアクセス障害が
起きた時などに重宝した

最近は使ってないかもしれない
ですが、、

最後に
Redis

最後に

ランキングや1日1回フラグなどに使用
expireを設定するとメモリの節約にもなる
消えても痛くないデータだが、
なるべく永続的に残したいもの
アジェンダ

アジェンダ

前提

最後に

トライアル&エラー編

キャッシュ
Redis

2011∼
2012∼

まとめ

ギルドバトル編
マスターデータ
バトル
マッチング
まとめ

まとめ

DBは規模によらずスケールアウト前提で
最初からKVSに手を出さない
DBで効率が悪そうなもので考える
キャッシュは使わないという選択肢
色々あるけどまとめきれず
ご清聴ありがとうございました

More Related Content

What's hot

日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
Yuusuke Takeuchi
 

What's hot (20)

ソーシャルゲームの為のデータベース設計
ソーシャルゲームの為のデータベース設計ソーシャルゲームの為のデータベース設計
ソーシャルゲームの為のデータベース設計
 
サーバーのおしごと
サーバーのおしごとサーバーのおしごと
サーバーのおしごと
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
 
Go 製リアルタイムサーバーの Kubernetes での運用について
Go 製リアルタイムサーバーの  Kubernetes での運用についてGo 製リアルタイムサーバーの  Kubernetes での運用について
Go 製リアルタイムサーバーの Kubernetes での運用について
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps Online
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps OnlineGoogle Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps Online
Google Cloud Game Servers 徹底入門 | 第 10 回 Google Cloud INSIDE Games & Apps Online
 
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
 
ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装ソーシャルゲーム案件におけるDB分割のPHP実装
ソーシャルゲーム案件におけるDB分割のPHP実装
 
ゲームの仕様書を書こう4 仕様書作成で楽をするconfluenceの活用
ゲームの仕様書を書こう4 仕様書作成で楽をするconfluenceの活用ゲームの仕様書を書こう4 仕様書作成で楽をするconfluenceの活用
ゲームの仕様書を書こう4 仕様書作成で楽をするconfluenceの活用
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
ユーザーインタビューするときは、どうやらゾンビのおでましさ
ユーザーインタビューするときは、どうやらゾンビのおでましさユーザーインタビューするときは、どうやらゾンビのおでましさ
ユーザーインタビューするときは、どうやらゾンビのおでましさ
 
ネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分けネットワーク ゲームにおけるTCPとUDPの使い分け
ネットワーク ゲームにおけるTCPとUDPの使い分け
 
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
 
PHPで大規模ブラウザゲームを開発してわかったこと
PHPで大規模ブラウザゲームを開発してわかったことPHPで大規模ブラウザゲームを開発してわかったこと
PHPで大規模ブラウザゲームを開発してわかったこと
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 

Viewers also liked

データに振り回されて失敗した あんなことやこんなこと ~ゲームのために必要な本当の ビジネス・アナリティクス~
データに振り回されて失敗したあんなことやこんなこと~ゲームのために必要な本当のビジネス・アナリティクス~データに振り回されて失敗したあんなことやこんなこと~ゲームのために必要な本当のビジネス・アナリティクス~
データに振り回されて失敗した あんなことやこんなこと ~ゲームのために必要な本当の ビジネス・アナリティクス~
Daisuke Nogami
 
MySQL Index勉強会外部公開用
MySQL Index勉強会外部公開用MySQL Index勉強会外部公開用
MySQL Index勉強会外部公開用
CROOZ, inc.
 

Viewers also liked (16)

Amebaソシャゲ分析事例のご紹介
Amebaソシャゲ分析事例のご紹介Amebaソシャゲ分析事例のご紹介
Amebaソシャゲ分析事例のご紹介
 
データに振り回されて失敗した あんなことやこんなこと ~ゲームのために必要な本当の ビジネス・アナリティクス~
データに振り回されて失敗したあんなことやこんなこと~ゲームのために必要な本当のビジネス・アナリティクス~データに振り回されて失敗したあんなことやこんなこと~ゲームのために必要な本当のビジネス・アナリティクス~
データに振り回されて失敗した あんなことやこんなこと ~ゲームのために必要な本当の ビジネス・アナリティクス~
 
CEDEC2013 ソーシャルゲームの開発現場でUXについて思いっきりあがいてみた1年間の話
CEDEC2013 ソーシャルゲームの開発現場でUXについて思いっきりあがいてみた1年間の話CEDEC2013 ソーシャルゲームの開発現場でUXについて思いっきりあがいてみた1年間の話
CEDEC2013 ソーシャルゲームの開発現場でUXについて思いっきりあがいてみた1年間の話
 
MySQL Index勉強会外部公開用
MySQL Index勉強会外部公開用MySQL Index勉強会外部公開用
MySQL Index勉強会外部公開用
 
わかった気になるMySQL
わかった気になるMySQLわかった気になるMySQL
わかった気になるMySQL
 
分割と整合性と戦う
分割と整合性と戦う分割と整合性と戦う
分割と整合性と戦う
 
Imprementation of realtime_networkgame
Imprementation of realtime_networkgameImprementation of realtime_networkgame
Imprementation of realtime_networkgame
 
負荷がたかいいんだから~♪(仮)
負荷がたかいいんだから~♪(仮)負荷がたかいいんだから~♪(仮)
負荷がたかいいんだから~♪(仮)
 
MMOのサーバについて 剣と魔法のログレス ~いにしえの女神~ での実装例
MMOのサーバについて 剣と魔法のログレス ~いにしえの女神~ での実装例MMOのサーバについて 剣と魔法のログレス ~いにしえの女神~ での実装例
MMOのサーバについて 剣と魔法のログレス ~いにしえの女神~ での実装例
 
Fluentd and Embulk Game Server 4
Fluentd and Embulk Game Server 4Fluentd and Embulk Game Server 4
Fluentd and Embulk Game Server 4
 
Halo2 におけるHFSM(階層型有限状態マシン) 【ビヘイビアツリー解説】
Halo2 におけるHFSM(階層型有限状態マシン)  【ビヘイビアツリー解説】Halo2 におけるHFSM(階層型有限状態マシン)  【ビヘイビアツリー解説】
Halo2 におけるHFSM(階層型有限状態マシン) 【ビヘイビアツリー解説】
 
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜 リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
 
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
負荷対策しておもったことまとめ~JMeterでSocket.IOもいけるでよ~
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方
 
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
 

Similar to サーバー未経験者がソーシャルゲームを通して知ったサーバーの事

Boost.勉強会 #13 @仙台 鳥小屋
Boost.勉強会 #13 @仙台 鳥小屋Boost.勉強会 #13 @仙台 鳥小屋
Boost.勉強会 #13 @仙台 鳥小屋
Yuto M
 
GREE TechTalk グリーのクライアント技術戦略
GREE TechTalk グリーのクライアント技術戦略GREE TechTalk グリーのクライアント技術戦略
GREE TechTalk グリーのクライアント技術戦略
Daniel-Hiroyuki Haga
 
年の瀬リアルタイム通信サーバ勉強会
年の瀬リアルタイム通信サーバ勉強会年の瀬リアルタイム通信サーバ勉強会
年の瀬リアルタイム通信サーバ勉強会
モノビット エンジン
 

Similar to サーバー未経験者がソーシャルゲームを通して知ったサーバーの事 (20)

WordPress 3.8 RC1
WordPress 3.8 RC1WordPress 3.8 RC1
WordPress 3.8 RC1
 
Boost.勉強会 #13 @仙台 鳥小屋
Boost.勉強会 #13 @仙台 鳥小屋Boost.勉強会 #13 @仙台 鳥小屋
Boost.勉強会 #13 @仙台 鳥小屋
 
Web制作で培ってきたFlashのリッチな表現力をモバイルアプリに
Web制作で培ってきたFlashのリッチな表現力をモバイルアプリにWeb制作で培ってきたFlashのリッチな表現力をモバイルアプリに
Web制作で培ってきたFlashのリッチな表現力をモバイルアプリに
 
PWA+WebARをECサイトで使ってみたい
PWA+WebARをECサイトで使ってみたいPWA+WebARをECサイトで使ってみたい
PWA+WebARをECサイトで使ってみたい
 
モバイル&コンシューマ向けのシステム開発ができるPHP&Javaプログラマの皆様へ
モバイル&コンシューマ向けのシステム開発ができるPHP&Javaプログラマの皆様へモバイル&コンシューマ向けのシステム開発ができるPHP&Javaプログラマの皆様へ
モバイル&コンシューマ向けのシステム開発ができるPHP&Javaプログラマの皆様へ
 
GREE TechTalk グリーのクライアント技術戦略
GREE TechTalk グリーのクライアント技術戦略GREE TechTalk グリーのクライアント技術戦略
GREE TechTalk グリーのクライアント技術戦略
 
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
XPages Day 2013 [B-3] XPages開発を始める Notes技術者のためのWeb技術概論
 
アプリの「無事故リリース」を目指して~品質管理部によるSmartBeat活用事例~
アプリの「無事故リリース」を目指して~品質管理部によるSmartBeat活用事例~ アプリの「無事故リリース」を目指して~品質管理部によるSmartBeat活用事例~
アプリの「無事故リリース」を目指して~品質管理部によるSmartBeat活用事例~
 
1ヶ月で作り切る!スタートアップのための Rails 爆速開発術 (20170306)
1ヶ月で作り切る!スタートアップのための Rails 爆速開発術 (20170306)1ヶ月で作り切る!スタートアップのための Rails 爆速開発術 (20170306)
1ヶ月で作り切る!スタートアップのための Rails 爆速開発術 (20170306)
 
3D勉強会 第1回 3Dプログラミングのススメ
3D勉強会 第1回 3Dプログラミングのススメ3D勉強会 第1回 3Dプログラミングのススメ
3D勉強会 第1回 3Dプログラミングのススメ
 
消滅都市5周年の運営を支えた技術とその歴史
消滅都市5周年の運営を支えた技術とその歴史消滅都市5周年の運営を支えた技術とその歴史
消滅都市5周年の運営を支えた技術とその歴史
 
Devsumi2013 gunta 2_pdf
Devsumi2013 gunta 2_pdfDevsumi2013 gunta 2_pdf
Devsumi2013 gunta 2_pdf
 
【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)
【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)
【DroidKaigi2015】初学者に嬉しいAndroid開発環境(あとMVCとか)
 
2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」
2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」
2013年08月 夏サミ2013-A5「DevOpsってどうなのよ?」
 
Front night vol1
Front night vol1Front night vol1
Front night vol1
 
入門者用Android Studio Hands on
入門者用Android Studio Hands on入門者用Android Studio Hands on
入門者用Android Studio Hands on
 
アプリエンジニアがサーバーサイドで最初に勉強するべきこと
アプリエンジニアがサーバーサイドで最初に勉強するべきことアプリエンジニアがサーバーサイドで最初に勉強するべきこと
アプリエンジニアがサーバーサイドで最初に勉強するべきこと
 
年の瀬リアルタイム通信サーバ勉強会
年の瀬リアルタイム通信サーバ勉強会年の瀬リアルタイム通信サーバ勉強会
年の瀬リアルタイム通信サーバ勉強会
 
AppStoreとGooglePlayの両プラットフォームに選ばれるUI/UX最適化
AppStoreとGooglePlayの両プラットフォームに選ばれるUI/UX最適化AppStoreとGooglePlayの両プラットフォームに選ばれるUI/UX最適化
AppStoreとGooglePlayの両プラットフォームに選ばれるUI/UX最適化
 
Docker study for beginner in My Company 2017/10/19
Docker study for beginner in My Company 2017/10/19Docker study for beginner in My Company 2017/10/19
Docker study for beginner in My Company 2017/10/19
 

Recently uploaded

Recently uploaded (11)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

サーバー未経験者がソーシャルゲームを通して知ったサーバーの事