非同期リソース コンテキストの共有とは、ネットワーク リクエストのライフ サイクルまたは非同期リソースの呼び出しチェーン内でコンテキスト データを共有することを意味します。
この質問に答える前に、まず非同期リソースとは何かを理解する必要があります。
非同期リソースは、Promise、Timeout、TCPWrap、UDP など (ただしこれらに限定されない) コールバックを備えたオブジェクトとして理解できます。詳細については、非同期リソース タイプのリストを参照してください。
公式の定義は次のとおりです。
非同期リソースは、関連付けられたコールバックを持つオブジェクトを表します。このコールバックは、net.createServer() の 'connection' イベントのように複数回呼び出される場合もあれば、fs.open のように 1 回だけ呼び出される場合もあります。 () コールバックが呼び出される前にリソースを閉じることもできます。
ここでは、Node.js によって正式に提供されている非同期コンテキスト共有ソリューションである AsyncLocalStorage を紹介します。 .0。
AsyncLocalStorage は、一連の非同期操作でデータを共有できます。
AsyncLocalStorage インスタンス asyncLocalStorage には次の主なメソッドがあります:
例:
const store = { id: 1 }; // 以前のストアを指定されたストア オブジェクトに置き換えます asyncLocalStorage.enterWith(store); asyncLocalStorage.getStore(); // ストア オブジェクトを返します。 someAsyncOperation(() => { asyncLocalStorage.getStore(); // 同じオブジェクトを返します。 });
asyncLocalStorage.run() 関数の最初のパラメーターは、非同期呼び出しでアクセスする必要がある共有データを保存するもので、2 番目のパラメーターは非同期関数です。
以下は、AsyncLocalStorage を使用して非同期リソース コンテキスト共有を実装する方法を示す例です。
出力:
runA 8f19ebef-58d7-4b1a-8b9b-46d158beb5d2 2022/5/24 20:26:17 これはログ メッセージです runB 8f19ebef-58d7-4b1a-8b9b-46d158beb5d2 2022/5/24 20:26:17 これはログ メッセージです
asyncLocalStorage.run を介して実行される同じ非同期関数では、関数 runA と関数 runB が実行され、runA と runB は実行できます。同じコンテキスト データにアクセスできます。
AsyncLocalStorage は、Node.js で非同期リソース コンテキスト共有を簡単に実装するための優れたトラバースを提供しますが、すべての非同期リソース操作で非同期フックがトリガーされるため、必然的に Node アプリケーションのパフォーマンスに一定の影響が生じます。では、その影響はどれほど大きいのでしょうか?
Kuzzle による実際の測定によれば、AsyncLocalStorage を使用すると、さらに約 8% のパフォーマンスが低下します。 もちろん、ビジネス シナリオが異なれば、パフォーマンスも異なる可能性があります。パフォーマンスのこの部分が懸念される場合は、ビジネスに比較テストを追加して、特定のパフォーマンスへの影響をテストすることもできます。
---- | AsyncLocalStorage でログを記録する | 古典的な | 相違点 | の
---|---|---|---|
要求/秒 | 2613 | 2842 | ~8% の |
他のマルチスレッド言語では、各 HTTP が新しいスレッドを作成し、各スレッドが独自のメモリを持ちます。グローバル状態をスレッド メモリに保存し、コード内の任意の場所からグローバル状態を取得できます。
Node.js では、Node.js はシングルスレッドであり、すべての HTTP リクエスト間でメモリを共有するため、各 HTTP リクエストは相互に分離されたグローバル状態を保持できません。
AsyncLocalStorage は、異なる非同期操作間のステータスを効果的に分離でき、HTTP リクエスト追跡、APM ツール、コンテキスト ログ追跡、リクエストベースのフルリンク ログ追跡などのシナリオで非常に重要な役割を果たします。