Maksimalkan kinerja Lambda SnapStart - AWS Lambda

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Maksimalkan kinerja Lambda SnapStart

Penyempurnaan performa

catatan

SnapStart bekerja paling baik saat digunakan dengan pemanggilan fungsi dalam skala besar. Fungsi yang jarang dipanggil mungkin tidak mengalami peningkatan kinerja yang sama.

Untuk memaksimalkan manfaat SnapStart, kami menyarankan Anda memuat kelas pramuat yang berkontribusi pada latensi startup dalam kode inisialisasi Anda, bukan di penangan fungsi. Ini memindahkan latensi yang terkait dengan pemuatan kelas berat keluar dari jalur pemanggilan, mengoptimalkan kinerja startup dengan. SnapStart

Jika Anda tidak dapat melakukan pramuat kelas selama inisialisasi, maka kami sarankan Anda memuat kelas dengan pemanggilan dummy. Untuk melakukan ini, perbarui kode fungsi handler, seperti yang ditunjukkan pada contoh berikut dari fungsi pet store pada GitHub repositori AWS Labs.

private static SpringLambdaContainerHandler<AwsProxyRequest, AwsProxyResponse> handler; static { try { handler = SpringLambdaContainerHandler.getAwsProxyHandler(PetStoreSpringAppConfig.class); // Use the onStartup method of the handler to register the custom filter handler.onStartup(servletContext -> { FilterRegistration.Dynamic registration = servletContext.addFilter("CognitoIdentityFilter", CognitoIdentityFilter.class); registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, "/*"); }); // Send a fake Amazon API Gateway request to the handler to load classes ahead of time ApiGatewayRequestIdentity identity = new ApiGatewayRequestIdentity(); identity.setApiKey("foo"); identity.setAccountId("foo"); identity.setAccessKey("foo"); AwsProxyRequestContext reqCtx = new AwsProxyRequestContext(); reqCtx.setPath("/pets"); reqCtx.setStage("default"); reqCtx.setAuthorizer(null); reqCtx.setIdentity(identity); AwsProxyRequest req = new AwsProxyRequest(); req.setHttpMethod("GET"); req.setPath("/pets"); req.setBody(""); req.setRequestContext(reqCtx); Context ctx = new TestContext(); handler.proxy(req, ctx); } catch (ContainerInitializationException e) { // if we fail here. We re-throw the exception to force another cold start e.printStackTrace(); throw new RuntimeException("Could not initialize Spring framework", e); } }

Praktik terbaik jaringan

Status koneksi yang ditetapkan fungsi Anda selama fase inisialisasi tidak dijamin saat Lambda melanjutkan fungsi Anda dari snapshot. Dalam kebanyakan kasus, koneksi jaringan yang AWS SDK dibuat secara otomatis dilanjutkan. Untuk koneksi lain, kami merekomendasikan praktik terbaik berikut.

Membangun kembali koneksi jaringan

Selalu buat kembali koneksi jaringan Anda saat fungsi Anda dilanjutkan dari snapshot. Kami menyarankan Anda membangun kembali koneksi jaringan di function handler. Atau, Anda dapat menggunakan hook afterRestore runtime.

Jangan gunakan nama host sebagai pengenal lingkungan eksekusi yang unik

Kami merekomendasikan untuk tidak menggunakan hostname untuk mengidentifikasi lingkungan eksekusi Anda sebagai node atau wadah unik dalam aplikasi Anda. Dengan SnapStart, satu snapshot digunakan sebagai status awal untuk beberapa lingkungan eksekusi, dan semua lingkungan eksekusi mengembalikan hostname nilai yang sama untukInetAddress.getLocalHost(). Untuk aplikasi yang memerlukan identitas atau hostname nilai lingkungan eksekusi yang unik, sebaiknya Anda membuat ID unik di pengendali fungsi. Atau, gunakan hook afterRestore runtime untuk menghasilkan ID unik, lalu gunakan ID unik sebagai pengenal untuk lingkungan eksekusi.

Hindari mengikat koneksi ke port sumber tetap

Kami menyarankan Anda menghindari pengikatan koneksi jaringan ke port sumber tetap. Koneksi dibuat kembali ketika fungsi dilanjutkan dari snapshot, dan koneksi jaringan yang terikat ke port sumber tetap mungkin gagal.

Hindari menggunakan DNS cache Java

Fungsi Lambda sudah cache DNS respons. Jika Anda menggunakan DNS cache lain dengan SnapStart, maka Anda mungkin mengalami batas waktu koneksi saat fungsi dilanjutkan dari snapshot.

java.util.logging.LoggerKelas secara tidak langsung dapat mengaktifkan JVM DNS cache. Untuk mengganti pengaturan default, setel networkaddress.cache.ttl ke 0 sebelum menginisialisasi. logger Contoh:

public class MyHandler { // first set TTL property static{ java.security.Security.setProperty("networkaddress.cache.ttl" , "0"); } // then instantiate logger var logger = org.apache.logging.log4j.LogManager.getLogger(MyHandler.class); }

Untuk mencegah UnknownHostException kegagalan dalam runtime Java 11, kami sarankan pengaturan networkaddress.cache.negative.ttl ke 0. Di Java 17 dan runtime yang lebih baru, langkah ini tidak diperlukan. Anda dapat mengatur properti ini untuk fungsi Lambda dengan variabel AWS_LAMBDA_JAVA_NETWORKADDRESS_CACHE_NEGATIVE_TTL=0 lingkungan.

Menonaktifkan JVM DNS cache tidak menonaktifkan caching terkelola Lambda. DNS