edge.js verbindet Node.js und .NET Framework in einem Prozess

Werkzeuge  –  5 Kommentare

Mit Node.js findet JavaScript auch auf dem Webserver zunehmend größere Verbreitung. Aber Node.js bietet längst noch nicht alles, was etablierte Frameworks wie .NET oder Java beherrschen. Als Beispiel für die Verbindung von JavaScript mit anderen Programmiersprachen lässt sich das Node.js-Modul edge.js heranziehen, mit dem Webserverentwickler beliebigen .NET-Code in einem Node.js-Prozess nutzen können.

Es ist nicht ungewöhnlich, dass eine Anwendung 10.000 und mehr Anfragen fast gleichzeitig erhält. Einfache Single-Threaded-Umgebungen wie Node.js haben hier Leistungsvorteile gegenüber mächtigen, aber schwergewichtigen Frameworks wie PHP, ASP.NET und JSP/JSF. Node.js hat zudem den Charme, dass der Entwickler auf dem Server die gleiche Programmiersprache verwenden kann wie auf dem
Client.

Wenn aber die Daten aus einem System kommen, das mit .NET entwickelt wurde, stellt sich die Frage der Integration. Der typische Weg ist, das .NET-Backend in einem eigenen Prozess zu hosten, den Node.js über HTTP-Webservices (SOAP oder REST) aufruft (siehe oberer Teil in Abb. 1).

Integrationsoptionen zwischen Node.js und .NET (Abb. 1)

In .NET würde man diese Webservices über die Windows Communication Foundation (SOAP und REST, HTTP und viele andere Protokolle) oder die ASP.NET Web API (nur HTTP/REST) bereitstellen. Allerdings muss sich der Entwickler im Klaren sein, dass die zusätzliche Prozessgrenze erheblich Leistung frisst (siehe CPU-Zyklen von Cache-, Speicher- und Netzwerkzugriffen in Abb. 2).

Die unterschiedlichen Kosten beim I/O-Zugriff (Abb. 2) (Bild: https://github.com/tjanczuk/edge#performance)

Geschwindigkeit durch In-Process-Kopplung

Eine Alternative zur Out-Process- bietet die In-Process-Kopplung mit edge.js (siehe unterer Teil in Abb. 1). Den erheblichen Geschwindigkeitsvorteil zeigt Abbildung 3. Das Modul hat Tomasz Janczuk, ein ehemaliger Development Manager bei Microsoft im Windows-Azure-Team, als Open-Source-Komponente für Node.js entwickelt und auf GitHub bereitgestellt. Er ist auch der Entwickler von httpsys, der Komponente, um Node.js den Zugriff auf die native Implementierung von http.sys unter Windows zu ermöglichen.

Performanzvergleich Edge.js und HTTP-Verbindung (Abb. 3) (Bild: https://github.com/tjanczuk/edge#performance)

edge.js ermöglicht es Node.js-Programmen, in Form von .NET-Assemblies auf vorliegende DLLs zuzugreifen oder Quellcode in verschiedenen .NET-Sprachen nach einer Ad-hoc-Kompilierung aufzurufen. Dabei werden die Assemblies in den gleichen Prozess wie Node.js geladen, sodass es an dieser Stelle keine größeren Leistungsverluste gibt (s. Abb. 3). Derzeit ist für die Verwendung von edge.js ein Windows-Betriebssystem notwendig. Den Fortschritt der Portierung von edge.js auf die freie .NET-Implementierung Mono können Entwickler auf GitHub verfolgen.

Die technische Grundlage von edge.js ist die Tatsache, dass die Common Language Runtime, die Laufzeitumgebung von .NET, als COM-Komponente (Component Object Model) implementiert ist und sich daher gut mit C++ ansteuern lässt. Dabei kümmert sich edge.js um die Überbrückung der unterschiedlichen Eigenschaften der beiden Laufzeitumgebungen. Bei Node.js handelt es sich um eine Single-Threaded-Umgebung; im Gegensatz dazu ist die CLR "multithreaded". Außerdem sorgt edge.js für die korrekte Lebensdauer der Objekte sowohl unter V8 (der Node.js VM) als auch der Objekte auf dem CLR-Heap.

Derzeit gibt es für edge.js die Unterstützung für die .NET-Sprachen C#, F#, Python (mit IronPython) und auch für die Windows PowerShell. Dabei stellt edge.js nur die Grundlagen für die Kommunikation zwischen Node.js und .NET zur Verfügung. Es liegt an den Entwicklern, spezialisierte Module zu erstellen. Ein Beispiel für ein auf edge.js basierendes spezialisiertes Modul ist Edge-SQL, das mit ADO.NET den Zugriff auf Datenbanken aus Node.js zur Verfügung stellt . Auch die Anbindung weiterer .NET-Programmiersprachen ist ohne große Umstände möglich.