Unter asynchroner Ressourcenkontextfreigabe versteht man die gemeinsame Nutzung von Kontextdaten innerhalb eines Netzwerkanforderungslebenszyklus oder einer asynchronen Ressourcenaufrufkette.
Bevor wir diese Frage beantworten, müssen wir zunächst verstehen, was asynchrone Ressourcen sind.
Asynchrone Ressourcen können als Objekte mit Rückrufen verstanden werden, wie z. B. Versprechen, Zeitüberschreitungen, TCPWrap, UDP usw., sind aber nicht darauf beschränkt. Weitere Informationen finden Sie in der Liste der asynchronen Ressourcentypen.
Hier stellen wirDie offizielle Definition lautet wie folgt:
Eine asynchrone Ressource stellt ein Objekt mit einem zugehörigen Rückruf dar. Dieser Rückruf kann mehrmals aufgerufen werden, z. B. beim „connection“-Ereignis in net.createServer(), oder nur ein einziges Mal wie in fs.open () Eine Ressource kann auch geschlossen werden, bevor der Rückruf aufgerufen wird.
vor, die von Node.js offiziell bereitgestellte Funktion zur asynchronen Kontextfreigabe. Diese Funktion war vor 16.4.0 noch eine experimentelle Funktion und ist seit 16.4 stabil .0.
AsyncLocalStorage kann Daten in einer Kette asynchroner Vorgänge gemeinsam nutzen.
Die AsyncLocalStorage-Instanz asyncLocalStorage verfügt über die folgenden Hauptmethoden:
const
store = { id: 1 }; // Ersetzt den vorherigen Store durch das angegebene Store-Objekt asyncLocalStorage.enterWith(store); asyncLocalStorage.getStore(); // Gibt das Store-Objekt zurück someAsyncOperation(() => { asyncLocalStorage.getStore(); // Gibt das gleiche Objekt zurück });
Der erste Parameter der Funktion asyncLocalStorage.run() dient zum Speichern der gemeinsam genutzten Daten, auf die wir im asynchronen Aufruf zugreifen müssen, und der zweite Parameter ist eine asynchrone Funktion.
Das Folgende ist ein Beispiel, um zu demonstrieren, wie AsyncLocalStorage zum Implementieren der asynchronen Ressourcenkontextfreigabe verwendet wird:
Ausgabe:
runA 8f19ebef-58d7-4b1a-8b9b-46d158beb5d2 24.05.2022 20:26:17 Dies ist eine Protokollnachricht runB 8f19ebef-58d7-4b1a-8b9b-46d158beb5d2 24.05.2022 20:26:17 Dies ist eine Protokollnachricht.
In derselben asynchronen Funktion, die über asyncLocalStorage.run ausgeführt wird, werden die Funktionen runA und runB ausgeführt, und runA und runB können auf die gleichen Kontextdaten zugegriffen werden kann.
AsyncLocalStorage bietet uns eine großartige Möglichkeit, die asynchrone Ressourcenkontextfreigabe in Node.js einfach zu implementieren, aber jeder asynchrone Ressourcenvorgang löst Async-Hooks aus, was unweigerlich einen gewissen Einfluss auf die Leistung unserer Node-Anwendung haben wird. Wie groß ist also die Auswirkung?
Laut einer tatsächlichen Messung von Kuzzle führt die Verwendung von AsyncLocalStorage zu einem zusätzlichen Leistungsverlust von etwa 8 %. Natürlich können verschiedene Geschäftsszenarien eine unterschiedliche Leistung haben. Wenn Sie sich über diesen Teil der Leistung Sorgen machen, können Sie Ihrem Unternehmen auch Vergleichstests hinzufügen, um die spezifischen Auswirkungen auf die Leistung zu testen.
---- | Mit AsyncLocalStorage protokollieren | Klassische | Differenzanforderungen |
---|---|---|---|
/s protokollieren | 2613 | 2842 | ~8 % |
In anderen Multithread-Sprachen erstellt jedes HTTP einen neuen Thread und jeder Thread verfügt über seinen eigenen Speicher. Sie können den globalen Status im Thread-Speicher speichern und den globalen Status von überall in Ihrem Code abrufen.
Da Node.js in Node.js Single-Threaded ist und den Speicher für alle HTTP-Anfragen gemeinsam nutzt, kann nicht jede HTTP-Anfrage einen globalen Status halten, der voneinander isoliert ist.
AsyncLocalStorage kann den Status zwischen verschiedenen asynchronen Vorgängen effektiv isolieren und spielt eine sehr wichtige Rolle in Szenarien wie HTTP-Anforderungsverfolgung, APM-Tools, Kontextprotokollverfolgung und anforderungsbasierter Vollverbindungsprotokollverfolgung.