Lamba LLRT

WBOY
WBOYasal
2024-08-21 06:14:05466semak imbas

Penafian: mana-mana dan semua kandungan yang disiarkan bertujuan untuk mengingatkan atau mengekalkan pengetahuan saya dan saya harap ia dapat membantu anda dalam perjalanan anda melalui pembelajaran juga.
Siaran ini disiarkan secara langsung dan akan dikemas kini secara berkala.
Jika anda mendapati sebarang kelemahan atau perasan bahawa ada sesuatu yang hilang, bantu saya memperbaiki :)


Pernahkah anda berhenti untuk berfikir bahawa kami semakin dituntut mengenai prestasi aplikasi kami?
Setiap hari kami digalakkan untuk menjadikannya lebih pantas dan dengan itu, kami dibimbing untuk menilai penyelesaian dan seni bina yang membolehkan kami mencapai hasilnya.


Jadi ideanya adalah untuk membawa siaran ringkas, memaklumkan tentang evolusi baharu yang boleh membantu kami mendapat peningkatan yang ketara dalam prestasi dalam aplikasi tanpa pelayan dalam AWS Lambda. Penyelesaian ini ialah Javascript LLRT.

Javaskrip LLRT(Javaskrip Masa Jalan Kependaman Rendah)

Waktu jalan Javascript baharu sedang dibangunkan oleh pasukan aws.
Ia sedang dalam percubaan dan terdapat usaha untuk mencuba mengeluarkan versi stabil menjelang akhir tahun 2024.

lihat penerangan yang dipersembahkan oleh AWS:

LLRT (Low Latency Runtime) ialah masa jalan JavaScript ringan yang direka untuk menangani permintaan yang semakin meningkat untuk aplikasi Tanpa Pelayan yang pantas dan cekap. LLRT menawarkan sehingga lebih 10x permulaan lebih pantas dan sehingga 2x kos keseluruhan lebih rendah berbanding dengan masa jalan JavaScript lain yang dijalankan pada AWS Lambda
Ia dibina dalam Rust, menggunakan QuickJS sebagai enjin JavaScript, memastikan penggunaan memori yang cekap dan permulaan pantas.

Pastikan bahawa mereka menyasarkan untuk menyampaikan sesuatu sehingga 10x lebih pantas daripada masa jalan JS yang lain.

Semua pembinaan ini dilakukan menggunakan Rust, yang merupakan bahasa berprestasi tinggi, dan QuickJS, yang merupakan enjin JavaScript yang ringan dan berprestasi tinggi, direka bentuk untuk menjadi kecil, cekap dan serasi dengan spesifikasi ECMAScript terkini. termasuk ciri moden seperti kelas, async/menunggu dan modul. Tambahan pula, pendekatan yang tidak menggunakan JIT digunakan. Oleh itu, bukannya memperuntukkan sumber untuk kompilasi Just-In-Time, ia menjimatkan sumber ini untuk melaksanakan tugas dalam kod itu sendiri.

Tetapi jangan risau, tidak semuanya berwarna cerah, ia adalah pertukaran (pun yang mengerikan, saya tahu lol).
Oleh itu, terdapat beberapa perkara penting yang perlu dipertimbangkan sebelum memikirkan tentang menerima pakai LLRT JS. Lihat apa yang dikatakan AWS:

Terdapat banyak kes di mana LLRT menunjukkan kelemahan prestasi yang ketara berbanding dengan masa jalan yang dikuasakan JIT, seperti pemprosesan data yang besar, simulasi Monte Carlo atau melaksanakan tugas dengan ratusan ribu atau jutaan lelaran. LLRT paling berkesan apabila digunakan pada fungsi Tanpa Pelayan yang lebih kecil khusus untuk tugas seperti transformasi data, pemprosesan masa nyata, penyepaduan perkhidmatan AWS, kebenaran, pengesahan dsb. Ia direka untuk melengkapkan komponen sedia ada dan bukannya berfungsi sebagai pengganti menyeluruh untuk segala-galanya. Terutama, memandangkan API yang disokongnya adalah berdasarkan spesifikasi Node.js, peralihan kembali kepada penyelesaian alternatif memerlukan pelarasan kod yang minimum.

Selain itu, ideanya ialah LLRT JS bukanlah pengganti untuk node.js dan ia juga tidak akan pernah menjadi.

Lihat:

LLRT hanya menyokong sebahagian kecil daripada API Node.js Ia BUKAN penurunan penggantian untuk Node.js, dan tidak akan pernah berlaku. Di bawah ialah gambaran keseluruhan tahap tinggi bagi API dan modul yang disokong separa. Untuk butiran lanjut rujuk dokumentasi API.


Ujian Penilaian

Dengan mengambil kira kebolehgunaan yang dinyatakan oleh AWS sendiri, kami akan menjalankan dua ujian untuk menilai dan membandingkan LLRT dengan NodeJS. Salah satu ujian adalah untuk mengira nombor perdana dan satu lagi adalah untuk panggilan API yang mudah.

