国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ Java &#&チュートリアル Java もサーバーレスにできる: GraalVM を使用した高速コールド スタート

Java もサーバーレスにできる: GraalVM を使用した高速コールド スタート

Jan 07, 2025 am 06:16 AM

導(dǎo)入

サーバーレス コードを操作する場合の非常に一般的なアプローチは、コールド スタートが非常に速いという評判を考慮して、Python、Node、または Go アプリケーションとしてコードを記述することです。

Java Can Be Serverless Too: Using GraalVM for Fast Cold Starts

しかし、AWS Lambda などのサーバーレス環(huán)境をターゲットとする既存の Java アプリケーションに直面したらどうなるでしょうか?おそらくコード ベースの大部分は Java をホストしており、再利用したいツールとライブラリの豊富なエコシステムを開発しました。このようなアプリケーション全體を別の言語で書き直すにはコストがかかり、言うまでもなく、靜的タイプセーフやコンパイル時間の最適化などの機能を放棄することになります。

少し前、私はまさにこのシナリオに直面しました。Java で書かれた 9 つの AWS Lambda アプリは、コールド スタートで非常に遅くなり、一部のアプリが時折タイムアウトするほどでした。

問題の Lambda は API Gateway の背後に配置され、対応する REST API を呼び出すことで管理タスクに使用されました。この機能はあまり頻繁に使用されていなかったため、コールド スタートが発生するのは避けられませんでした。ただし、これは重要なサービスではなかったため、これらの Lambda を回収できるかどうかを判斷するための実験には絶好の機會でした。

この問題に対処するために GraalVM や Quarkus などのフレームワークをうまく使用している開発者に関する他のいくつかのブログ投稿に出會うまで、それほど時間はかかりませんでした。そこで私は自分で試してみることにしました。

しかし、そもそもこれらのツールは何なのでしょうか?

GraalVM

要するに、GraalVM は、Java をネイティブ イメージにコンパイルし、Graal JVM を使用して実行できるツールセットが付屬する Java 仮想マシンです。

通常、Java は「Just In Time」(JIT) コンパイラーを利用します。これは、名前が示すように、コードの実行中に最適化とコンパイルを?qū)g行します。 JVM オプティマイザーがプログラムの実行を常に監(jiān)視し、時間の経過とともにパフォーマンスの向上につながる微調(diào)整を?qū)g行するため、長時間実行されるアプリケーションはこの恩恵を受けます。

これは、アプリケーションが一度インスタンス化され、數(shù)時間以上実行されることが予想される場合には最適ですが、Kubernetes、AWS Lambda、および Java アプリケーションを迅速に起動し、実行することを期待するバッチ ジョブを扱う場合には、あまり良くありません。時間に敏感な操作と需要に応じた規(guī)模 - 自動車愛好家にとってターボラグといえば。

ここで、GraalVM のネイティブ イメージ機能が役に立ちます。 JIT コンパイラーを使用する代わりに、コードを事前にコンパイルする (AOT) という非常に異なるアプローチを選択します。靜的コード分析を使用してパイを事前にベイクし、ビルド時に特定のクラスを事前初期化して、アプリケーション コードが実行されるときにいつでも起動できるようにします。

結(jié)果は?非常に高速なコールド スタートにより、アプリの有効期間が短く、すぐに起動する必要があるサーバーレス ドメインでネイティブ イメージが非常に機能します。

注意すべき點の 1 つは、GraalVM は AOT に対応していますが、Java で書かれた GraalVM の新しい JIT コンパイラを考慮すると、既存の JVM のドロップイン置き換えとしても機能し、パフォーマンスが向上するということです。

しかし、待ってください、それだけではありません!ネイティブ イメージには既知の実行パス上にあるコードのみが含まれるため、脂肪は削除され、保持することが明示的に宣言されていないすべての Java クラスは使用できなくなります。実行が予想されるビットのみを保持するため、アプリケーションのセキュリティが向上します。

ホストを侵害する手段としてリモート コード実行を使用する悪名高い Log4J 脆弱性を例に考えてみましょう。ネイティブ イメージでは、攻撃を伝達するために必要なライブラリ コードの部分にさえ到達できないため、ガジェット チェーンが成功する可能性は非常に低いです。

クォーカス

一方、

Quarkus は、サーバーレス アプリケーション用に最適化された Java フレームワークで、AWS Lambda をネイティブ実行可能ファイルとして特別に設(shè)定および構(gòu)築するための拡張機能を提供することで、ネイティブ イメージの構(gòu)築を容易にするツールボックスが付屬しています。

C1 コンパイラ

