数か月前、私たちは 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 倍高速です
(GitHub でベンチマーク コードを確認してください。)
ご覧のとおり、Encore.ts は、Express の 5 倍以上、NestJS の 17 倍以上という驚くべき高速コールド スタートアップ時間を実現しています。
これはどのようにして可能ですか?テストの結果、パフォーマンスの 2 つの主要な原因が特定されました。どちらも Encore.ts が内部でどのように動作するかに関連しています。
しかし、そこに着く前に、コールドスタートとは実際何なのか、そしてなぜそれが重要なのかについて話しましょう。
コールドスタートとは何ですか?
サーバーレスのコンテキストでは、コールド スタートとは、受信リクエストに対応するために基盤となるプラットフォームが最初にサーバーの新しいインスタンスを起動する必要があるときのことです。 (デプロイ後など、リクエストを処理するためにサーバーの新しいインスタンスが初めて起動されるときを指すこともあります。)
プロセスが起動してリクエストを処理する準備ができるまで、リクエストは事実上保留されるため、コールド スタートアップ時間を短縮すると、アプリケーションのロングテール レイテンシに大きな影響を与える可能性があります。
これは、リクエストを処理するときにシステムの一部でコールド スタートが発生する可能性が非常に高いため、複数のサーバーレス機能がある分散システムでは特に重要です。
コールドスタートの構造
コールド スタート中に何が起こるかは、デプロイ先のプラットフォーム (Kubernetes、Lambda、Cloud Run など) によって多少異なります。
ただし、一般的に、プロセスは次のようになります:
- プラットフォームはサーバーレス機能のコード/コンテナイメージをダウンロードします
- プラットフォームはコンテナ/サーバーレス関数/コンテナの新しいインスタンスを起動します
- コンテナ/関数はそれ自体を初期化します (JavaScript モジュールのインポート、 初期化コードの実行など)
これらの初期化手順の後、コールド スタートが完了し、サーバーレス関数が受信リクエストの処理を開始します。
最初の 2 つのステップは、コード/コンテナのサイズが最適化されていることを除いて、私たちの制御の範囲外であるため、3 番目のステップに注目してみましょう。
実際、Node.js を実行していると仮定して、3 番目のステップをさらに詳しく見てみましょう。
- ノードプロセスが起動し、V8 JavaScript エンジンの初期化を開始します
- エントリポイント ファイルが解析され、ロードされ、アプリケーション コードの実行が開始されます
- 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 サイトの他の関連記事を参照してください。

JavaScript文字列置換法とFAQの詳細な説明 この記事では、javaScriptの文字列文字を置き換える2つの方法について説明します:内部JavaScriptコードとWebページの内部HTML。 JavaScriptコード内の文字列を交換します 最も直接的な方法は、置換()メソッドを使用することです。 str = str.replace( "find"、 "置換"); この方法は、最初の一致のみを置き換えます。すべての一致を置き換えるには、正規表現を使用して、グローバルフラグGを追加します。 str = str.replace(/fi

単純なJavaScript関数は、日付が有効かどうかを確認するために使用されます。 関数isvaliddate(s){ var bits = s.split( '/'); var d = new Date(bits [2] '/' bits [1] '/'ビット[0]); return !!(d &&(d.getmonth()1)== bits [1] && d.getdate()== number(bits [0])); } //テスト var

この記事では、jQueryを使用して、DOM要素の内側のマージン値とマージン値、特に外側の縁と要素の内側の縁の特定の位置を取得して設定する方法について説明します。 CSSを使用して要素の内側と外側の縁を設定することは可能ですが、正確な値を取得するのは難しい場合があります。 // 設定 $( "div.header")。css( "margin"、 "10px"); $( "div.header")。css( "padding"、 "10px"); このコードはそうだと思うかもしれません

この記事では、10個の例外的なjQueryタブとアコーディオンについて説明します。 タブとアコーディオンの重要な違いは、コンテンツパネルの表示方法と非表示にあります。これらの10の例を掘り下げましょう。 関連記事:10 jQueryタブプラグイン

ウェブサイトのダイナミズムと視覚的な魅力を高めるために、10の例外的なjQueryプラグインを発見してください!このキュレーションされたコレクションは、画像アニメーションからインタラクティブなギャラリーまで、多様な機能を提供します。これらの強力なツールを探りましょう。 関連投稿: 1

HTTP-Consoleは、HTTPコマンドを実行するためのコマンドラインインターフェイスを提供するノードモジュールです。 Webサーバー、Web Servに対して作成されているかどうかに関係なく、HTTPリクエストで何が起こっているかをデバッグして正確に確認するのに最適です

このチュートリアルでは、カスタムGoogle検索APIをブログまたはWebサイトに統合する方法を示し、標準のWordPressテーマ検索関数よりも洗練された検索エクスペリエンスを提供します。 驚くほど簡単です!検索をyに制限することができます

次のjQueryコードスニペットを使用して、Divコンテンツがコンテナ要素領域を超えたときにスクロールバーを追加できます。 (デモンストレーションはありません、それを直接firebugにコピーしてください) // d =ドキュメント // w =ウィンドウ // $ = jQuery var contentarea = $(this)、 wintop = contentarea.scrolltop()、 docheight = $(d).height()、 winheight = $(w).height()、 divheight = $( '#c


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

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

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

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

ドリームウィーバー CS6
ビジュアル Web 開発ツール

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、
