Upload
suguru-namura
View
46.828
Download
8
Embed Size (px)
DESCRIPTION
Mongo Tokyo 2011 のセッションで使用した node.js と MongoDB を使って開発しているサービスのプレゼン資料です
Citation preview
node.js + MongoDBでソーシャルゲーム
MongoDB Tokyo 2011Suguru Namura (@snamura)
CyberAgent, Inc.
Mongo Tokyo 2011 - node.js + MongoDB
About me
Suguru Namura (30)
Programmer
Cyberagent, Inc
Ameba Pigg, Ameba Pico, NinjaTrickpoupee girl, meromero park, etc...
Mongo Tokyo 2011 - node.js + MongoDB
Agenda作ろうとしているもの
使おうとしている技術
システム構成
node.js と MongoDB の相性
工夫したところ
運用管理について
Mongo Tokyo 2011 - node.js + MongoDB
作ろうとしているもの
PC向けソーシャルゲーム
アメーバピグのプラットフォームで動作
Mongo Tokyo 2011 - node.js + MongoDB
Mongo Tokyo 2011 - node.js + MongoDB
使おうとしている技術
MongoDB (1.8.x)
node.js (0.4.x)
WebSocket (Draft 76)
Flash Player 10.x
Mongo Tokyo 2011 - node.js + MongoDB
なぜ MongoDB か
スキーマレス、JSON構造
柔軟なインデクス
Sharding & Replica Set
Atomic Modifiers
Mongo Tokyo 2011 - node.js + MongoDB
なぜ node.js なのか
Java+mongo に絶望した
DBObject... 接続プール... 静的形付け...
Python+twisted を拒否られた
なんか流行ってる
言語仕様が既にシングルスレッド
Mongo Tokyo 2011 - node.js + MongoDB
システム構成
Client (Flash) LB
node.js
SVN or git
MongoDB3x3 Sharding
HTTPWebSocket
ContentDistribution
Mongo Tokyo 2011 - node.js + MongoDB
MongoDB + node.js鼻血が出るほど相性が良い
JSONがそのまま使える
検索クエリ・保存データが全てJSON
プログラムにデータがシームレスに統合される
No more ORMapper!
MongoDBのコンソールと近いコードで書ける
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’}}
);
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 で入るのはこっち
Mongo Tokyo 2011 - node.js + MongoDB
node.js の特徴
原則すべて非同期
何をするにもコールバック
DBアクセスも全部コールバック
コールバック全てにエラーハンドリング
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(); }); }); }); }); }); }); });});
Mongo Tokyo 2011 - node.js + MongoDB
工夫したところ
DBアクセスのシリアルな処理を記述するためのライブラリ
メソッドチェーンで連続した処理を記載
getLastError の有無も裏で処理
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();
Mongo Tokyo 2011 - node.js + MongoDB
その他の解決
Mongoosehttps://github.com/LearnBoost/mongoose
node-mongodb-native と併用
シリアルな実行をサポート
スキーマ定義をサポート
Mongo Tokyo 2011 - node.js + MongoDB
管理ツールは開発が面倒?
ソーシャルゲームは運用が命
最先端技術は管理ツールの方が導入しやすい
技術者としての腕の見せ所
良いツールは運用チームのテンションを上げる → 売上アップ
運用管理ツール
Mongo Tokyo 2011 - node.js + MongoDB
アメーバピグのリアルタイムレポート
Mongo Tokyo 2011 - node.js + MongoDB
管理ツールにおけるMongoDBの利点
スキーマがなく、階層構造なので、汎用的なデータをそのまま格納できる
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);
Mongo Tokyo 2011 - node.js + MongoDB
Mongo Tokyo 2011 - node.js + MongoDB
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"! }]}
Mongo Tokyo 2011 - node.js + MongoDB
結論
仕様やデータの構成が複雑なソーシャルゲームと MongoDB の相性は良い
node.js と MongoDB は良い組み合わせ
テストコード超大事 nodeunit
厳格なシステムには向かない