34
300万人が遊ぶソーシャルアプリ 「おみせやさん」の作り方 芸者東京エンターテインメント株式会社 山内 雅浩

Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

Embed Size (px)

Citation preview

Page 1: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

300万人が遊ぶソーシャルアプリ「おみせやさん」の作り方

芸者東京エンターテインメント株式会社山内 雅浩

Page 2: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

発表内容

1. おみせやさんの紹介2. 負荷対策3. 開発と運用

Page 3: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

おみせやさんの紹介

Page 4: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

芸者東京エンターテインメント株式会社

2006年10月起業現在は主にソーシャルアプリを開発主な自社製品

2007年「それは無理だよ!オオスガさん」2008年「電脳フィギュア ARis」「アニメ さくらんBOY DT」2009年「おみせやさん for mixi」2010年「おみせやさん for GREE」2010年「お金持ちさん for mixi」 NEW!

http://www.geishatokyo.com/

Page 5: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

「おみせやさん」

約300万人(2010年11月2日現在)が遊ぶソーシャルアプリ。商品を作り、友達と売り買いを楽しむゲーム。mixi, GREEのモバイルアプリとして提供中。芸者東京エンターテインメントが開発・運用をすべて自社で行っている。

Page 6: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

おみせやさん for GREE

2010年6月末から提供開発言語:ScalaWEBフレームワーク:Liftストレージ:Cassandra, MySQL, memcached,Webサーバ:nginxアプリサーバ:TomcatOS:Debian GNU/Linux国内DCホスティングで数十台運用

ユーザーのデータはCassandraに保存。MySQLは、リソースデータと課金に関するデータを保存している。

Page 7: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

おみせやさん for GREE 構成

Page 8: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

おみせやさん for mixi

2009年9月末から提供開発言語:JavaWEBフレームワーク:Wicketストレージ:MySQL, memcached, Tokyo TyrantWebサーバ:nginxアプリサーバ:TomcatOS:Debian GNU/Linux国内DCハウジングで数十台運用

Page 9: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

おみせやさん for mixi 構成

Page 10: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

負荷対策

Page 11: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

負荷対策のポイント

負荷対策の3つのポイント1. DB分割2. KVSの利用3. サーバのパラメータチューニング

Page 12: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

水平分割と垂直分割

水平分割: 同じ機能を持ったDBをIDなどを元に複数台に分割する

垂直分割: 異なる機能を持ったDBをその機能やアクセス頻度にしたがって分割する。例えば正規化も垂直分割の1つ。

Page 13: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

水平分割 (DB sharding)

DBをIDの値などで分割することで負荷を分散する。弊社では、Platform側のUserIDを元に、プログラム上で仮想的に128分割しており、Rangeで物理サーバーに割り当てている。例えば物理4台の場合、VirtualShardID = ID % 128DB1 : 0 <= VirtualShardID < 32DB2 : 32 <= VirtualShardID < 64DB3 : 64 <= VirtualShardID < 96DB4 : 96 <= VirtualShardID < 128物理サーバーを増やしたいときは、割り当てるRangeの設定を変更する

Page 14: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

水平分割 の特性

メリット:1つのDBにデータをまとめる場合と比べてアクセスが分散する分割しただけ1つのDBあたりのデータ量が減る

デメリット:再分割・結合するのが容易ではない他のユーザデータを参照するような処理では複数のDBにアクセスする必要がある

Page 15: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

負荷対策

負荷対策の3つのポイント1. DB分割2. KVSの利用3. サーバのパラメータチューニング

Page 16: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

KVSの利用

RDB(Relational Data Base)に比べて読込、更新処理が高速なKVS(Key Value Store)を使うことでより多くのリクエストを処理できるようになる。

弊社で使っているKVSmemcachedCassandraTokyo Tyrant

Page 17: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

memcached

1つのKeyに1つのValueを持つだけのシンプルなKVSメリット:

読み込み・書き込みともに高速各種言語へのインターフェースが豊富に存在

デメリット:データの永続性がない複雑なデータ構造を持たせるのが面倒

Page 18: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

CassandraKVSの1つで複数台で運用されることを想定して作られたシステムメリット:

単一障害点がない。クラスタリングしてくれるので、スケールアウトが容易。逆に縮退するのも楽。クライアント側でのshardingが不要なのでプログラマに優しい。列指向データベースなので、(単純なKVSよりは)データを構造化しやすい。スキーマレスなのでデータ構造を変更しやすい。

デメリット:データの一貫性が低い。Indexがないので、データ解析がやりにくい(0.6.x)

※Indexは0.7.xから使えるようになるらしい

Page 19: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

Cassandraのデータ構造

Page 20: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

Cassandraのデータの具体例

