you21979の日記

実験ネタとか。仮想化とかnodejsで嵌った所とかおもしろかったところとかいろいろ

リアルタイムサーバーでのリソース管理

nodejsで大量のオブジェクトを管理する方法

WEB系のPHPerの人は意外にしらないようなので普通のサーバーアプリケーションのリソース管理方法を記載してみる

下のようにシングルトンのマネージャを作成しマネージャ経由でオブジェクトを生成する

削除もマネージャ経由でやる

この方法だと10000個くらいは管理できる

100000個以上管理するなら自前でハッシュを実装したほうが幸せかも

なぜならdeleteのとき100000個中の一個消すとくっそ遅いから。

var util = require('util');
var events = require('events');
var cls = function(){
    this.n = 0;
    this.h = {};
};
util.inherits(cls, events.EventEmitter);
cls.prototype.fire = function(){
    this.emit('fire');
};
cls.prototype.create = function(){
    var w = new X(++this.n);
    this.h[w.id] = w;
    return w;
};
cls.prototype.delete = function(w){
    delete this.h[w.id];
    w.finalize();
};
cls.prototype.lookup = function(id){
    return this.h[id];
};
var Singleton = (function(){
    var instance = null;
    var getInstance = function(){
        if(instance !== null){
            return instance;
        }
        instance = new cls();
        instance.setMaxListeners(10000);
        return instance;
    };
    return {
        instance : getInstance,
    };
})();
var X = function(id){
    this.initialize(id);
};
X.prototype = {
    initialize : function(id){
        this.id = id;
        this.cb = function(){
            console.log("hoge %d",this.id);
        }.bind(this);
        Singleton.instance().on('fire',this.cb);
    },
    finalize : function(){
        Singleton.instance().removeListener('fire',this.cb);
    },
};
var w = Singleton.instance().create();
var p = Singleton.instance().lookup(w.id);
Singleton.instance().delete(p);

※lookupいらないならハッシュで管理する必要ないけどサーバだとあったほうが便利。

サーバーまたぐときIDベースでやり取りできるし。