mongodb-restにもう少しはやくなって欲しかったのでcacheを作ったお
sleepy.mongooseのpythonのバージョンとかでちょっとイラッとしたので、mongodb-restを使っています。
ただ、なんとなくもっさりしていて、なんだろうとコードを読んでみました。
- そもそもexpressを使っているのでオーバーヘッドはあるのかなぁ
- リクエストごとに毎回dbのオープンからデータのCRUD操作まで、あのドリルのようなコールバックの中に突入していっていている
前者をいじるのはだるいのでしたくないのですが、後者は(再接続周りをちゃんとする必要はありますが)cacheを効かせればいいかと思いましたのでちょっとやってみました。
やったことは、次のとおりです。
- app.colcache = {} として連想配列をappにぶら下げる
- db.collectionの取得の後に渡す実際のcollectionに対する操作をprocessとして切りだす
- app.colcache[db/collection]が存在すれば、process(/*err=*/null, collection)として処理を、存在しなければ、db.openから始まる渦に飛び込む
- 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できてしまう)をちょろりと追加しようと思っています。