Lambda の最適化の過程で、別の最適化手法にも遭遇しました。そのような最適化の 1 つは、Lambda の実行中に C1 コンパイラーを排他的に使用する提案であり、これによりコールド スタートの高速化が約束されました。通常、JVM 內(nèi)で実行される Java アプリケーションは、高速ではあるが最適性が低い C1 と、その後に低速ではあるが長時間実行される Java アプリケーションに最適なパフォーマンスを提供する C2 で構(gòu)成される階層型コンパイルを使用します。 Lambda の壽命が短いことを考えると、C2 コンパイルのメリットはごくわずかです。

AWS Lambda の C1 コンパイルを構(gòu)成するプロセスを説明するガイドは、ここから入手できます。

もちろん、私が実施している GraalVM マスタープランと比較して、この手法がどの程度の改善をもたらすかを知りたかったので、以下の調(diào)査結(jié)果にも含めました。

JVM の階層型コンパイルと GraalVM の新しい JIT コンパイラーの詳細については、この Baeldung の記事を參照してください。

「でも、ちょっと待って、AWS SnapStart についてはどうですか?」

皮肉なことに、私が変更を本番環(huán)境に出荷してから數(shù)か月後、AWS は最新の SnapStart 機能を考案しました。これは、実行中の Lambda のスナップショットを取得し、最初から再初期化するのではなく、スナップショット イメージを使用します。復(fù)元ポイントはコールド スタートの高速化を約束します。 GraalVM の使用が無駄な労力であったかどうかを確認するために試してみる必要があり、それも調(diào)査結(jié)果に含めました。

SnapStart を最大限に活用するには、beforeCheckpoint フックと afterRestore フックを利用するためにコードのリファクタリングが必要になることに注意してください (詳細はこちら)。可能であれば大きなコード変更を避けたかったため、これらのメソッドを?qū)g裝したりコードを再配置したりすることなく、この機能を「そのまま」使用しました。

マスタープラン

GraalVM に戻りましょう。驚いたことに、このソリューションを組み込んだ後は、ビルド構(gòu)成ファイルといくつかの必要なメタデータの追加と調(diào)整を除いて、Java コードの変更はまったく必要ありませんでした。

うますぎる話ですね?

少しかもしれない。 Java の世界では AOT コンパイルを使用していることを考えると、多くのライブラリが依存するリフレクション、プロキシ、インターフェイス、サービス レジストリなどの言語機能の使用に関しては、一定の課題が生じます。このため、GraalVM コンパイラでは、特定のクラスとサービスを最終アーティファクトに含めることができるように、明示的に登録する追加の構(gòu)成メタデータを宣言する必要があります。 GraalVM は、実行可能ファイルと一緒に実行するために使用できるいわゆるエージェントを提供し、必要な構(gòu)成を自動的に識別することで、このプロセスを容易にします。

Quarkus は、よく知られているライブラリを「ネイティブ イメージ フレンドリー」にするための拡張機能をいくつか提供していますが、私が既存のコード ベースで作業(yè)していたことを考えると、私の目標は、大きなリファクタリング (または、さらに言えばコードの変更) を避けることでした。 )、ネイティブ イメージを正常に生成するために既存のライブラリに必要な構(gòu)成ファイルを作成することにしました。

