Es besteht das Gefühl, dass es buchstäblich jede Woche ein neues "Web-Framework" für Node.js gibt, das als etwas bezeichnet wird, das schneller funktioniert als alles, was davor war. Jeder weiß, dass Express langsam ist, aber kann das nächste Framework die Leistung des Node.js-E / A-Subsystems wirklich verbessern? Das einzige, was es tun kann, ist, die übermäßige Belastung des von Express erzeugten Systems zu beseitigen. Es wird nicht darüber gesprochen, etwas Grundlegendes zu verbessern. Um die Situation radikal zu verbessern, müssen Sie auf einer tieferen Ebene arbeiten und dürfen keine neuen Abstraktionen über Node.js hinzufügen.

Was braucht es, um Serveranwendungen auf der Node.js-Plattform zu erstellen, die viel schneller laufen als heute?
Situationsanalyse
Express ist eines der ältesten Webframeworks für Node.js. Es basiert auf den Standardfunktionen dieser Plattform und bietet Entwicklern eine praktische Oberfläche, die auf dem Konzept der Anwendung basiert, und ermöglicht Ihnen die Verwaltung von URL-Routen, -Parametern, -Methoden und dergleichen.
Express ist einfach und hilft Programmierern, Anwendungen schnell zu entwickeln. Das einzige, was ihm fehlt, ist Leistung. Ständig erscheinende Projekte wie Fastify sind bestrebt, Entwicklern die gleichen Funktionen wie Express zu bieten, jedoch mit weniger Leistungsverlust. Sie selbst verursachen jedoch eine zusätzliche Belastung des Systems und beeinträchtigen die Leistung erheblich. Sie sind stark eingeschränkt durch das, was die Node.js.-Plattform bieten kann. Und es kann im Vergleich zu Wettbewerbern nicht so viel geben.
Die Anzahl der HTTP-Anforderungen, die von verschiedenen Servern pro Sekunde verarbeitet werdenAchten Sie auf die rote Linie. Dies ist die maximale Plattform Node.js. Unabhängig davon, ob ihre Namen das Wort „schnell“ enthalten oder nicht, können sie diese Grenze nicht überschreiten. Dies ist tatsächlich eine sehr niedrige Leistungsgrenze, wenn die Node.js-Plattform mit ihren beliebten Alternativen wie Golang verglichen wird.
Glücklicherweise unterstützt Node.js C ++ - Add-Ons, Google V8-Ordner, mit denen Sie JavaScript und C ++ binden und alle Mechanismen aus JavaScript aufrufen können, selbst wenn diese Mechanismen von einer anderen Plattform als der Node.js-Plattform bereitgestellt werden.
Dies ermöglicht die Erweiterung und Verbesserung der Funktionen von JavaScript-Anwendungen und ermöglicht es Ihnen, neue Leistungsniveaus zu erreichen. Auf diese Weise können JavaScript-Programme alles Mögliche aus der Google V8-Engine herausholen, ohne darauf beschränkt zu sein, was die Entwickler von Node.js für ausreichend befunden haben.
Über µWebSockets.js
Anfang dieses Monats habe ich ein neues Projekt veröffentlicht -
µWebSockets.js . GitHub wird als Hosting für seinen Code verwendet, nicht für npm, aber Sie können es für Node.js mit npm wie folgt installieren:
npm install uNetworking/uWebSockets.js#v15.0.0
Für die Arbeit mit µWebSockets.js benötigen Sie keinen Compiler. Linux, MacOS und Windows werden unterstützt. Die ursprüngliche Version des Systems ist 15.0.0, die Versionsnummerierung erfolgt nach den Regeln der semantischen Versionierung.
µWebSockets.js ist ein alternativer Webserver für in JS geschriebene Backend-Anwendungen. Es besteht aus ungefähr 6.000 Zeilen C- und C ++ - Code und übertrifft die besten in Golang geschriebenen Lösungen erheblich. Daher hat die bitfinex.com-Börse bereits beide Handels-APIs (REST und WebSocket) auf µWebSockets.js portiert und führt sie schrittweise in die Produktion ein. Paolo Ardoino von Bitfinex merkt an, dass dies ein großartiges Projekt ist. Ich möchte sagen, dass die Tatsache, dass ich die Möglichkeit hatte, µWebSockets.js zu veröffentlichen, ausschließlich auf die Unterstützung durch BitMEX, Bitfinex und Coinbase zurückzuführen ist.
Funktionen von µWebSockets.js
µWebSockets.js ist ein neues Projekt, das unter der Apache 2.0-Lizenz veröffentlicht wurde und eine Fortsetzung dessen ist, was als "uws" bekannt ist. Dieses Projekt ist ein vollständiger Stapel für Google V8, der auf der Kernel-Ebene des Betriebssystems beginnt, die Standardfunktionen von Node.js vollständig ersetzt und ein stabiles, sicheres, standardkonformes, schnelles und leichtes E / A-Subsystem für Node.js darstellt. So sieht die Interaktion der JS-Anwendung mit dem Betriebssystem mit µWebSockets.js aus.
Interaktion der JS-Anwendung mit dem Betriebssystem unter Verwendung von µWebSockets.jsWie Sie sehen können, besteht das Projekt aus mehreren Ebenen. Jede Ebene hängt nur von der vorherigen Ebene ab. Diese Architektur vereinfacht die Identifizierung und Korrektur von Fehlern sowie die Implementierung von Arbeiten zur Erweiterung der Lösung aufgrund der Implementierung neuer Funktionen.
Es ist zu beachten, dass die
µSockets
Schicht selbst aus drei Unterschichten besteht, die Mechanismen für die Arbeit mit Ereignissen und mit dem Netzwerk sowie Tools zum Schutz von Daten darstellen. Auf diese Weise können bei Bedarf Teile der Lösung ersetzt und dem System alternative Implementierungen bestimmter Funktionen hinzugefügt werden, ohne dass der Code auf einer höheren Ebene geändert werden muss.
Wenn Sie beispielsweise OpenSSL durch etwas ersetzen müssen, ändern Sie
ssl.c
Datei
ssl.c
mit ihren sechshundert Codezeilen nach Ihren
ssl.c
. Andere Schichten des Systems wissen jedoch nicht einmal, was SSL ist. Dieser Ansatz führt neben der Bequemlichkeit, einige Teile des Systems durch andere zu ersetzen, auch zu einer Vereinfachung des Fehlererkennungsprozesses.
ΜSockel innere UnterschichtenDie hier vorgestellte Architektur unterscheidet sich stark von der monolithischen Architektur, die in Node.js verwendet wird. In derselben Quellcodedatei finden Sie Aufrufe von libuv, Befehle für die Arbeit mit dem System sowie Aufrufe von OpenSSL und V8. In Node.js ist dies alles gemischt, und niemand hat sich vorgenommen, einzelne Teile dieser Plattform zu isolieren. Dies erschwert das Vornehmen wichtiger Änderungen an Node.js.
Informationen zur Entwicklung von µWebSockets.js
Hier ist ein extrem vereinfachtes und verkürztes Beispiel für die Arbeit mit µWebSockets.js, dessen Hauptaufgabe darin besteht, die grundlegenden Funktionen des Systems zu demonstrieren.
uWS.SSLApp({ key_file_name: 'misc/key.pem', cert_file_name: 'misc/cert.pem', passphrase: '1234' }).get('/hello', (res, req) => { res.end('Hello World!'); }).ws('/*', { open: (ws, req) => { console.log('A WebSocket connected via URL: ' + req.getUrl() + '!'); }, message: (ws, message, isBinary) => { let ok = ws.send(message, isBinary); }, drain: (ws) => { console.log('WebSocket backpressure: ' + ws.getBufferedAmount()); }, close: (ws, code, message) => { console.log('WebSocket closed'); } }).listen(port, (token) => { if (token) { console.log('Listening to port ' + port); } });
In gewissem Sinne können wir sagen, dass µWebSockets.js, die SSL verwenden, Gorilla WebSocket, eine Implementierung des WebSocket-Protokolls auf Go, ohne SSL umgehen können. Das heißt, es stellt sich heraus, dass JS-Code Nachrichten mit SSL noch schneller austauschen kann als unter bestimmten Bedingungen in Go ohne SSL geschriebener Code. Ich glaube, dass dies ein hervorragendes Ergebnis ist.
Schnelle Implementierung des WebSocket-Protokolls
Socket.IO kann in vielerlei Hinsicht als das Äquivalent von Express in Echtzeit betrachtet werden. Beide Projekte sind vor langer Zeit entstanden. Es ist einfach, mit ihnen zu arbeiten. Sie sind beliebt. Sie sind aber unter anderem auch langsam.
Verschiedene WebSocket-ImplementierungenDie Aufgaben, die der Socket.IO-Entwickler zu lösen hilft, beschränken sich auf die Implementierung der Funktionen zum Veröffentlichen und Abonnieren von Nachrichten sowie auf die Fähigkeit, Nachrichten zu senden und zu empfangen.
Gleichzeitig ist die Verwendung einiger Ersatzmechanismen für die Arbeit mit dem WebSocket-Protokoll erwähnenswert, da Browser diese Technologie seit langem unterstützen. SSL-Verkehr kann von Unternehmens-Proxys nicht interpretiert werden. Er wird wie jeder HTTP-Verkehr durch sie geleitet. Daher blockiert die Verwendung des WebSocket-Protokolls über SSL den entsprechenden Verkehr nicht. Es können Ersatzmechanismen zur Unterstützung von WebSocket bereitgestellt werden, deren Verwendung jedoch keinen Sinn macht. Sie erhöhen die Komplexität von Entscheidungen nur unangemessen.
Eines der Ziele von µWebSockets.js ist es, Entwicklern ähnliche Funktionen wie in Socket.IO zu bieten, damit µWebSockets.js Socket.IO vollständig ersetzen kann, ohne dass übergeordnete Wrapper erforderlich sind . Dies ist möglich, wenn kein spezielles Nicht-Standardprotokoll verwendet wird.
Viele Unternehmen haben Probleme beim Veröffentlichen und Abonnieren von Nachrichten, während sie mit WebSocket arbeiten. Es sollte beachtet werden, dass in der beschriebenen Version von µWebSockets.js diesen Funktionen nicht viel Aufmerksamkeit geschenkt wurde, aber jetzt ernsthafte Arbeiten an ihnen durchgeführt werden. Das Ergebnis wird sehr schnell sein (Tests zeigen, dass µWebSockets.js bereits schneller als Redis ist). Also bleibt dran.
Zusammenfassung
Derzeit entwickelt sich µWebSockets.js, dem Projekt werden neue Funktionen hinzugefügt und Fehler behoben. Es wird einige Zeit dauern, um die kleinen Mängel zu beseitigen, die für die ersten Veröffentlichungen neuer Programme charakteristisch sind. Beachten Sie, dass dies ein großes Projekt ist, das aus vielen tausend in C und C ++ geschriebenen Codezeilen besteht, die in drei Repositorys gespeichert sind.
Hier liegt der JavaScript-Wrapper - uWebSockets.js.
Hier ist ein in C ++ geschriebener Webserver - uWebSockets. Und
hier ist die Basisbibliothek, die in C - uSockets geschrieben ist.
Das fragliche Projekt wird von Unternehmen verwendet, deren Programme die E / A-Subsysteme stark belasten. In diesen Unternehmen sind Stabilität und Sicherheit, die völlig natürlich und offensichtlich sind, die wichtigsten Merkmale der von ihnen verwendeten Software.
Liebe Leser! Planen Sie, µWebSockets.js in Ihren Projekten zu verwenden?
