AWS Lambda Konteyner Yeniden Kullanımı için En İyi Uygulamalar

AWS Lambda'yı Diğer Hizmetlere Bağlarken Sıcak Başlangıçları Optimize Etme

AWS Lambda, sunucusuz ve vatansız olma nedeniyle yüksek ölçeklenebilirlik sağlar ve lambda fonksiyonunun birçok kopyasının anında üretilmesine izin verir (burada açıklandığı gibi). Ancak, uygulama kodunu yazarken, durum bilgisi olan bazı verilere erişmek isteyebilirsiniz. Bu, RDS örneği veya S3 gibi bir veri mağazasına bağlanmak anlamına gelir. Ancak, AWS Lambda'dan diğer servislere bağlanmak, fonksiyon kodunuza zaman kazandırır. Ayrıca, bir RDS örneğine izin verilen maksimum bağlantı sayısına ulaşma gibi yüksek ölçeklenebilirliğin yan etkileri de olabilir. Buna karşı koyma seçeneklerinden biri, bağlantıyı sürdürmek ve lambda çalışma süresini azaltmak için AWS Lambda'da konteynerin yeniden kullanılmasıdır.

Bir lambda isteğinin yaşam döngüsünü açıklamak için burada bazı yararlı diyagramlar vardır.

Soğuk başlatma sırasında, fonksiyonunuz ilk kez çalıştırıldığında veya bir işlem yapılmadığında, aşağıdakiler gerçekleşir:

  • Kod ve bağımlılıklar indirilir.
  • Yeni bir konteyner başlatıldı.
  • Çalışma zamanı önyüklendi.

Son eylem, lambda işlevi her çağrıldığında gerçekleşen kodunuzu başlatmaktır. Konteynır lambda fonksiyonunun daha sonraki bir çağrısı için tekrar kullanılırsa, kodu başlatmak için ileri atlayabiliriz. Buna sıcak başlangıç ​​adı verilir ve bu, işleyici yönteminin kapsamı dışındaki bağlantıyı tanımlayarak diğer hizmetlere bağlanırken optimize edebileceğimiz adımdır.

Lambda'dan Diğer AWS Hizmetlerine Bağlanma

Örnek: RDS örneğine bağlanın, buradan kaynaklı AWS simgeleri.

Çalıştırılması gereken temel ve ortak bir örneğimiz var - zenginleştirme verilerini almak için bir konteyner kaynağına bağlanmak istiyoruz. Bu örnekte, bir JSON yükü bir ID ile gelir ve Lambda İşlevi, zenginleştirilmiş yükü geri alabilmemiz için kimliğin karşılık gelen adını bulmak için PostgreSQL çalıştıran bir RDS örneğine bağlanır. Lambda işlevi bir VPC'de yaşayan RDS'ye bağlandığından, lambda işlevinin şimdi özel bir alt ağda da yaşaması gerekir. Bu, soğuk çalıştırmaya birkaç adım ekler - bir VPC elastik ağ arayüzünün (ENI) eklenmesi gerekir (Jeremy Daly’nin blogunda belirtildiği gibi, bu sizin soğuk başlangıcınıza zaman ekler).

Not: Rynam yerine DynamoDB ile bir anahtar / değer deposu kullanmak isteseydik VPC kullanmaktan kaçınabilirdik.

Bu görev için iki çözüm üzerinde çalışacağım, ilki “saf” çözümüm, ikinci çözüm ise daha sonraki çağrılar için bağlantıyı yeniden kullanarak sıcak başlangıç ​​zamanları için optimize ediyor. Sonra her bir çözümün performansını karşılaştıracağız.

Seçenek 1 - İşleyicideki RDS'ye bağlanın

Bu kod örneği, bu göreve nasıl naif bir şekilde yaklaşabileceğimi gösteriyor - veritabanı bağlantısı işleyici yönteminde. Şimdi adı içeren taşıma yükünü döndürmeden önce kimliğin adını almak için basit bir seçme sorgusu var.

Bu seçeneğin, 20 eşzamanlılık ile 2000 çağırma patlaması olan küçük bir test sırasında nasıl performans gösterdiğini görelim.

Lambda Süresi

Aşağıdaki grafik veritabanına maksimum sekiz bağlantı olduğunu göstermektedir.

