ソーシャルゲームにおける多重ログインを許可した場合のデータベース設計の面倒臭さについて

MySQLを勉強中にへえぇ~~って思うことがあったのでメモ。

多重ログインとは

そもそも正しい用語が何かは分からないのですがここでは一旦、「特定のゲームに対して同じIDでログインして同時に操作を行う」あるいは「ユーザーが同一識別子で複数のセッションを持つ」ような状態を想定します。

多重ログインが禁止されるデザイン的な理由

ゲームは極力ユーザーの環境に左右されないようにデザインされ、iOS/Androidだろうがハイスペック/低スペックだろうが極力同じ条件でプレイできるようになっています。
これはユーザーが他のユーザーと比較してプレイ環境による不公平感が生まれないようにするためで、昨今の人とお金が掛かっているゲームは必ずどうにかすれば勝てる(お金か時間を使って強くなってね)ようになっているはずです。

多重ログインを禁止せざるを得ない開発的な理由

ネットゲームなんていう「多人数が同時に頻繁に同じデータを壊れないように、なおかつプレイヤーが快適になるよう運用する」ためのデータベースが求められるサービスは、恐らく開発者がサービスのクオリティとギリギリまで相談しながらデータベースに負荷が掛からないよう設計しているはず…

というのは多分ネトゲをプレイしたことがあればなんとなく分かるのですが、そこで何故データベースが壊れないような設計が大変なのか、という事については知ること無く応答の遅いゲームに向かって「運営○○!」なんて言ってた自分が居たわけで。

トランザクショナルで低レイテンシな応答を保証することの難しさ

所詮ゲームといえど巷の人気ゲームなんかは時給で中国人が飯を食える(過去形)くらいゲーム内のアイテムや通貨に価値はあり、増殖(DUPE)が発見された場合はサーバーのロールバックによるユーザーへの補填、不正行為をはたらいたプレイヤー(例え優良課金者だとしても)の粛清による経済的な損失はサービスが終了するほどの威力をもっています。
「探検ドリランド」 で増殖技がバレてレアカード複製祭り発生中wwwwww : オレ的ゲーム速報@刃
http://jin115.com/archives/51849925.html

悲しい事件だったね……

何故ネットゲームで増殖技が生まれてしまうのか、というのは上のレイヤーではなくデータベースで起こっていたんだ、という尊い話があるようで。

My sqlで遭遇したトランザクションとロックのお話 by @taptappun
http://www.slideshare.net/takukobayashi560/my-sql-43507487

同時に同じところを触った時には直列化するかちゃんと設計しなよ!という事みたい。

ネットゲームでアイテムを誰かに渡す時や売却する時に一旦別のインベントリに収納するのは実はトランザクションを保証するためだった……なんて妄想してたらちょっと設計に興味が湧いてきた。