25
node.js + MongoDB でソーシャルゲーム MongoDB Tokyo 2011 Suguru Namura (@snamura) CyberAgent, Inc.

MongoDB + node.js で作るソーシャルゲーム

Embed Size (px)

DESCRIPTION

Mongo Tokyo 2011 のセッションで使用した node.js と MongoDB を使って開発しているサービスのプレゼン資料です

Citation preview

Page 1: MongoDB + node.js で作るソーシャルゲーム

node.js + MongoDBでソーシャルゲーム

MongoDB Tokyo 2011Suguru Namura (@snamura)

CyberAgent, Inc.

Page 2: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

About me

Suguru Namura (30)

Programmer

Cyberagent, Inc

Ameba Pigg, Ameba Pico, NinjaTrickpoupee girl, meromero park, etc...

Page 3: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

Agenda作ろうとしているもの

使おうとしている技術

システム構成

node.js と MongoDB の相性

工夫したところ

運用管理について

Page 4: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

作ろうとしているもの

PC向けソーシャルゲーム

アメーバピグのプラットフォームで動作

Page 5: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

Page 6: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

使おうとしている技術

MongoDB (1.8.x)

node.js (0.4.x)

WebSocket (Draft 76)

Flash Player 10.x

Page 7: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

なぜ MongoDB か

スキーマレス、JSON構造

柔軟なインデクス

Sharding & Replica Set

Atomic Modifiers

Page 8: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

なぜ node.js なのか

Java+mongo に絶望した

DBObject... 接続プール... 静的形付け...

Python+twisted を拒否られた

なんか流行ってる

言語仕様が既にシングルスレッド

Page 9: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

システム構成

Client (Flash) LB

node.js

SVN or git

MongoDB3x3 Sharding

HTTPWebSocket

ContentDistribution

Page 10: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

MongoDB + node.js鼻血が出るほど相性が良い

JSONがそのまま使える

検索クエリ・保存データが全てJSON

プログラムにデータがシームレスに統合される

No more ORMapper!

MongoDBのコンソールと近いコードで書ける

Page 11: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

var entity = {_id: ‘abc’,name: ‘test’,body: {parts: {face: 0, eye: 2, nose: 4, mouth: 2

},colors: { skin: 1, eye: 4, hair: 3}

}};

col.save(entity);

col.findOne({_id:‘abc’}, function(err, result) {console.log(result.body.parts);

});

col.update({_id:‘abc’},{‘$set’, {name: ‘modified’}}

);

Page 12: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

node.js用ドライバnode-mongodbhttps://github.com/orlandov/node-mongodb/

公式のCドライバのラッパー

bulk insert 非対応?

node-mongodb-nativehttps://github.com/christkv/node-mongodb-native/

javascript で書かれたドライバ

BSON部分だけネイティブにも対応

npm install mongodb で入るのはこっち

Page 13: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

node.js の特徴

原則すべて非同期

何をするにもコールバック

DBアクセスも全部コールバック

コールバック全てにエラーハンドリング

Page 14: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

コールバックの例var client = new Db('test', new Server("127.0.0.1", 27017, {}));client.open(function(err, p_client) { client.createCollection('test_insert',function(err, collection) { client.collection('test_insert', function(err, collection) { for(var i = 1; i < 1000; i++) { collection.insert({c:1}, function(err, docs) {}); } collection.insert({a:2}, function(err, docs) { collection.insert({a:3}, function(err, docs) { collection.count(function(err, count) { test.assertEquals(1001, count); collection.find(function(err, cursor) { cursor.toArray(function(err, results) { test.assertEquals(1001, results.length); test.assertTrue(results[0] != null); client.close(); }); }); }); }); }); }); });});

Page 15: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

工夫したところ

DBアクセスのシリアルな処理を記述するためのライブラリ

メソッドチェーンで連続した処理を記載

getLastError の有無も裏で処理

Page 16: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

コード例var db = new Database(‘127.0.0.1’, 3306, ‘test’);db.open();

var item = db.collection(‘item’);

item .begin() .insert({_id:‘test’, name:‘abcdefg’}) .insert({_id:‘test2’, name:‘123456’, values:[0,1,2,3]); .update({_id:‘test’}, {‘$set’: { name: ‘hijklmn’ }) .find({}).each(function(entity) { console.log(entity.name); }) .success(function() { console.log(‘done’); }) .failure(function(err) { console.log(‘error’, err); }) .end();

Page 17: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

その他の解決

Mongoosehttps://github.com/LearnBoost/mongoose

node-mongodb-native と併用

シリアルな実行をサポート

スキーマ定義をサポート

Page 18: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

管理ツールは開発が面倒?

ソーシャルゲームは運用が命

最先端技術は管理ツールの方が導入しやすい

技術者としての腕の見せ所

良いツールは運用チームのテンションを上げる → 売上アップ

運用管理ツール

Page 19: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

アメーバピグのリアルタイムレポート

Page 20: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

管理ツールにおけるMongoDBの利点

スキーマがなく、階層構造なので、汎用的なデータをそのまま格納できる

Page 21: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

データ定義をそのままフォーム仕様に

var spec1 = { name: ‘test’, type: ‘text’, label: ‘label-1’, class: ‘number’, min: 0, max: 100};

var spec2 = { name: ‘test2’, type: ‘group’, label: ‘group-1’, fields: [spec3, spec4, spec5]};

var formSpec = [ spec1, spec2];

showForm(formSpec);

Page 22: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

Page 23: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

Page 24: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

{ "_id" : "plant_ichigo",

"name" : "いちご", "type" : "plant", "plant" : { "tags" : [ "vegetable" ], "time" : { "grow" : 10, "expire" : 60 }, "rewards" : [! {! ! "type" : "coin",! ! "rate" : 1,! ! "min" : 5,! ! "max" : 20,! ! "code" : ""! },! {! ! "type" : "exp",! ! "rate" : 1,! ! "min" : 1,! ! "max" : 2,! ! "code" : ""! },! {! ! "type" : "item",! ! "rate" : 1,! ! "min" : 1,! ! "max" : 1,! ! "code" : "material_ichigo"! }]}

Page 25: MongoDB + node.js で作るソーシャルゲーム

Mongo Tokyo 2011 - node.js + MongoDB

結論

仕様やデータの構成が複雑なソーシャルゲームと MongoDB の相性は良い

node.js と MongoDB は良い組み合わせ

テストコード超大事 nodeunit

厳格なシステムには向かない