Node.js は非同期リソース コンテキスト共有をどのように実装しますか?次の記事では、Node が非同期リソース コンテキスト共有を実装する方法を紹介します。非同期リソース コンテキスト共有の使用方法について話しましょう。皆さんのお役に立てれば幸いです。
非同期リソース コンテキストの共有とは、ネットワーク リクエストのライフ サイクルまたは非同期リソースの呼び出しチェーン内でコンテキスト データを共有することを意味します。
この質問に答える前に、まず非同期リソースとは何かを理解する必要があります。
非同期リソースは、Promise、Timeout、TCPWrap、UDP など (ただしこれらに限定されない) コールバックを備えたオブジェクトとして理解できます。詳細については、非同期リソース タイプのリストを参照してください。
正式な定義は次のとおりです:
非同期リソースは、関連付けられたコールバックを持つオブジェクトを表します。このコールバックは、ネットの 'connection' イベントなど、複数回呼び出される場合があります。 .createServer( )、または fs.open() のような 1 回だけ。コールバックが呼び出される前にリソースを閉じることもできます。
ここでは、公式に提供されている非同期コンテキスト共有ソリューションである Node.js AsyncLocalStorage の紹介です。この機能は、16.4.0 より前はまだ実験的な機能であり、16.4.0 以降は安定しています。
AsyncLocalStorage は、非同期操作チェーンでデータを共有できます。
AsyncLocalStorage インスタンス asyncLocalStorage には次の主なメソッドがあります:
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 });
次の例は、AsyncLocalStorage を使用して非同期リソース コンテキスト共有を実装する方法を示しています。
出力:
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
Through asyncLocalStorage .run 同じ非同期関数の実行内で、関数 runA と関数 runB が実行され、runA と runB は同じコンテキスト データにアクセスできます。
パフォーマンスの問題Kuzzle
による実際の測定によると、AsyncLocalStorage を使用すると、さらに約 8% のパフォーマンス損失が発生します。もちろん、ビジネス シナリオが異なれば、パフォーマンスも異なる可能性があります。パフォーマンスのこの部分が懸念される場合は、ビジネスに比較テストを追加して、特定のパフォーマンスへの影響をテストすることもできます。 #----従来のログを記録する | 違い | #req/s | |
---|---|---|---|
#アプリケーション シナリオ | ##他のマルチスレッド言語では、各 HTTP が新しいスレッドを作成し、各スレッドが独自のメモリを持ちます。グローバル状態をスレッド メモリに保存し、コード内の任意の場所からグローバル状態を取得できます。 | Node.js では、Node.js はシングルスレッドであり、すべての HTTP リクエスト間でメモリを共有するため、各 HTTP リクエストは相互に分離されたグローバル状態を保持できません。 |
以上が非同期リソースとは何ですか?非同期リソースコンテキスト共有を実現する Node の方法の簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。