cari
RumahJavajavaTutorialJava Juga Boleh Tanpa Pelayan: Menggunakan GraalVM untuk Permulaan Dingin Pantas

pengenalan

Pendekatan yang agak biasa apabila ia datang untuk bekerja dengan kod tanpa pelayan ialah menulisnya sebagai aplikasi Python, Node atau Go memandangkan reputasi mereka untuk permulaan sejuk yang sangat cepat.

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

Tetapi bagaimana jika kita berhadapan dengan apl Java sedia ada yang menyasarkan persekitaran tanpa pelayan seperti AWS Lambda? Mungkin sebahagian besar pangkalan kod kami menjadi tuan rumah Java dan kami telah membangunkan ekosistem alat dan perpustakaan yang kaya yang kami ingin gunakan semula. Menulis semula keseluruhan kumpulan aplikasi sedemikian ke dalam bahasa yang berbeza adalah mahal, apatah lagi, kami menyerahkan ciri seperti keselamatan jenis statik dan pengoptimuman masa penyusunan.

Suatu ketika dahulu, saya berdepan dengan senario tepat ini: 9 apl AWS Lambda yang ditulis dalam Java yang akan menjadi sangat perlahan pada permulaan sejuk sehingga beberapa daripadanya kadang-kadang tamat masa.

Lambdas yang dimaksudkan diletakkan di belakang Gerbang API dan digunakan untuk tugas pentadbir dengan memanggil API REST yang sepadan. Kefungsian ini tidak begitu banyak digunakan dan oleh itu mengalami permulaan yang sejuk tidak dapat dielakkan; walau bagaimanapun, kerana ini bukan perkhidmatan kritikal, ia merupakan peluang yang sesuai untuk percubaan: untuk mengetahui sama ada Lambda ini boleh diselamatkan.

Tidak lama kemudian saya terserempak dengan beberapa catatan blog lain tentang pembangun yang berjaya menggunakan GraalVM dan rangka kerja seperti Quarkus untuk menangani masalah ini. Jadi saya telah memutuskan untuk mencubanya sendiri.

Tetapi apakah alatan ini?

GraalVM

Ringkasnya, GraalVM ialah Mesin Maya Java yang disertakan dengan set alat yang mampu menyusun Java kepada Imej Asli dan melaksanakannya menggunakan Graal JVM.

Biasanya Java menggunakan pengkompil "Just In Time" (JIT), yang seperti namanya, melaksanakan pengoptimuman dan penyusunan semasa pelaksanaan kod kami. Aplikasi yang berjalan lama mendapat manfaat daripada ini memandangkan pengoptimum JVM sentiasa memantau pelaksanaan program dan melakukan penalaan halus yang lebih masa diterjemahkan kepada prestasi yang lebih baik.

Ini bagus jika aplikasi dibuat seketika, dan dijangka berjalan selama beberapa jam atau lebih, tetapi tidak begitu hebat jika kita berurusan dengan Kubernetes, AWS Lambdas dan kerja kelompok yang berharap untuk boot apl Java dengan cepat, berprestasi operasi dan skala sensitif masa bergantung pada permintaan - bercakap tentang lag turbo untuk peminat kereta di luar sana.

Dan di sinilah keupayaan Imej Asli GraalVM melangkah masuk untuk membantu. Daripada menggunakan pengkompil JIT, ia memilih pendekatan yang sangat berbeza untuk menyusun kod kami lebih awal daripada masa (AOT). Ia pra-membakar pai kami menggunakan analisis kod statik dan juga pra-memulakan kelas tertentu semasa masa binaan supaya ia bersedia untuk menyala pada bila-bila masa kod aplikasi kami dilaksanakan.

Hasilnya? Permulaan sejuk yang sangat pantas, yang menjadikan Imej Asli sangat berkebolehan dalam domain tanpa pelayan yang apl berumur pendek dan perlu but dengan cepat.

Satu perkara yang perlu diambil perhatian ialah walaupun GraalVM berkemampuan AOT, ia juga boleh berfungsi sebagai pengganti drop-in untuk JVM sedia ada yang menawarkan prestasi yang lebih baik memandangkan pengkompil JIT baharu GraalVM yang ditulis dalam Java.