ネイティブ イメージのコンパイルはリソースを大量に消費し、標準の JVM ランタイムを?qū)澫螭趣筏骏啸ぅ去畅`ドのコンパイルに比べてかなり長い時間がかかることに注意してください。メモリ不足の問題を回避するために、ビルド ノードにより多くの RAM を割り當(dāng)てる必要がある可能性があります。これは取引を妨げるものではありませんが、必ず念頭に置いておく必要があります。

ネイティブ イメージ Lambda をコンパイルしてパッケージ化したので、次はそれらをテスト環(huán)境にデプロイします。通常、Java Lambda は AWS の Java ランタイムを利用して実行します。ただし、Graal JVM 內(nèi)にラップされたアプリコードを含むバイナリアーティファクトであるネイティブイメージを使用しようとしている場合、AWS が提供する「カスタム」Amazon Linux 環(huán)境の 1 つを選択する必要があります。

テスト方法

Postman API コレクションを使用して 9 個の Lambda すべてにリクエストを送信し、上記の各手法のコールド スタートの応答時間を測定しました。常にコールド スタートが発生することを確認するために、ターゲット Lambda の設(shè)定をリロードしました。これにより、次の呼び出しではすでにウォーム狀態(tài)になっている可能性のあるインスタンスが使用されなくなります。すべての Lambda は 1GB の RAM で構(gòu)成されました。また、プロセスに時間がかかることを考慮して、構(gòu)成ごとに 1 回の呼び出しを測定しました。ただし、観察された応答時間は非常に明確な狀況を示しています。

結(jié)果

それで、うまくいきましたか?絶対に!結(jié)果は次のとおりです:

Java Can Be Serverless Too: Using GraalVM for Fast Cold Starts

そして、明らかな勝者は次のとおりです: GraalVM Native Images - 変更されていない Java Lambda と比較して、平均して 3 倍の高速化が実現(xiàn)しました - タイムアウトがなくなり、応答時間が大幅に向上しました。これはまさに私が望んでいたものです。達成します。

コードを変更しないと、SnapStart は思ったほどパフォーマンスが良くありませんでした。 SnapStart 機能に加えて C1 コンパイラを採用すると、コールド スタート時間はさらに短縮されましたが、それでも GraalVM のネイティブ イメージを上回ることはできませんでした。だからといって、これが迅速かつ簡単に実裝できる改善策として実行可能な選択肢ではないというわけではありません。ただし、Lambda を可能な限り最適化する必要があり、構(gòu)成とビルド プロセスを調(diào)整するための時間とリソースがある場合は、パフォーマンスとセキュリティの點で GraalVM が間違いなく優(yōu)れています。

メモリ使用量

GraalVM が主張しているように、ネイティブ イメージは、通常の JVM に比べて効率的に実行するために必要なリソースが少なくなります。これらの Lambda が動作する必要がある RAM の量を減らした場合に、コールド スタートとウォーム スタートのパフォーマンスがどのように維持されるかを確認したかったのです。今回は、このテストを?qū)g行するために 1 つの Lambda アプリのみを選択しました。結(jié)果は次のとおりです:

Java Can Be Serverless Too: Using GraalVM for Fast Cold Starts

Java Can Be Serverless Too: Using GraalVM for Fast Cold Starts

そして彼らは約束を果たしました!通常の JVM Lambda は 256 MB 以下の構(gòu)成を試行するとメモリ不足になりましたが、ネイティブ イメージは段階的ではなく実行を継続しているように見えました。 128 MB が利用可能な最小メモリ オプションでなかったら、どれだけメモリを減らすことができたのだろうか。ネイティブ イメージは、コールド スタートで高速なだけでなく、限られたリソースで作業(yè)する場合でも一貫したパフォーマンスを提供し、運用コストの削減につながります。

結(jié)論

Java のエコシステムは豊富かつ広大で、サーバーレス アプリケーションに関して Java を常に活用し続ける多くの新しいテクノロジと機能強化が日々登場しています。そのような新興テクノロジーの 1 つが GraalVM です。研究プロジェクトとして始まったものは、現(xiàn)在では徐々に採用されており、HotSpot などの標準 JVM の実行可能な代替手段として浮上しています。このブログ投稿では、GraalVM が提供する機能のほんの表面をなぞっただけなので、読者にはさらに詳しく調(diào)べていただくことをお勧めします。 Adyen (記事リンク) や Facebook (記事リンク) などの企業(yè)からは、GraalVM を利用して時間とお金を節(jié)約できた成功事例がいくつかあります。

次に Java をオプションとして無視する場合は、GraalVM を試してみてください。 Spring Boot 3 がすぐに使える GraalVM ネイティブ イメージをサポートするようになったことで、サーバーレス ワークロードにこれまで以上に簡単にネイティブ イメージを採用して、GraalVM が提供するパフォーマンス、低リソース消費、追加されたセキュリティを活用できるようになりました。

以上がJava もサーバーレスにできる: GraalVM を使用した高速コールド スタートの詳細內(nèi)容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負いません。盜作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

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 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

ハッシュマップとハッシュテーブルの違いは? ハッシュマップとハッシュテーブルの違いは? Jun 24, 2025 pm 09:41 PM

ハッシュマップとハッシュテーブルの違いは、主にスレッドの安全性、ヌル価値のサポート、パフォーマンスに反映されます。 1.スレッドの安全性の観點から、ハッシュテーブルはスレッドセーフであり、その方法はほとんど同期メソッドであり、ハッシュマップはスレッドセーフではない同期処理を?qū)g行しません。 2。ヌル値のサポートに関しては、ハッシュマップは1つのnullキーと複數(shù)のヌル値を許可しますが、ハッシュテーブルはnullキーや値を許可しません。 3.パフォーマンスの観點から、ハッシュマップは同期メカニズムがないため、より効率的です。ハッシュテーブルは、各操作のロックパフォーマンスが低いです。代わりにconcurrenthashmapを使用することをお勧めします。

なぜラッパークラスが必要なのですか? なぜラッパークラスが必要なのですか? Jun 28, 2025 am 01:01 AM

Javaは、基本的なデータ型がオブジェクト指向の操作に直接參加できないため、ラッパークラスを使用し、実際のニーズでオブジェクトフォームが必要になることが多いためです。 1.コレクションクラスは、リストが自動ボクシングを使用して數(shù)値を保存するなど、オブジェクトのみを保存できます。 2。ジェネリックは基本的なタイプをサポートしておらず、パッケージングクラスはタイプパラメーターとして使用する必要があります。 3.パッケージングクラスは、null値を表して、データまたは欠落データを區(qū)別できます。 4.パッケージングクラスは、データの解析と処理を容易にするための文字列変換などの実用的な方法を提供するため、これらの特性が必要なシナリオでは、パッケージングクラスは不可欠です。

インターフェイスの靜的メソッドとは何ですか? インターフェイスの靜的メソッドとは何ですか? Jun 24, 2025 pm 10:57 PM

StaticMethodsinInterfaceswereIntroducatedinjava8toalowutilityは、interfaceitself.beforejava8、そのような導(dǎo)入のために導(dǎo)入されたコード、rediveTodisorgedCode.now、statecmethodssprovidreebenefits:1)彼らの可能性のある測定di

JITコンパイラはどのようにコードを最適化しますか? JITコンパイラはどのようにコードを最適化しますか? Jun 24, 2025 pm 10:45 PM

JITコンパイラは、メソッドインライン、ホットスポット検出とコンピレーション、タイプの投機と偏見、冗長操作の排除の4つの方法を通じてコードを最適化します。 1。メソッドインラインで呼び出しのオーバーヘッドを減らし、頻繁に小さな方法と呼ばれる挿入をコールに直接直接挿入します。 2。ホットスポットの検出と高周波コードの実行とそれを中央に最適化して、リソースを節(jié)約します。 3。タイプ投機は、敬v的な呼び出しを達成するためにランタイムタイプ情報を収集し、効率を向上させます。 4.冗長操作は、運用データの削除に基づいて役に立たない計算と検査を排除し、パフォーマンスを向上させます。

インスタンスイニシャルイザーブロックとは何ですか? インスタンスイニシャルイザーブロックとは何ですか? Jun 25, 2025 pm 12:21 PM

インスタンス初期化ブロックは、Javaで使用され、コンストラクターの前に実行されるオブジェクトを作成するときに初期化ロジックを?qū)g行します。複數(shù)のコンストラクターが初期化コード、複雑なフィールド初期化、または匿名のクラス初期化シナリオを共有するシナリオに適しています。靜的初期化ブロックとは異なり、インスタンス化されるたびに実行されますが、靜的初期化ブロックはクラスがロードされたときに1回のみ実行されます。

変數(shù)の「ファイナル」キーワードは何ですか? 変數(shù)の「ファイナル」キーワードは何ですか? Jun 24, 2025 pm 07:29 PM

Injava、thefinalkeywordpreventsavariaibleのValue frombeingededafterassignment、ButiTsbehiviordiffersforprimitivesandobjectReferences

工場のパターンとは何ですか? 工場のパターンとは何ですか? Jun 24, 2025 pm 11:29 PM

ファクトリーモードは、オブジェクトの作成ロジックをカプセル化するために使用され、コードをより柔軟でメンテナンスしやすく、ゆるく結(jié)合します。コアの答えは、オブジェクトの作成ロジックを一元的に管理し、実裝の詳細を隠し、複數(shù)の関連オブジェクトの作成をサポートすることです。特定の説明は次のとおりです。工場モードは、NewClass()の使用を直接回避し、処理のための特別な工場クラスまたは方法にオブジェクトの作成を手渡します。複數(shù)のタイプの関連オブジェクトが作成され、作成ロジックが変更され、実裝の詳細を非表示にする必要があるシナリオに適しています。たとえば、支払いプロセッサでは、Stripe、PayPal、その他のインスタンスが工場を通じて作成されます。その実裝には、入力パラメーターに基づいて工場クラスによって返されるオブジェクトが含まれ、すべてのオブジェクトは共通のインターフェイスを?qū)g現(xiàn)します。一般的なバリアントには、単純な工場、工場法、抽象的な工場が含まれます。これらは異なる複雑さに適しています。

タイプキャストとは何ですか? タイプキャストとは何ですか? Jun 24, 2025 pm 11:09 PM

変換には、暗黙的で明示的な変換には2つのタイプがあります。 1.暗黙的な変換は、INTを2倍に変換するなど、自動的に発生します。 2。明示的な変換には、(int)mydoubleの使用など、手動操作が必要です。タイプ変換が必要な場合には、ユーザー入力の処理、數(shù)學(xué)操作、または関數(shù)間のさまざまなタイプの値の渡されます。注意する必要がある問題は次のとおりです。浮動小數(shù)點數(shù)を整數(shù)に変換すると、分數(shù)部分が切り捨てられ、大きなタイプを小さなタイプに変えるとデータの損失につながる可能性があり、一部の言語では特定のタイプの直接変換ができません。言語変換ルールを適切に理解することは、エラーを回避するのに役立ちます。

See all articles