Mengapa menggunakan pengiraan nombor perdana?
Jawapannya ialah pemprosesan tinggi yang diperlukan untuk mengenal pasti nombor perdana terhasil daripada keperluan untuk melaksanakan banyak operasi matematik (pembahagian) untuk mengesahkan primaliti, taburan prima yang tidak dapat diramalkan, dan kerumitan yang semakin meningkat dengan saiz nombor. Faktor-faktor ini bergabung untuk menjadikan pemeriksaan primaliti dan pencarian nombor perdana sebagai tugasan yang intensif secara pengiraan, terutamanya pada skala besar.


Selesai...

Buat fungsi lambda pertama dengan nodejs:

Lamba LLRT

Sekarang, mari buat fungsi dengan LLRT JS. Saya memilih untuk menggunakan pilihan lapisan.

Buat lapisan:
Lamba LLRT

Kemudian buat fungsi:
Lamba LLRT

Dan tambahkan lapisan ini pada fungsi LLRT JS yang dibuat:
Lamba LLRT

Untuk ujian nombor perdana, kami akan menggunakan kod berikut:

let isLambdaWarm = false
export async function handler(event)  {

    const limit = event.limit || 100000;  // Defina um limite alto para aumentar a complexidade
    const primes = [];
    const startTime = Date.now()
    const isPrime = (num) => {
        if (num <= 1) return false;
        if (num <= 3) return true;
        if (num % 2 === 0 || num % 3 === 0) return false;
        for (let i = 5; i * i <= num; i += 6) {
            if (num % i === 0 || num % (i + 2) === 0) return false;
        }
        return true;
    };

    for (let i = 2; i <= limit; i++) {
        if (isPrime(i)) {
            primes.push(i);
        }
    }

  const endTime = Date.now() - startTime

    const response = {
        statusCode: 200,
        body: JSON.stringify({
            executionTime: `${endTime} ms`,
            isLambdaWarm: `${isLambdaWarm}`
        }),
    };


    if (!isLambdaWarm) { 
        isLambdaWarm = true
    }

    return response;
};


Dan untuk ujian API, kami akan menggunakan kod di bawah:

let isLambdaWarm = false
export async function handler(event) {

  const url = event.url || 'https://jsonplaceholder.typicode.com/posts/1'
  console.log('starting fetch url', { url })
  const startTime = Date.now()

  let resp;
  try {
    const response = await fetch(url)
    const data = await response.json()
    const endTime = Date.now() - startTime
    resp = {
      statusCode: 200,
      body: JSON.stringify({
        executionTime: `${endTime} ms`,
        isLambdaWarm: `${isLambdaWarm}`
      }),
    }
  }
  catch (error) {
    resp = {
      statusCode: 500,
      body: JSON.stringify({
        message: 'Error fetching data',
        error: error.message,
      }),
    }
  }

  if (!isLambdaWarm) {
    isLambdaWarm = true
  }

  return resp;
};

Keputusan ujian

Objektifnya lebih mendidik di sini, jadi sampel kami untuk setiap ujian terdiri daripada 15 data permulaan hangat dan 1 data permulaan sejuk.

Penggunaan ingatan

LLRT JS - untuk kedua-dua ujian, jumlah memori yang sama digunakan: 23mb.

NodeJS - untuk ujian nombor perdana, nodej mula menggunakan 69mb dan meningkat kepada 106mb.
Untuk ujian API, minimum ialah 86mb dan maksimum ialah 106mb.

Masa pelaksanaan
selepas mengalih keluar outlier, inilah hasilnya:

Lamba LLRT

Lamba LLRT

Laporan akhir

Penggunaan memori - untuk penggunaan memori diperhatikan bahawa LLRT menggunakan sumber yang tersedia dengan lebih baik berbanding dengan nodej.

Prestasi - kami mendapati bahawa dalam senario pemprosesan tinggi, nod mengekalkan prestasi yang jauh lebih tinggi daripada LLRT, kedua-duanya dalam permulaan sejuk dan permulaan hangat.
Untuk senario pemprosesan yang lebih rendah, LLRT mempunyai kelebihan tertentu, terutamanya dalam permulaan yang sejuk.

Mari kita tunggu keputusan akhir dan berharap kami boleh memperolehi peningkatan yang lebih ketara, tetapi sangat bagus untuk melihat fleksibiliti JS dan melihat sejauh mana ia boleh dan masih perlu menyampaikan kepada kami.


Saya harap anda menikmatinya dan membantu anda meningkatkan pemahaman anda tentang sesuatu atau membuka laluan kepada pengetahuan baharu. Saya mengharapkan kritikan dan cadangan agar kami dapat menambah baik kandungan dan sentiasa memastikannya dikemas kini untuk komuniti.

Atas ialah kandungan terperinci Lamba LLRT. 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
Artikel sebelumnya:Rangka Kerja Hadapan Baharu?Artikel seterusnya:Rangka Kerja Hadapan Baharu?