Tetapi tunggu, ada lagi! Oleh kerana Imej Asli termasuk hanya kod yang berada pada laluan pelaksanaan yang diketahui, kami memangkas lemak dan semua kelas Java yang belum diisytiharkan secara eksplisit untuk disimpan tidak akan tersedia. Oleh kerana kami hanya menyimpan bit yang dijangka akan dilaksanakan, kami meningkatkan keselamatan aplikasi kami.

Ambil contoh kelemahan Log4J yang terkenal yang menggunakan Pelaksanaan Kod Jauh sebagai cara untuk menjejaskan hos. Dengan Imej Asli, rantaian alat sangat tidak mungkin berjaya kerana kepingan kod perpustakaan yang diperlukan untuk menyampaikan serangan itu tidak dapat dicapai.

Quarkus

Quarkus sebaliknya, ialah rangka kerja Java yang dioptimumkan untuk aplikasi tanpa pelayan yang disertakan dengan kotak alat yang memudahkan pembinaan Imej Asli dengan menawarkan sambungan untuk mengkonfigurasi dan membina AWS Lambdas secara khusus sebagai boleh laku asli.

Penyusun C1

Semasa perjalanan pengoptimuman Lambda saya, saya juga telah menemui teknik pengoptimuman alternatif. Salah satu daripada pengoptimuman tersebut ialah penggunaan eksklusif pengkompil C1 yang dicadangkan semasa pelaksanaan Lambda yang telah berjanji untuk menyampaikan permulaan sejuk yang lebih cepat. Biasanya, aplikasi Java yang dijalankan di dalam JVM menggunakan kompilasi berperingkat yang terdiri daripada C1 yang lebih pantas, tetapi kurang optimum, diikuti oleh C2 yang lebih perlahan, tetapi menawarkan prestasi yang lebih optimum untuk apl Java yang dilaksanakan untuk masa yang lama. Memandangkan Lambdas berumur pendek, faedah kompilasi C2 boleh diabaikan.

Panduan berjalan melalui proses mengkonfigurasi kompilasi C1 untuk AWS Lambdas tersedia di sini.

Sudah tentu saya ingin tahu berapa banyak peningkatan yang boleh ditawarkan oleh teknik ini berbanding dengan pelan induk GraalVM saya yang sedia ada, jadi saya juga telah memasukkannya ke dalam penemuan saya di bawah.

Butiran lanjut tentang kompilasi berperingkat JVM serta pengkompil JIT serba baharu GraalVM boleh didapati dalam artikel Baeldung ini.

"Tetapi tunggu, bagaimana dengan AWS SnapStart?"

Ironisnya, beberapa bulan selepas saya menghantar perubahan saya kepada pengeluaran, AWS menghasilkan keupayaan SnapStart terbaharu mereka, yang mengambil gambar Lambda yang sedang berjalan dan bukannya memulakannya semula sekali lagi, ia menggunakan imej syot kilat sebagai titik pemulihan menjanjikan permulaan sejuk yang lebih cepat. Saya terpaksa mencubanya untuk mengetahui sama ada penggunaan GraalVM adalah satu usaha yang sia-sia dan juga memasukkannya dalam penemuan saya.

Perlu diingat bahawa untuk memanfaatkan SnapStart sepenuhnya, pemfaktor semula kod diperlukan untuk menggunakan cangkuk beforeCheckpoint dan afterRestore (butiran lanjut di sini). Memandangkan saya ingin mengelakkan sebarang perubahan kod utama jika boleh, saya telah menggunakan ciri ini "seadanya", tanpa melaksanakan kaedah ini dan menyusun semula sebarang kod.

Pelan Induk

Kini kembali ke GraalVM! Saya terkejut, selepas memasukkan penyelesaian ini, tiada perubahan kod Java sama sekali diperlukan selain daripada menambah dan melaraskan fail konfigurasi binaan dan beberapa metadata yang diperlukan.

Bunyi terlalu bagus untuk menjadi kenyataan?

Mungkin sedikit. Memandangkan kami menggunakan kompilasi AOT, dalam dunia Java, ini menimbulkan cabaran tertentu jika melibatkan penggunaan ciri bahasa seperti Reflections, Proxies, Interfaces dan Service registry yang banyak bergantung kepada perpustakaan. Inilah sebabnya mengapa pengkompil GraalVM memerlukan metadata konfigurasi tambahan untuk diisytiharkan yang secara eksplisit mendaftarkan kelas dan perkhidmatan tertentu supaya mereka boleh dimasukkan ke dalam artifak akhir. GraalVM menyediakan apa yang dipanggil ejen yang boleh digunakan untuk berjalan bersama boleh laku anda untuk mengenal pasti secara automatik konfigurasi yang diperlukan yang boleh menjadikan proses ini lebih mudah.

