Dalam bahagian 8 kami memperkenalkan konsep di sebalik fungsi Spring Cloud dan dalam bahagian 9 kami menunjukkan cara membangunkan AWS Lambda dengan Spring Cloud Function menggunakan Java 21 dan Spring Boot 3.2. Dalam artikel siri ini, kami akan mengukur masa mula yang sejuk dan hangat termasuk mendayakan SnapStart pada fungsi Lambda tetapi juga menggunakan pelbagai teknik penyebuan seperti penyebuan penyebuan DynamoDB dan penyebuan (proksi) seluruh permintaan Gateway API tanpa melalui rangkaian . Kami akan menggunakan aplikasi sampel Spring Boot 3.2 untuk pengukuran kami dan untuk semua fungsi Lambda gunakan JAVA_TOOL_OPTIONS: "-XX:+TieredCompilation -XX:TieredStopAtLevel=1" dan berikan mereka memori Lambda 1024 MB.
Mari mulakan dengan menerangkan cara mendayakan AWS SnapStart pada fungsi Lambda kerana ia (dengan penyebuan di atas) memberikan potensi pengoptimuman prestasi Lambda (terutamanya masa mula sejuk) yang terbesar. Ini hanya soal konfigurasi:
SnapStart: ApplyOn: PublishedVersions
digunakan dalam sifat fungsi Lambda atau bahagian fungsi global templat SAM. Saya ingin menyelam lebih mendalam tentang cara menggunakan pelbagai teknik penyebuan di atas SnpaStart untuk kes penggunaan kami. Saya menerangkan idea di sebalik penyebuan dalam artikel saya AWS Lambda SnapStart - Mengukur penyebuan, kependaman hujung ke hujung dan masa penggunaan
1) Kod untuk penyebuan permintaan DynamoDB boleh didapati di sini.
Kelas ini juga melaksanakan import org.crac.Sumber antara muka projek CraC.
Dengan seruan ini
Core.getGlobalContext().register(this);
Kelas GetProductByIdWithDynamoDBRequestPrimingHandler mendaftarkan dirinya sebagai sumber CRaC.
Kami juga mengutamakan invokasi DynamoDB dengan melaksanakan kaedah beforeCheckpoint daripada CRaC API.
@Override public void beforeCheckpoint(org.crac.Context<? extends Resource> context) throws Exception { productDao.getProduct("0"); }
yang akan kami gunakan semasa fasa penggunaan fungsi Lambda dan sebelum petikan microVM Firecracker akan diambil.
2) Kod untuk penyebuan permintaan keseluruhan API Gateway boleh didapati di sini.
Kelas ini juga turut melaksanakan antara muka import org.crac.Sumber seperti dalam contoh di atas.
Kami akan menggunakan semula teknik hodoh, yang saya terangkan dalam artikel saya AWS Lambda SnapStart - Bahagian 6 Priming permintaan permintaan untuk rangka kerja Java 11 dan Micronaut, Quarkus dan Spring Boot . Saya tidak mengesyorkan menggunakan teknik ini dalam pengeluaran, tetapi ia menunjukkan potensi selanjutnya untuk mengurangkan permulaan sejuk menggunakan penyebuan keseluruhan permintaan Gateway API dengan pra-memuatkan pemetaan antara model Spring Boot dan Spring Cloud Function dan model Lambda yang juga berprestasi DynamoDB penyebuan doa.
Pembinaan permintaan API Gateway untuk /products/{id} dengan id bersamaan dengan 0 permintaan JSON Gateway API kelihatan seperti ini:
private static String getAPIGatewayRequestMultiLine () { return """ { "resource": "/products/{id}", "path": "/products/0", "httpMethod": "GET", "pathParameters": { "id": "0" }, "requestContext": { "identity": { "apiKey": "blabla" } } } """; }
Kelas beforeCheckpoint apabila nombor perdana (proksi) permintaan keseluruhan API Gateway tanpa melalui rangkaian menggunakan Spring Cloud Function FunctionInvoker yang menggunakan kaedah handleRequestnya dengan menghantar aliran input API Permintaan JSON Gateway dibina di atas seperti ini:
@Override public void beforeCheckpoint(org.crac.Context<? extends Resource> context) throws Exception { new FunctionInvoker().handleRequest( new ByteArrayInputStream(getAPIGatewayRequestMultiLine(). getBytes(StandardCharsets.UTF_8)), new ByteArrayOutputStream(), new MockLambdaContext()); }
Keputusan percubaan di bawah adalah berdasarkan penghasilan semula lebih daripada 100 sejuk dan kira-kira 100,000 permulaan hangat dengan fungsi Lambda dengan tetapan memori 1024 MB untuk tempoh 1 jam. Untuk itu saya menggunakan alat ujian beban hey, tetapi anda boleh menggunakan apa sahaja alat yang anda mahu, seperti Serverless-artillery atau Postman.
Saya menjalankan semua eksperimen ini dengan 4 senario berbeza :
1) Tiada SnapStart didayakan
Dalam template.yaml gunakan konfigurasi berikut:
Handler: org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest #SnapStart: #ApplyOn: PublishedVersions
dan kita perlu menggunakan fungsi Lambda dengan nama GetProductByIdWithSpringBoot32SCF yang dipetakan ke kelas Java Pengendali Lambda GetProductByIdHandler.
2) SnapStart didayakan tetapi tiada penyebuan digunakan
Dalam template.yaml gunakan konfigurasi berikut:
Handler: org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest SnapStart: ApplyOn: PublishedVersions
dan kita perlu menggunakan fungsi Lambda yang sama dengan nama GetProductByIdWithSpringBoot32SCF yang dipetakan ke kelas Java GetProductByIdHandler Lambda Handler.
3) SnapStart didayakan dengan penyebuan invokasi DynamoDB
Dalam template.yaml gunakan konfigurasi berikut:
Handler: org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest SnapStart: ApplyOn: PublishedVersions
dan kita perlu menggunakan fungsi Lambda dengan nama GetProductByIdWithSpringBoot32SCFAndDynamoDBRequestPriming yang dipetakan ke kelas Java GetProductByIdWithDynamoDBRequestPrimingHandler Lambda Handler.
4) SnapStart didayakan dengan penyebuan/perproksian permintaan Gateway API
Dalam template.yaml gunakan konfigurasi berikut:
Handler: org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest SnapStart: ApplyOn: PublishedVersions
and we need to invoke Lambda function with name
GetProductByIdWithSpringBoot32SCFAndWebRequestPriming which is mapped to the GetProductByIdWithWebRequestPrimingHandler Lambda Handler Java class.
Abbreviation c is for the cold start and w is for the warm start.
Cold (c) and warm (w) start time in ms:
Scenario Number | c p50 | c p75 | c p90 | c p99 | c p99.9 | c max | w p50 | w p75 | w p90 | w p99 | w p99.9 | w max |
---|---|---|---|---|---|---|---|---|---|---|---|---|
No SnapStart enabled | 4768.34 | 4850.11 | 4967.86 | 5248.61 | 5811.92 | 5813.31 | 7.16 | 8.13 | 9.53 | 21.75 | 62.00 | 1367.52 |
SnapStart enabled but no priming applied | 2006.60 | 2065.61 | 2180.17 | 2604.69 | 2662.60 | 2663.54 | 7.45 | 8.40 | 9.92 | 23.09 | 1354.50 | 1496.46 |
SnapStart enabled with DynamoDB invocation priming | 1181.40 | 1263.23 | 1384.90 | 1533.54 | 1661.20 | 1662.17 | 7.57 | 8.73 | 10.83 | 23.83 | 492.37 | 646.18 |
SnapStart enabled with API Gateway request invocation priming | 855.45 | 953.91 | 1107.10 | 1339.97 | 1354.78 | 1355.21 | 8.00 | 9.53 | 12.09 | 26.31 | 163.26 | 547.28 |
By enabling SnapStart on the Lambda function alone, it reduces the cold start time of the Lambda function significantly. By additionally using DynamoDB invocation priming we are be able to achieve cold starts only slightly higher than cold starts described in my article AWS SnapStart -Measuring cold and warm starts with Java 21 using different memory settings where we measured cold and warm starts for the pure Lambda function without the usage of any frameworks including 1024MB memory setting like in our scenario.
Comparing the cold and warm start times we measured with AWS Serverless Java Container in the article Measuring cold and warm starts with AWS Serverless Java Container and Measuring cold and warm starts with AWS Lambda Web Adapter we observe that Spring Cloud Function offers higher cold start times than AWS Lambda Web Adapter but quite comparable cold start times to AWS Serverless Java Container (results vary slightly depending on the percentiles). In terms of warm start/execution times all 3 approaches have quite comparable results when especially looking into the percentiles below 99.9.
Atas ialah kandungan terperinci Aplikasi But Spring pada AWS Lambda - Bahagian Mengukur sejuk dan hangat bermula dengan Fungsi Awan Musim Bunga. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!