ホームページ ウェブフロントエンド jsチュートリアル Encore.ts — NestJS や Fastify よりも高速なコールド スタート

Encore.ts — NestJS や Fastify よりも高速なコールド スタート

Sep 05, 2024 am 06:38 AM

数か月前、私たちは Encore.ts (TypeScript 用のオープンソース バックエンド フレームワーク) をリリースしました。

世の中にはすでに多くのフレームワークがあるため、私たちが行った異常な設計上の決定のいくつかと、それがどのようにして顕著なパフォーマンス数値につながるのかを共有したいと思います。

私たちは最近、Encore.ts が Express.js と比較して 9 倍、Fastify と比較して 2 倍のリクエスト スループットを達成することを示すパフォーマンス ベンチマークを公開しました。

今日は、Encore.ts がどのようにして信じられないほど高速な コールド スタート起動時間を達成するのかを詳しく見て、パフォーマンスの旅を続けます。

パフォーマンスのベンチマーク

今回は、Encore.ts、Fastify、NestJS、Express のベンチマークを実施し、コールド スタートアップ時の各フレームワークのパフォーマンスを確認しました。

ベンチマーク プログラムは、それぞれ単純なスキーマを持つ 10 個の API エンドポイントを登録し、スキーマ検証をセットアップします。
スキーマ検証には、可能な限り Zod を使用しました。
Fastify の場合、公式にサポートされているスキーマ検証ライブラリとして Ajv を使用しました。

JavaScript コードの実行が開始されてから、サーバーが受信リクエストを受け入れる準備ができるまでの時間を測定しました。
各ベンチマークについて、5 回の実行のうち最良の結果を採用しました。

話はこれくらいにして、数字について詳しく見ていきましょう!

Encore.ts のコールド スタートは NestJS および Fastify より 17 倍高速です

Encore.ts —  Faster cold starts than NestJS & Fastify

(GitHub でベンチマーク コードを確認してください。)

ご覧のとおり、Encore.ts は、Express の 5 倍以上、NestJS の 17 倍以上という驚くべき高速コールド スタートアップ時間を実現しています。

これはどのようにして可能ですか?テストの結果、パフォーマンスの 2 つの主要な原因が特定されました。どちらも Encore.ts が内部でどのように動作するかに関連しています。

しかし、そこに着く前に、コールドスタートとは実際何なのか、そしてなぜそれが重要なのかについて話しましょう。

コールドスタートとは何ですか?

サーバーレスのコンテキストでは、コールド スタートとは、受信リクエストに対応するために基盤となるプラットフォームが最初にサーバーの新しいインスタンスを起動する必要があるときのことです。 (デプロイ後など、リクエストを処理するためにサーバーの新しいインスタンスが初めて起動されるときを指すこともあります。)

プロセスが起動してリクエストを処理する準備ができるまで、リクエストは事実上保留されるため、コールド スタートアップ時間を短縮すると、アプリケーションのロングテール レイテンシに大きな影響を与える可能性があります。

これは、リクエストを処理するときにシステムの一部でコールド スタートが発生する可能性が非常に高いため、複数のサーバーレス機能がある分散システムでは特に重要です。

コールドスタートの構造

コールド スタート中に何が起こるかは、デプロイ先のプラットフォーム (Kubernetes、Lambda、Cloud Run など) によって多少異なります。
ただし、一般的に、プロセスは次のようになります:

  1. プラットフォームはサーバーレス機能のコード/コンテナイメージをダウンロードします
  2. プラットフォームはコンテナ/サーバーレス関数/コンテナの新しいインスタンスを起動します
  3. コンテナ/関数はそれ自体を初期化します (JavaScript モジュールのインポート、 初期化コードの実行など)

これらの初期化手順の後、コールド スタートが完了し、サーバーレス関数が受信リクエストの処理を開始します。

最初の 2 つのステップは、コード/コンテナのサイズが最適化されていることを除いて、私たちの制御の範囲外であるため、3 番目のステップに注目してみましょう。

実際、Node.js を実行していると仮定して、3 番目のステップをさらに詳しく見てみましょう。

  1. ノードプロセスが起動し、V8 JavaScript エンジンの初期化を開始します
  2. エントリポイント ファイルが解析され、ロードされ、アプリケーション コードの実行が開始されます
  3. JavaScript コードが import ステートメントと require ステートメントを実行すると、さらに多くのファイルがロードされ、解析され、実行されます。 (依存関係が多いアプリケーションの場合は、何度も繰り返します。)

最後に、すべての依存関係がロードされ、すべての初期化コードが実行されると、コンテナ/サーバーレス関数は受信リクエストを処理する準備が整います。

コールドスタートの最適化

上記の内訳により、最適化の明確な目標が得られ、Encore.ts は制御可能なすべてのステップを大幅に最適化します。

最適化 1: Rust ランタイム

Encore.ts は Rust で実装され、ネイティブ モジュールとして Node.JS にロードされます。これには、コールド スタートにいくつかの利点があります。

解析および実行する JavaScript が少なくなります。 JavaScript はインタープリタ型言語であるため、すべての JavaScript コードをディスクから読み取り、解析し、実行する必要があります。 Encore.ts は、コンパイル済みのネイティブ モジュールとして非常に高速に読み込まれるため、JavaScript エンジン (V8) で解析したり実行したりする必要はありません。