Quarkus menyediakan beberapa sambungan untuk perpustakaan terkenal untuk menjadikannya "mesra imej asli", tetapi memandangkan saya bekerja dengan pangkalan kod sedia ada, dan matlamat saya adalah untuk mengelakkan sebarang refactor utama (atau sebarang perubahan kod dalam perkara itu ), saya memutuskan untuk mencipta fail konfigurasi yang diperlukan yang diperlukan oleh perpustakaan sedia ada untuk menghasilkan Imej Asli dengan jayanya.

Berhati-hati bahawa penyusunan Imej Asli adalah intensif sumber dan ia mengambil masa yang jauh lebih lama berbanding kompilasi kod bait yang menyasarkan masa jalan JVM standard. Kemungkinannya ialah anda mungkin mendapati diri anda terpaksa memperuntukkan lebih banyak RAM kepada nod binaan untuk mengelakkan masalah ingatan, yang tidak sepatutnya menjadi pemecah perjanjian, tetapi pastinya sesuatu yang perlu diingat.

Sekarang saya telah mengumpulkan Lambdas Imej Asli saya dan dibungkus, tiba masanya untuk menggunakan ia ke dalam persekitaran ujian. Biasanya, Java Lambdas menggunakan Java Runtimes AWS untuk dilaksanakan; walau bagaimanapun, memandangkan kami cuba menggunakan Imej Asli yang merupakan artifak binari yang mengandungi kod apl kami yang dibalut di dalam Graal JVM, kami mesti memilih salah satu daripada persekitaran Amazon Linux "Tersuai" yang ditawarkan oleh AWS.

Metodologi Pengujian

Saya telah menggunakan Koleksi API Posmen untuk menghantar permintaan kepada semua 9 Lambda dan mengukur masa tindak balas mula sejuk untuk setiap teknik yang dinyatakan di atas. Untuk memastikan saya sentiasa mengalami permulaan yang sejuk, saya telah memuatkan semula konfigurasi Lambda sasaran yang memastikan bahawa seruan seterusnya tidak akan menggunakan contoh yang mungkin sudah hangat. Semua Lambdas telah dikonfigurasikan dengan 1GB RAM. Saya juga telah mengukur satu doa untuk setiap konfigurasi memandangkan proses itu memakan masa; namun, masa tindak balas yang diperhatikan memberikan gambaran yang cukup jelas.

Keputusan

Jadi adakah ia berjaya? Sudah tentu! Berikut adalah keputusannya:

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

Dan pemenang yang jelas ialah: GraalVM Native Images - secara purata, ia telah menghasilkan kelajuan 3x ganda berbanding dengan Java Lambdas yang tidak berubah - tiada lagi masa tamat, dan masa tindak balas yang lebih baik, itulah yang saya mahukan capai.

SnapStart tidak berprestasi sebaik yang saya fikirkan tanpa sebarang perubahan kod. Apabila pengkompil C1 digunakan sebagai tambahan kepada ciri SnapStart, ia mengurangkan masa mula sejuk lebih jauh, tetapi masih tidak mengalahkan Imej Asli GraalVM. Itu bukan untuk mengatakan bahawa ia bukan pilihan yang berdaya maju sebagai penambahbaikan yang cepat dan mudah untuk dilaksanakan; walau bagaimanapun, jika kami ingin mengoptimumkan Lambda kami sebanyak mungkin dan kami mempunyai sedikit masa dan sumber untuk melaraskan konfigurasi dan proses binaan kami, GraalVM pastinya lebih unggul dalam hal prestasi dan keselamatan.

Jejak Memori

Seperti yang didakwa oleh GraalVM, Native Images memerlukan kurang sumber untuk dijalankan dengan berkesan berbanding rakan JVM biasa mereka. Saya ingin melihat bagaimana prestasi permulaan sejuk dan permulaan hangat akan bertahan jika saya ingin mengurangkan jumlah RAM yang perlu digunakan oleh Lambdas ini. Kali ini saya telah memilih hanya satu apl Lambda untuk melakukan ujian ini. Berikut adalah keputusannya:

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

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