5 dakikalık bir pencerede RDS veritabanına bağlantı sayısı.

Seçenek 2 - Genel Bağlantı Kullan

İkinci seçenek, bağlantıyı işleyici yönteminin dışında genel olarak tanımlamaktır. Ardından, işleyicinin içine, bağlantının olup olmadığını görmek için bir kontrol ekleriz ve yalnızca kurulmazsa bağlanırız. Bu, bağlantının yalnızca konteyner başına bir kez yapıldığı anlamına gelir. Bağlantının koşullu olarak bu şekilde yapılması, kod mantığı gerektirmediği takdirde bağlantı kurmamız gerekmediği anlamına gelir.

Artık veritabanına olan bağlantıyı kapatmıyoruz, bu nedenle bağlantı bir sonraki işlev çağrısı için kalır. Bağlantının tekrar kullanılması sıcak başlama sürelerini önemli ölçüde azaltır - ortalama süre yaklaşık 3 kat daha hızlıdır ve minimum 18 ms yerine 1 ms'dir.

Lambda Süreleri

Bir RDS örneğine bağlanmak zaman alıcı bir iştir ve her çağrı için bağlanmak zorunda kalmamak performansa yarar sağlar. Basit bir veritabanı sorgusu için veritabanına bağlanırken, eşzamanlılık seviyesine uyan 20 adede kadar veri tabanı bağlantı sayısı elde ediyoruz (x 100 kez 20 eşzamanlı çağrı yaptık). Çağırma patlaması durduğunda, bağlantılar yavaş yavaş kapanır.

Şimdi AWS, lambda kullanım süresini 15 dakikaya çıkardığı için, bu, veritabanı bağlantılarının daha uzun süre dayanabileceği ve RDS maksimum bağlantı numarasına ulaşma tehlikesiyle karşı karşıya olabileceğiniz anlamına gelir. RDS parametre grubu ayarlarında varsayılan maksimum bağlantıların üzerine yazılabilir, ancak maksimum bağlantı sayısını artırmak bellek ayırmada sorunlara neden olabilir. Daha küçük örnekler varsayılan olarak 100'den az bir varsayılan max_connections değerine sahip olabilir. Bu sınırlara dikkat edin ve yalnızca gerektiğinde veritabanına bağlanmak için uygulama mantığı ekleyin.

Diğer Görevler için Genel Bağlantı Kullanma

Lambda S3'e Bağlanma

Lambda ile gerçekleştirmemiz gereken ortak bir görev, S3'ten durum bilgisi olan verilere erişmektir. Aşağıdaki kod parçacığı, AWS konsoluna giriş yaparak ve buraya tıklayarak gidebileceğiniz bir AWS tarafından sağlanan Python Lambda Function planıdır. Kodda, konteyner başlatıldığında S3 istemcisinin işleyicinin dışında tamamen tanımlandığını görebilirsiniz; oysa RDS örneği için genel bağlantı işleyicinin içinde ayarlandı. Her iki yaklaşım da, global değişkenleri sonraki çağrılar için uygun olmalarına izin verecek şekilde ayarlayacaktır.

s3-get-object lambda planı kod pasajı https://console.aws.amazon.com/lambda/home?region=us-east-1#/create/new?bp=s3-get-object-python

Ortam Değişkenlerinin Şifresini Çözme

Lambda konsolu, ek güvenlik için ortam değişkenlerinizi şifreleme seçeneği sunar. Aşağıdaki kod parçacığı, bir Lambda işlevinden ortam değişkenlerinin şifresini çözmek için bir yardımcı komut dosyasının Java örneği tarafından sağlanan bir Java örneğidir. Bu öğreticiyi takip ederek kod pasajına gidebilirsiniz (özellikle adım 6). DECRYPTED_KEY global bir sınıf olarak tanımlandığından, decryptKey () işlevi ve mantığı lambda kabı başına yalnızca bir kez çağrılır. Bu nedenle sıcak başlangıç ​​sürelerinde önemli bir gelişme göreceğiz.

https://console.aws.amazon.com/lambda/home?region=us-east-1#/functions and https://docs.aws.amazon.com/lambda/latest/dg/tutorial-env_console.html

Global Değişkenleri Diğer FaaS Çözümlerinde Kullanma