NPM 依存関係はゼロです。 Encore.ts は Rust を使用してすべての機能を実装しているため、NPM への依存関係がまったくなく、コールド スタート中に実行する必要がある JavaScript の量がさらに削減されます。

コンパイル済みおよび最適化済み。 JavaScript は、繰り返し実行されるコードが JavaScript エンジンによって最適化される、ジャストインタイム コンパイル (JIT) に大きく依存しています。これはインタープリター型言語にとっては非常に理にかなっていますが、コードの一部を初めて実行するときの実行がかなり遅くなり、コールド スタートに大きな影響を与えることも意味します。 Encore.ts は Rust で実装されているため、事前にコンパイルされ、実行されているプラ​​ットフォームに合わせて大幅に最適化されています。つまり、初回実行時から高速です。

最適化 2: 効率的な Docker イメージ

Encore.ts はデフォルトで、トランスパイルされた JavaScript とアプリケーションの実行に必要な依存関係のみを含めて、縮小された Docker イメージをビルドします。これによりバンドル サイズが小さくなり、コンテナのダウンロードと起動にかかる時間が短縮されます。

さらに、いくつかのコンピューティング プラットフォームでは ストリーミング Docker イメージ のサポートが追加されました。これは、イメージ全体がダウンロードされる前にプラットフォームがコンテナを開始できることを意味します。 Encore.ts にはこれに対するサポートが組み込まれており、コールド スタートを減らすために必要なイメージの部分に自動的に優先順位を付けます。

まとめ

Rust ランタイムと最適化された Docker イメージを組み合わせることで、Encore.ts は驚くべきコールド スタート時間を実現でき、これはアプリケーションのロングテール レイテンシに大きな影響を与える可能性があります。

プロジェクトにとってパフォーマンスが重要な場合は、Encore.ts を試してみることをお勧めします。

すべてオープンソースなので、コードをチェックアウトして GitHub に投稿できます。

または、ぜひ試してみて、ご意見をお聞かせください!

以上がEncore.ts — NestJS や Fastify よりも高速なコールド スタートの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Python vs. JavaScript:学習曲線と使いやすさ Python vs. JavaScript:学習曲線と使いやすさ Apr 16, 2025 am 12:12 AM

Pythonは、スムーズな学習曲線と簡潔な構文を備えた初心者により適しています。 JavaScriptは、急な学習曲線と柔軟な構文を備えたフロントエンド開発に適しています。 1。Python構文は直感的で、データサイエンスやバックエンド開発に適しています。 2。JavaScriptは柔軟で、フロントエンドおよびサーバー側のプログラミングで広く使用されています。

JavaScriptとWeb:コア機能とユースケース JavaScriptとWeb:コア機能とユースケース Apr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

JavaScript in Action:実際の例とプロジェクト JavaScript in Action:実際の例とプロジェクト Apr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptエンジンの理解:実装の詳細 JavaScriptエンジンの理解:実装の詳細 Apr 17, 2025 am 12:05 AM

JavaScriptエンジンが内部的にどのように機能するかを理解することは、開発者にとってより効率的なコードの作成とパフォーマンスのボトルネックと最適化戦略の理解に役立つためです。 1)エンジンのワークフローには、3つの段階が含まれます。解析、コンパイル、実行。 2)実行プロセス中、エンジンはインラインキャッシュや非表示クラスなどの動的最適化を実行します。 3)ベストプラクティスには、グローバル変数の避け、ループの最適化、constとletsの使用、閉鎖の過度の使用の回避が含まれます。

Python vs. JavaScript:コミュニティ、ライブラリ、リソース Python vs. JavaScript:コミュニティ、ライブラリ、リソース Apr 15, 2025 am 12:16 AM

PythonとJavaScriptには、コミュニティ、ライブラリ、リソースの観点から、独自の利点と短所があります。 1)Pythonコミュニティはフレンドリーで初心者に適していますが、フロントエンドの開発リソースはJavaScriptほど豊富ではありません。 2)Pythonはデータサイエンスおよび機械学習ライブラリで強力ですが、JavaScriptはフロントエンド開発ライブラリとフレームワークで優れています。 3)どちらも豊富な学習リソースを持っていますが、Pythonは公式文書から始めるのに適していますが、JavaScriptはMDNWebDocsにより優れています。選択は、プロジェクトのニーズと個人的な関心に基づいている必要があります。

Python vs. JavaScript:開発環境とツール Python vs. JavaScript:開発環境とツール Apr 26, 2025 am 12:09 AM

開発環境におけるPythonとJavaScriptの両方の選択が重要です。 1)Pythonの開発環境には、Pycharm、Jupyternotebook、Anacondaが含まれます。これらは、データサイエンスと迅速なプロトタイピングに適しています。 2)JavaScriptの開発環境には、フロントエンドおよびバックエンド開発に適したnode.js、vscode、およびwebpackが含まれます。プロジェクトのニーズに応じて適切なツールを選択すると、開発効率とプロジェクトの成功率が向上する可能性があります。

JavaScript通訳者とコンパイラにおけるC/Cの役割 JavaScript通訳者とコンパイラにおけるC/Cの役割 Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

Python vs. JavaScript:ユースケースとアプリケーションと比較されます Python vs. JavaScript:ユースケースとアプリケーションと比較されます Apr 21, 2025 am 12:01 AM

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

See all articles