Dan pada janji mereka mereka telah menunaikan! JVM Lambdas biasa kehabisan memori apabila mencuba konfigurasi 256 MB dan lebih rendah, manakala Imej Asli kelihatan tidak berfasa dan terus dilaksanakan. Jika bukan kerana 128 MB sebagai pilihan memori yang tersedia paling rendah, saya tertanya-tanya berapa banyak yang boleh kita lakukan. Imej Asli bukan sahaja lebih pantas pada permulaan sejuk, tetapi menawarkan prestasi yang konsisten apabila bekerja dengan sumber terhad, yang diterjemahkan kepada kos operasi yang lebih rendah.

Kesimpulan

Ekosistem Java kaya dan luas dengan banyak teknologi baharu dan peningkatan yang muncul setiap hari yang mengekalkan Java dalam permainan apabila ia berkaitan dengan aplikasi tanpa pelayan. Salah satu teknologi baru muncul ialah GraalVM. Apa yang bermula sebagai projek penyelidikan kini perlahan-lahan diterima pakai dan menjadi alternatif yang berdaya maju kepada JVM standard seperti HotSpot. Dalam catatan blog ini, saya hampir tidak menconteng apa yang GraalVM tawarkan dan saya akan menggalakkan pembaca untuk menerokainya dengan lebih lanjut. Terdapat beberapa kisah kejayaan daripada syarikat seperti Adyen (pautan artikel) atau Facebook (pautan artikel) yang dapat menggunakan GraalVM untuk menjimatkan masa dan wang.

Jadi pada kali seterusnya anda akan memberikan diskaun kepada Java sebagai pilihan, cuba GraalVM. Dan kini Spring Boot 3 menyokong Imej Asli GraalVM di luar kotak, lebih mudah berbanding sebelum ini untuk menggunakannya untuk beban kerja tanpa pelayan anda untuk memanfaatkan prestasi, penggunaan sumber yang rendah dan keselamatan tambahan yang ditawarkan oleh GraalVM.

Atas ialah kandungan terperinci Java Juga Boleh Tanpa Pelayan: Menggunakan GraalVM untuk Permulaan Dingin Pantas. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Adakah terdapat teknologi baru yang mengancam atau meningkatkan kemerdekaan platform Java?Adakah terdapat teknologi baru yang mengancam atau meningkatkan kemerdekaan platform Java?Apr 24, 2025 am 12:11 AM

Teknologi yang muncul menimbulkan ancaman dan meningkatkan kemerdekaan platform Java. 1) Teknologi pengkomputeran awan dan kontena seperti Docker meningkatkan kemerdekaan platform Java, tetapi perlu dioptimumkan untuk menyesuaikan diri dengan persekitaran awan yang berbeza. 2) WebAssembly menyusun kod Java melalui GraalVM, memperluaskan kemerdekaan platformnya, tetapi ia perlu bersaing dengan bahasa lain untuk prestasi.

Apakah pelaksanaan JVM yang berbeza, dan adakah mereka semua menyediakan tahap kemerdekaan platform yang sama?Apakah pelaksanaan JVM yang berbeza, dan adakah mereka semua menyediakan tahap kemerdekaan platform yang sama?Apr 24, 2025 am 12:10 AM

Pelaksanaan JVM yang berbeza dapat memberikan kemerdekaan platform, tetapi prestasi mereka sedikit berbeza. 1. OracleHotspot dan OpenJDKJVM melakukan sama seperti kemerdekaan platform, tetapi OpenJDK mungkin memerlukan konfigurasi tambahan. 2. IBMJ9JVM melakukan pengoptimuman pada sistem operasi tertentu. 3. Graalvm menyokong pelbagai bahasa dan memerlukan konfigurasi tambahan. 4. AzulzingJVM memerlukan pelarasan platform tertentu.

Bagaimanakah kebebasan platform mengurangkan kos pembangunan dan masa?Bagaimanakah kebebasan platform mengurangkan kos pembangunan dan masa?Apr 24, 2025 am 12:08 AM

Kemerdekaan platform mengurangkan kos pembangunan dan memendekkan masa pembangunan dengan menjalankan set kod yang sama pada pelbagai sistem operasi. Khususnya, ia ditunjukkan sebagai: 1. Mengurangkan masa pembangunan, hanya satu set kod yang diperlukan; 2. Mengurangkan kos penyelenggaraan dan menyatukan proses ujian; 3. Penyebaran cepat dan kerjasama pasukan untuk memudahkan proses penempatan.