Bu yaklaşım AWS Lambda ile izole edilmemiştir. Genel bağlantı kullanmanın yöntemi, diğer bulut sağlayıcıların sunucusuz işlevlerine de uygulanabilir. Google Cloud Functions ipuçları ve püf noktaları sayfası, tembel olmayan değişkenler (değişken her zaman işleyici yönteminin dışında başlatıldığında) ve değişken değişkenlere (global değişken yalnızca gerektiğinde ayarlanır) genel değişkenlere karşı iyi bir açıklama sunar.

Diğer En İyi Uygulamalar

Akılda tutulması gereken bazı diğer en iyi uygulamalar.

Test yapmak

FaaS kullanmak bir mikro hizmet mimarisine sahip olmayı kolaylaştırır. Ve küçük, ayrık işlevsellik parçalarına sahip olmak, etkili birim testleriyle el ele gider. Ünite testlerine yardımcı olmak için:

  • Test bağımlılıklarını lambda paketinden çıkarmayı unutmayın.
  • Bir programın ana yönteminde olduğu gibi, mantığı işleyici yönteminden ayırın.

Bağımlılıklar ve Paket Boyutu

Dağıtım paketinin boyutunu küçültmek, kodu indirmenin başlatma sırasında daha hızlı olacağı ve bu nedenle soğuk başlangıç ​​zamanlarınızı iyileştireceği anlamına gelir. Dağıtım ZIP dosyasının boyutunu azaltmak için kullanılmayan kitaplıkları ve ölü kodu kaldırın. AWS SDK, Python ve JavaScript çalışma zamanları için sağlanmıştır, bu nedenle dağıtım paketinize eklemenize gerek yoktur.

Node.js tercih ettiğiniz Lambda çalışma zamanı ise, işlev kodunuzun boyutunu küçültmek ve dağıtım paketinizin boyutunu en aza indirmek için küçültme ve yükseltme uygulayabilirsiniz. Bazıları ancak minyatürleşme ve küçük düşürmenin tüm yönleri diğer çalışma zamanlarına uygulanabilir, örneğin. boşlukları python kodundan kaldıramazsınız, ancak yorumları kaldırabilir ve değişken adlarını kısaltabilirsiniz.

Belleği Ayarlama

Lambda İşlevi için en uygun belleği bulmak için deneyler. Hafıza tahsisi için ödeme yaparsınız, bu nedenle hafızayı iki katına çıkarmak her milisaniyede bir çift ödeme yapmanız gerektiği anlamına gelir; ancak hesaplanan kapasite, tahsis edilen hafıza ile artar, bu sayede çalışma süresini potansiyel olarak yarısı seviyesinin altına düşürebilir. Bunun gibi, sizin için en uygun bellek ayarını seçmek için zaten bazı yararlı araçlar bulunmaktadır.

Sonuç olarak ...

Dikkate alınması gereken bir husus, bağlantı yeniden kullanım yönteminin uygulanmasının gerekli olup olmadığıdır. Eğer lambda fonksiyonunuz sadece nadiren, örneğin günde bir kez çalıştırılıyorsa, ılık başlangıçlar için optimizasyondan faydalanamazsınız. Performansınızı optimize etmek ile kodunuzun okunabilirliği arasında en iyiyi dengelemek arasında bir takas vardır - “uglifikasyon” terimi kendisi için konuşur! Ek olarak, diğer servislerle bağlantıları yeniden kullanmak için kodunuza global değişkenler eklemek, kodunuzun izlenmesini zorlaştırabilir. İki soru akla geliyor:

  • Yeni bir ekip üyesi kodunuzu anlayacak mı?
  • Siz ve ekibiniz gelecekte kodu ayıklayabilecek misiniz?

Ancak, Lambda'yı ölçeği için seçtiniz ve yüksek performans ve düşük maliyetler istiyorsanız, ekibinizin ihtiyaçlarına uygun dengeyi bulun.

Bu görüşler yazara aittir. Bu yayında aksi belirtilmediği sürece, Capital One bağlı değildir veya belirtilen hiçbir şirket tarafından onaylanmamıştır. Kullanılan veya görüntülenen tüm ticari markalar ve diğer fikri mülkiyet, ilgili sahiplerinin mülkiyetindedir. Bu makale © 2019 Başkent Bir.