読者です 読者をやめる 読者になる 読者になる

mongodb-restにもう少しはやくなって欲しかったのでcacheを作ったお

プログラム mongodb node

sleepy.mongooseのpythonのバージョンとかでちょっとイラッとしたので、mongodb-restを使っています。
ただ、なんとなくもっさりしていて、なんだろうとコードを読んでみました。

  1. そもそもexpressを使っているのでオーバーヘッドはあるのかなぁ
  2. リクエストごとに毎回dbのオープンからデータのCRUD操作まで、あのドリルのようなコールバックの中に突入していっていている

前者をいじるのはだるいのでしたくないのですが、後者は(再接続周りをちゃんとする必要はありますが)cacheを効かせればいいかと思いましたのでちょっとやってみました。

やったことは、次のとおりです。

  1. app.colcache = {} として連想配列をappにぶら下げる
  2. db.collectionの取得の後に渡す実際のcollectionに対する操作をprocessとして切りだす
  3. app.colcache[db/collection]が存在すれば、process(/*err=*/null, collection)として処理を、存在しなければ、db.openから始まる渦に飛び込む
  4. colcacheに無い場合は、さっきのapp.colcache[db/collection]=collectionをセットする

ベンチマーク

cache time
enable 0m14.848s,0m14.015s,0m15.896s,0m14.367s,0m15.940s
disable 0m17.740s,0m17.694s,0m17.361s,0m18.010s,0m17.511s

上記はlocalhostでの条件ですが、dbとかcollectionとかを通信することを考えると、mongodbと分かれている場合のケースでよりcacheの効果がでるかと思います。

ついでに

あと、mongodb-restを使おうなんていう酔狂な通常使う場合はだいたい80とか8080でWebを立ち上げて、3000とか18080とか10080とかでmongodb-restを立ち上げると思うんですが、これ、cross-domainでのリクエストになるんでxhrで取れないんですね。
なんで、configにAccess-Control-Allow-Originをセットしておけばmiddlewareに

if(config['access-contorol-allow-origin']){
    app.use(function(req, res, next){
        res.header('access-contorol-allow-origin', config['access-contorol-allow-origin']);
        next();
    });
}

として、動作するようにしておきました。

そんなgithubはこちら
https://github.com/muddydixon/mongodb-rest

TODOとしては、切断された場合に再接続する処理と、アクセスコントロール(デフォルトではfindだけじゃなくて、insertもremoveもupdateできてしまう)をちょろりと追加しようと思っています。