Bagaimanakah kemerdekaan platform Java memudahkan penggunaan semula kod?Bagaimanakah kemerdekaan platform Java memudahkan penggunaan semula kod?Apr 24, 2025 am 12:05 AM

Java'splatformindependencefacilitatescodereusebyallowbytytecodetorunonanyplatformWithAjvm.1) DeveloptersCanWriteCodeOnceforconsistentBeHavioracrossplatforms.2)

Bagaimana anda menyelesaikan masalah khusus platform dalam aplikasi Java?Bagaimana anda menyelesaikan masalah khusus platform dalam aplikasi Java?Apr 24, 2025 am 12:04 AM

Untuk menyelesaikan masalah khusus platform dalam aplikasi Java, anda boleh mengambil langkah-langkah berikut: 1. Gunakan kelas sistem Java untuk melihat sifat sistem untuk memahami persekitaran yang sedang berjalan. 2. Gunakan kelas fail atau java.nio.file untuk memproses laluan fail. 3. Muatkan perpustakaan tempatan mengikut keadaan sistem operasi. 4. Gunakan VisualVM atau JProfiler untuk mengoptimumkan prestasi silang platform. 5. Pastikan persekitaran ujian selaras dengan persekitaran pengeluaran melalui kontena Docker. 6. Gunakan githubactions untuk melakukan ujian automatik pada pelbagai platform. Kaedah ini membantu menyelesaikan masalah khusus platform dalam aplikasi Java.

Bagaimanakah subsistem loader kelas dalam JVM menyumbang kepada kebebasan platform?Bagaimanakah subsistem loader kelas dalam JVM menyumbang kepada kebebasan platform?Apr 23, 2025 am 12:14 AM

Loader kelas memastikan konsistensi dan keserasian program Java pada platform yang berbeza melalui format fail kelas bersatu, pemuatan dinamik, model delegasi induk dan bytecode bebas platform, dan mencapai kemerdekaan platform.

Adakah pengkompil Java menghasilkan kod khusus platform? Menjelaskan.Adakah pengkompil Java menghasilkan kod khusus platform? Menjelaskan.Apr 23, 2025 am 12:09 AM

Kod yang dihasilkan oleh pengkompil Java adalah platform bebas, tetapi kod yang akhirnya dilaksanakan adalah platform khusus. 1. Kod sumber Java disusun ke dalam bytecode bebas platform. 2. JVM menukar bytecode ke dalam kod mesin untuk platform tertentu, memastikan operasi silang platform tetapi prestasi mungkin berbeza.

Bagaimanakah JVM mengendalikan multithreading pada sistem operasi yang berbeza?Bagaimanakah JVM mengendalikan multithreading pada sistem operasi yang berbeza?Apr 23, 2025 am 12:07 AM

Multithreading adalah penting dalam pengaturcaraan moden kerana ia dapat meningkatkan respons program dan penggunaan sumber dan mengendalikan tugas serentak yang kompleks. JVM memastikan konsistensi dan kecekapan multithreads pada sistem operasi yang berbeza melalui pemetaan benang, mekanisme penjadualan dan mekanisme kunci penyegerakan.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

mPDF

mPDF

mPDF ialah perpustakaan PHP yang boleh menjana fail PDF daripada HTML yang dikodkan UTF-8. Pengarang asal, Ian Back, menulis mPDF untuk mengeluarkan fail PDF "dengan cepat" dari tapak webnya dan mengendalikan bahasa yang berbeza. Ia lebih perlahan dan menghasilkan fail yang lebih besar apabila menggunakan fon Unicode daripada skrip asal seperti HTML2FPDF, tetapi menyokong gaya CSS dsb. dan mempunyai banyak peningkatan. Menyokong hampir semua bahasa, termasuk RTL (Arab dan Ibrani) dan CJK (Cina, Jepun dan Korea). Menyokong elemen peringkat blok bersarang (seperti P, DIV),

VSCode Windows 64-bit Muat Turun

VSCode Windows 64-bit Muat Turun

Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

PhpStorm versi Mac

PhpStorm versi Mac

Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Persekitaran pembangunan bersepadu PHP yang berkuasa