Heim  >  Artikel  >  Web-Frontend  >  Was sind asynchrone Ressourcen? Eine kurze Analyse der Methode von Node zur Realisierung der asynchronen gemeinsamen Nutzung von Ressourcenkontexten

Was sind asynchrone Ressourcen? Eine kurze Analyse der Methode von Node zur Realisierung der asynchronen gemeinsamen Nutzung von Ressourcenkontexten

青灯夜游
青灯夜游nach vorne
2022-05-31 12:56:192662Durchsuche

Wie implementiert Node.js die asynchrone Ressourcenkontextfreigabe? Der folgende Artikel stellt Ihnen vor, wie Node die asynchrone Ressourcenkontextfreigabe implementiert. Lassen Sie uns über die Verwendung der asynchronen Ressourcenkontextfreigabe sprechen.

Was sind asynchrone Ressourcen? Eine kurze Analyse der Methode von Node zur Realisierung der asynchronen gemeinsamen Nutzung von Ressourcenkontexten

Asynchrone Ressourcenkontextfreigabe bedeutet 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

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.

Die 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 Ereignis „Verbindung“ in net.createServer(), oder nur einmal Wie in fs .open() kann eine Ressource auch geschlossen werden, bevor der Rückruf aufgerufen wird experimentell vor 16.4.0 Feature, ist seit 16.4.0 stabil.

AsyncLocalStorage kann Daten in asynchronen Operationsketten teilen.

AsyncLocalStorage-Instanz asyncLocalStorage verfügt über die folgenden Hauptmethoden:

disable() deaktiviert asyncLocalStorage; getStore() gibt den aktuellen Kontextspeicher zurück, der asyncLocalStorage.run() oder asyncLocalStorage.enterWith() für die asynchrone Kontextinitialisierung verwenden muss;

enterWith(store) Übergeben Sie den Kontextspeicher über diese Methode, und der Speicher kann in allen nachfolgenden asynchronen Aufrufen abgerufen werden.

Beispiel:
    const store = { id: 1 };
    // Replaces previous store with the given store object
    asyncLocalStorage.enterWith(store);
    asyncLocalStorage.getStore(); // Returns the store object
    someAsyncOperation(() => {
      asyncLocalStorage.getStore(); // Returns the same object
    });
  • run(store, callback[, ...args] ) Verwenden Ausführen, um den Kontextspeicher und seine effektive Rückruffunktion anzugeben. Der Speicher wird nur in der Rückruffunktion abgerufen.
  • exit(callback[, ...args])
asyncLocalStorage.run() Der erste Parameter der Funktion 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 2022/5/24 20:26:17 this is a log message
runB 8f19ebef-58d7-4b1a-8b9b-46d158beb5d2 2022/5/24 20:26:17 this is a log message

In derselben asynchronen Funktion, die über asyncLocalStorage.run ausgeführt wird, werden die Funktionen runA und runB ausgeführt. runA und runB haben Zugriff auf dieselben Kontextdaten.

Leistungsprobleme

Was sind asynchrone Ressourcen? Eine kurze Analyse der Methode von Node zur Realisierung der asynchronen gemeinsamen Nutzung von Ressourcenkontexten

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 unseres Knotens haben wird Anwendung. . 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.

----

Protokoll mit AsyncLocalStorageProtokoll klassisch

Differenzreq/s26132842~8 %AnwendungsszenarienDa Node.js Single-Threaded ist und den Speicher für alle HTTP-Anfragen gemeinsam nutzt, kann nicht jede HTTP-Anfrage einen gegenseitig isolierten globalen Status halten.
In anderen Multithread-Sprachen erstellt jedes HTTP einen neuen Thread und jeder Thread hat seinen eigenen Speicher. Sie können den globalen Status im Thread-Speicher speichern und den globalen Status von überall in Ihrem Code abrufen.
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 Volllink-Protokollverfolgung.

Weitere Informationen zu Knoten finden Sie unter: nodejs-Tutorial

!

Das obige ist der detaillierte Inhalt vonWas sind asynchrone Ressourcen? Eine kurze Analyse der Methode von Node zur Realisierung der asynchronen gemeinsamen Nutzung von Ressourcenkontexten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen