ホームページ  >  記事  >  ウェブフロントエンド  >  非同期リソースとは何ですか?非同期リソースコンテキスト共有を実現する Node の方法の簡単な分析

非同期リソースとは何ですか?非同期リソースコンテキスト共有を実現する Node の方法の簡単な分析

青灯夜游
青灯夜游転載
2022-05-31 12:56:192662ブラウズ

Node.js は非同期リソース コンテキスト共有をどのように実装しますか?次の記事では、Node が非同期リソース コンテキスト共有を実装する方法を紹介します。非同期リソース コンテキスト共有の使用方法について話しましょう。皆さんのお役に立てれば幸いです。

非同期リソースとは何ですか?非同期リソースコンテキスト共有を実現する Node の方法の簡単な分析

非同期リソース コンテキストの共有とは、ネットワーク リクエストのライフ サイクルまたは非同期リソースの呼び出しチェーン内でコンテキスト データを共有することを意味します。

この質問に答える前に、まず非同期リソースとは何かを理解する必要があります。

非同期リソース

非同期リソースは、Promise、Timeout、TCPWrap、UDP など (ただしこれらに限定されない) コールバックを備えたオブジェクトとして理解できます。詳細については、非同期リソース タイプのリストを参照してください。

正式な定義は次のとおりです:

非同期リソースは、関連付けられたコールバックを持つオブジェクトを表します。このコールバックは、ネットの 'connection' イベントなど、複数回呼び出される場合があります。 .createServer( )、または fs.open() のような 1 回だけ。コールバックが呼び出される前にリソースを閉じることもできます。

#AsyncLocalStorage

ここでは、公式に提供されている非同期コンテキスト共有ソリューションである Node.js AsyncLocalStorage の紹介です。この機能は、16.4.0 より前はまだ実験的な機能であり、16.4.0 以降は安定しています。

AsyncLocalStorage は、非同期操作チェーンでデータを共有できます。

AsyncLocalStorage インスタンス asyncLocalStorage には次の主なメソッドがあります:

  • disable() は asyncLocalStorage を無効にします;
  • getStore() は現在のコンテキスト ストアを返しますが、これは asyncLocalStorage を渡す必要があります。 run() または asyncLocalStorage.enterWith() は、非同期コンテキストの初期化を実行します。
  • enterWith(store) は、このメソッドを通じてコン​​テキスト ストアを渡し、ストアは後続のすべての非同期呼び出しで取得できます。
  • #例:
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]) run を使用して、コンテキスト ストアとその有効なコールバック関数を指定します。ストアは取得されるのみです。コールバック関数から。
  • exit(callback[, ...args])
  • asyncLocalStorage.run() 関数の最初のパラメータは、アクセスする必要がある共有データを非同期で保存することです。 2 番目のパラメータは非同期関数です。

次の例は、AsyncLocalStorage を使用して非同期リソース コンテキスト共有を実装する方法を示しています。

非同期リソースとは何ですか?非同期リソースコンテキスト共有を実現する Node の方法の簡単な分析出力:

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 は同じコンテキスト データにアクセスできます。

パフォーマンスの問題

AsyncLocalStorage は、Node.js で非同期リソース コンテキスト共有を簡単に実装するための大規模なトラバーサルを提供しますが、すべての非同期リソース操作で Async Hook がトリガーされ、必然的に、Node アプリケーションのパフォーマンスに一定の影響を与えます。それで、その影響はどれくらい大きいのでしょうか?

Kuzzle

による実際の測定によると、AsyncLocalStorage を使用すると、さらに約 8% のパフォーマンス損失が発生します。もちろん、ビジネス シナリオが異なれば、パフォーマンスも異なる可能性があります。パフォーマンスのこの部分が懸念される場合は、ビジネスに比較テストを追加して、特定のパフォーマンスへの影響をテストすることもできます。

#----AsyncLocalStorage でログを記録する#req/s#2613#2842##~8%#アプリケーション シナリオ##他のマルチスレッド言語では、各 HTTP が新しいスレッドを作成し、各スレッドが独自のメモリを持ちます。グローバル状態をスレッド メモリに保存し、コード内の任意の場所からグローバル状態を取得できます。 Node.js では、Node.js はシングルスレッドであり、すべての HTTP リクエスト間でメモリを共有するため、各 HTTP リクエストは相互に分離されたグローバル状態を保持できません。 AsyncLocalStorage は、さまざまな非同期操作間のステータスを効果的に分離でき、HTTP リクエスト追跡、APM ツール、コンテキスト ログ追跡、リクエストベースのフルリンク ログ追跡などのシナリオで非常に重要な役割を果たします。
従来のログを記録する 違い

ノード関連の知識の詳細については、nodejs チュートリアル を参照してください。

以上が非同期リソースとは何ですか?非同期リソースコンテキスト共有を実現する Node の方法の簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。