KeySpace ColumnFamily Key Column Value

"PlayShop" "User" 11009 "nickname" Enock"point" 666

"lastAccess" 2010-11-02

"level" 5

KeySpace ColumnFamily Key SuperColum

n Column Value"PlayShop" "Possession" 11009@Material 00002_00002 "id" 2

"usableCount" 5

"voltage" 5

00002_00003 "id" 3

"usableCount" 4

"voltage" 0

User - ユーザー情報

OwnMaterial - 持っている商品の素

Page 21: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

Cassandraのデータの持ち方

UserのlevelやOwnMaterialのvoltageは、サービス開始後しばらく経過してから追加した。修正はプログラム部分しか行っていない。一部のKeyやSuperColumnで0詰めした数値を_(アンダーバー)で繋いでいるが、これはSliceRangeで特定の範囲だけを取得出来るようにするため。OwnMaterialの00002_00003の前半の2は、スイーツ用の素を表しているため、SliceRangeで00002_00000~00002_99999の範囲を取得することでスイーツ用の素の情報だけを取得できる。ただしこれは、Indexがないから苦肉の策。ちなみに後半の3はMySQLに登録されている素のデータのID。

Page 22: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

Tokyo Tyrant

更新速度とデータ永続性を両立したKVSメリット:・データ永続性があるデメリット:・スケールアウトさせるのが難しい

Page 23: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

負荷対策

負荷対策の3つのポイント1. DB分割2. KVSの利用3. サーバのパラメータチューニング

Page 24: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

JVM の GC

アプリケーション開始後、Edenにオブジェクトが格納される。EdenがいっぱいになるとNew GCが実行され、ライブオブジェクトはFromToへ。非ライブオブジェクトは開放される。FromToでも長時間生き残っているオブジェクトはTenuredへ。Tenuredが増えてくると、ライフオブジェクトをMark、非ライフオブジェクトをSweepする。時々Compactionでデフラグされる。OldがいっぱいになるとFull GCが実行され、長時間停止する。Permanent はリフレクションが使う領域。

Page 25: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

JVM の GC パラメータチューニング

JVM(Java Virtual Machine) の GC パラメータを負荷テストの結果を見て調整する。弊社では負荷テストには Apache Bench と JMeter  を主に使っている。

GC チューニングのための設定Tomcat の gc log を有効にしておき、GCViewer でGCの動きを読む(-Xloggc:/path/to/gc.log)JMeter の結果ログから秒間レスポンス数やエラー率、遅延レスポンス数を見て、処理落ちしていないかを確認する。必要に応じてプロファイラを使い、メモリリークがないかをチェックする。

Page 26: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

JVM GC グラフの比較

悪い例 良い例

Page 27: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

JVM GC パラメータ

おみせやさんアプリサーバでの設定例-XX:+UseTLAB-Xms1981M-Xmx1981M-XX:NewSize=198M-XX:PermSize=128M-XX:MaxPermSize=256M-XX:SurvivorRatio=1024-XX:TargetSurvivorRatio=90-XX:MaxTenuringThreshold=0-XX:+AggressiveOpts-XX:+HeapDumpOnOutOfMemoryError-XX:+DoEscapeAnalysis-XX:+UseCompressedOops-XX:+UseParNewGC-XX:ParallelGCThreads=4-XX:+UseConcMarkSweepGC-XX:+CMSParallelRemarkEnabled-XX:CMSInitiatingOccupancyFraction=60

Page 28: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

開発と運用

Page 29: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

SWF合成

アバターや店を表現するのにSWFを合成しているPCではクライアント側で出来るが、ケータイおよびFlashLite1.1の制限によりサーバ側で合成しなければならないことが多いswfmill-0.3.0(swf<->xml)すべてのSWF素材をXML形式で保管しているSWF合成は処理が重いのでキャッシュを有効に使っている(なるべく合成を行わない)クライアント側でSWFバイナリの変数を書き換えることでSWF合成を極力行わないようにする

Page 30: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

サーバの管理と監視

サーバセットアップ:Puppetサーバ監視:Xymon(Hobbit)パフォーマンス監視:muninサービス自動復旧:daemontools, mon

Page 31: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

開発管理

バグ&タスク管理:Redmineバージョン管理:Subversion, Mercurial

Page 32: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

おまけ

Page 33: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

宣伝

新アプリをリリースしました!お金持ちさん for mixi (2010年10月29日)

上記以外のアプリも鋭意制作中

Page 34: Geisha Tokyo Entertainment: How to make a cool Social Application for mobile

エンジニア募集中!

・ソーシャルアプリを一緒に開発・運営してくれるエンジニアを募集中・特にサーバエンジニアは大歓迎

興味がある方は

info@geishatokyo.com

にメールしてください!!