Ich habe gestern den ganzen Tag mit node.js und MongoDB herum gespielt. Leider gibt es keine Standardbibliothek für MongoDB unter node. Es gibt einige Projekte, die leider sehr unterschiedliche APIs haben, manche basieren nur auf Node, für andere muss man selbst ein C++ Modul übersetzen.
Das aktivste Projekt scheint node-mongodb-native zu sein, auf das man zusätzlich Mongoose aufsetzen kann, was einerseits die asynchrone auf Callbacks basierte Natur der API versteckt und außerdem eine super Schnittstelle zur Modellierung bietet.
Das große Problem dabei ist, dass die Bibliothek über einen Socket mit MongoDB kommuniziert und dabei BSON (Binäres JSON) benutzt wird. Dieses muss leider im Treiber geparst werden, was sehr langsam ist. Die Leistung bricht sauber ein und der node Prozess ist völlig ausgelastet, der Mongo Server stattdessen wird absolut nicht ausgelastet.
Zum Glück arbeitet der Entwickler des Treibers daran das BSON parsing in nativen Code auszulagern. Dann muss ich zwar trotzdem mich mit dem Übersetzen des Codes herumschlagen aber ich hoffe das es damit dann schnell gehen wird.
Auch an einer anderen Stelle ist mir das schlechte Packetmanagement aufgefallen. Es gibt die Möglichkeit die Ausgabe mit gzip zu komprimieren. Dazu kann das compress Modul verwendet werden. Naja, nun gibt es aber mehrere compress Module die den selben Namen tragen aber eine völlig unterschiedliche API zur Verfügung stellen. Sehr verwirrend. Aktuell wird ein Fallback verwendet der in einem Kind Prozess das gzip Programm ausführt. Funktioniert, ist aber sicherlich weniger performant als ein direkt auf die gzip Bibliothek zugreifendes Modul. Aber dann gibt es wieder das Problem dass man den Code in C selbst übersetzen muss.
Alles in allem scheint mir node.js bisher eine Art Spielwiese zu sein die noch stabilisiert werden muss, vor allem benötigt es eine offizielle Modulbörse wo der Umgang mit Modulen in C und die große Duplizierung die es aktuell gibt gelöst werden muss. Im Prinzip ist node bisher eh noch keine stabile (Version 1.0) Software, also kann man diese Probleme noch verkraften. Für Datenbankschnittstellen fehlt es auch an offiziell abgesegneten Modulen. Möglicherweise könnte man die Schuld aber den MongoDB Entwicklern in die Schuhe schieben, die eine Offizielle Schnittstelle für CommonJS pflegen sollen. Ich frage mich aber wie man implementierungsübergreifende native Module anbieten will. Schließlich gibt es mehrere Implementierungen für CommonJS, nodejs ist nur eine davon. Es gibt also noch viele Probleme zu lösen in der CommonJS Welt.