最近做了一个mongoDB在AnyEvent上驱动原型,大部分代码来自官方的perl driver,部分则来自ruby driver。我觉得ruby driver
比较有意思。 替换了普通版本的sock相关的操作,使用AE的handler替代,增加了BSON的decode和encode,重写了write_***函数。
同时,提供了一个AnyMongo::Compat兼容包, 原先使用MongoDB驱动的代码应该可以直接运行,因为这个包可以通过官方0.36的
大部分测试 t/perl-driver-api/*t . 对于使用了一些底层函数比如write/recv的代码则无法兼容。
由于是prototype,所以目前版本谨供学习和参考,不可能在正式使用,因为还缺少很多功能,包括authentication, paris/replica-set
支持,reconnect, timeout 等等。
性能上也不好不坏, 对于crud操作,要比官方的快20-30%, 但对于cursor操作,则相反要慢30%1%左右。官方版本的cursor的性能也
还是有点问题,因为当cursor遍历的记录数在10万以上时,双方的差距缩小到5%1%左右。
anymongo性能提升的空间还是很大,目前还是先把缺少的功能补上,同时也要测试Coro的兼容性,
最后再考虑解决cursor的性能问题。
计划在0.10左右可以投入生产使用,正好可以用在我们新项目上。
AnyMongo使用Perl license,源码:
http://github.com/nightsailer/any-mongo
Updated:
简单做了profiling,发现瓶颈在于一些调试代码和moose。去除调试代码,启用moose inlined destruction,
现在anymongo的cursor和官方版本几乎一样了,只有不到1%的差距。
前辈,能认识和交流一下吗? iakuf@163.com
Please don’t use “cute” names like the ruby community does. AnyEvent::MongoDB is descriptive and follows the naming pattern of all other AnyEvent::* modules.
See http://pause.perl.org/pause/query?ACTION=pause_namingmodules
AnyMongo is following a more synchronous API on top of AnyEvent, it design to work with Coro,
difference with traditional AnyEvent approach, it not provide full callback interface.
BTW, I also make a AnyEvent:MongoDB alias, but this morning, somebody told me that he’ll release
another AnyEvent client for mongo which will full callback approach. So, I removed this namespace for him.
hi, thanks for AnyMongo !
just a quick question, due you ended up cloning/branching a lot of MongoDB code in your object-hierarchy (well done
– any chance to remove Any::Moose / Mouse / Moose dependency and just stick to simpler old perlobj OO style interface?
basically I am looking into having a super lightweight layer on top of mongoDB XS/C code which does not require layers and layers of perl to load etc…
cheers
Well, I think AnyMoose / Mouse should be native “modern” Perl object system
We use MongoDB in our most projects, some are large, and I tied to
fight with old Perl OO style, we need power of Moose until Perl6?
I really suggest you should recognize that Mouse/Moose will be the standard object system of
moden Perl5.
Anyway, I agree, as a driver , it should be very thin and lightweight, so, if have enough
free time, I’ll try to make a lightweight branch remove dependencies of Moose ,
but I’m not sure it’s benefit now.