Pravděpodobně jste viděli architekturu, která vypadá takto:

Architecture diagram showing an incoming S3 bucket triggering a Lambda function which places processed files in another bucket.

Kolik paměti bychom měli přidělit funkci Lambda pro zpracování souborů? Jedním přístupem je vzít nějaká ukázková data a spustit je pomocí Lambda Power Tuning, ale co když zpracováváme soubory různých velikostí? Nejjednodušší způsob, jak z toho ven, je neustále zvětšovat paměť, dokud nebudete moci bezpečně zpracovávat všechna nahrávání, ale to něco stojí. Podívejme se, jak můžeme vybrat správné množství paměti pro každý z našich souborů!

Opravdu to stojí za to?

Je lákavé přidat funkce, jako je tato, během počátečního vývojového procesu, ale pojďme si spočítat, zda se nám skutečně vrátí naše časové investice.

Příklad 1 — upload s nízkou návštěvností

Při jedné žádosti za sekundu (RPS) vyřídíme zhruba dva a půl milionu žádostí za měsíc. Pokud ke zpracování většiny souborů potřebuje 256 MB RAM a 1024 MB RAM ke zpracování 10 % souborů, které jsou náhodou větší, naše náklady jsou následující:

  • Všechna vyvolání na 1024 MB, všechna za 3 s: 98.67 $ / měsíc
  • 90 % vyvolání při 1024 MB, 10 % při 256 MB, vše trvá 3 s: 23.29 $ / měsíc

Úspora sedmdesáti dolarů je příjemná, ale musíme vyhodnotit vývojářské náklady na implementaci této funkce a provozní náklady více lambd (např. pomocí složitějších řídicích panelů, které zobrazují více dat).

Příklad 2 — upload s vysokým provozem

Při stovce RPS jsou čísla zajímavější:

  • Všechna vyvolání na 1024 MB, všechna za 3 s: 3,410.39 $ / měsíc
  • 90 % vyvolání při 1024 MB, 10 % při 256 MB, vše trvá 3 s: 10,414.36 $ / měsíc

Co když velké soubory tvoří pouze 1 % nahraných souborů?

  • Všechna vyvolání na 1024 MB, všechna za 3 s: 3,410.39 $ / měsíc
  • 99 % vyvolání při 1024 MB, 1 % při 256 MB, vše trvá 3 s: 2,710.55 $ / měsíc

Budete muset provést vlastní výpočty, abyste se rozhodli, co dává smysl pro váš kontext. Podívejme se, jak můžeme vybrat správné množství paměti Lambda pro naši velikost vstupního souboru.

Funkce Lambda správné velikosti

Než budeme pokračovat: předpokládá se, že rozumíte velikosti (velikosti) dat, která vaše funkce zpracuje, a provedli jste Lambda Power Tuning, abyste našli nejhospodárnější nastavení paměti pro každou kategorii. Tento proces vám může poskytnout tabulku, která vypadá takto:

ČTĚTE VÍCE
Jaké jsou běžné závady Fordu Ranger?
Minimální velikost souboru Maximální velikost souboru Ideální lambda RAM
100 KB 256 MB
100 KB 25 MB 1024 MB
25 MB Žádný 4096 MB

Původní metodou spouštění funkce Lambda nebo jiné události při nahrání souboru do bucketu S3 je použití upozornění na objekty, ale ty nám neumožňují provádět žádné pokročilé filtrování. Na konci roku 2021 vydala AWS integraci s EventBridge. Díky tomu můžeme vytvořit pravidlo události, které směruje událost vytvořenou v objektu na správné místo. Událost vypadá takto:

 "version": "0", "id": "2ffe83a5-48ff-fccd-2dda-a57a03c22f4b", "detail-type": "Object Created", "source": "aws.s3", "account": "123456789012", "time": "2023-06-18T19:17:31Z", "region": "eu-west-1", "resources": [ "arn:aws:s3. right-size-lambdas-files" ], "detail": "version": "0", "bucket": "name": "right-size-lambdas-files" >, "object": "key": "large", "size": 31457280, "etag": "f6877c498a97505d3a45f485cefc2a40-2", "sequencer": "00648F584721ECA86B" >, "request-id": "2JR2MJWXPFG2JME4", "requester": "123456789012", "source-ip-address": "123.123.123.123", "reason": "CompleteMultipartUpload" > > 

Uvidíte, že událost obsahuje pole velikosti v bajtech. Možná jste již dříve vytvořili pravidlo EventBridge, které vypadá takto:

 "detail": "bucket": "name": [ "right-size-lambdas-files" ] > >, "detail-type": [ "Object Created" ], "source": [ "aws.s3" ] > 

Nemůžeme se ale shodovat s přesným počtem bajtů – pokaždé to bude jiné. Naštěstí můžeme použít číselný operátor k přiřazení rozsahu. Podívejme se, jak to vypadá u prvního záznamu v naší tabulce:

 "detail": "object": "size": [ "numeric": [ ">", , "< p">, 100000 ] > ] > > > 

Výše uvedené pravidlo události zachycuje nejmenší soubory se dvěma podmínkami. Pravidlo události Lambda střední velikosti vypadá téměř identicky, jen s různými hodnotami velikosti a pravidlo události velkých souborů má pouze počáteční rozsah:

 "detail": "object": "size": [ "numeric": [ ">", 25000000 ] > ] > > > 

Zachytí všechny soubory větší než 25 MB.

Můžeme aktualizovat náš diagram architektury, abychom naznačili, že vybíráme správnou Lambdu pro tuto práci:

Architecture diagram showing an incoming S3 bucket triggering one of three EventBridge rules, and then an appropriately sized Lambda function.

A je to! Malé soubory jdou do Lambdy s nejmenší pamětí a největší soubory dostanou celé čtyři gigabajty RAM.

Plně funkční příklad

Plně funkční příklad této techniky najdete na GitHubu. Používá přesně stejnou kódovou základnu k vytvoření tří funkcí Lambda různých velikostí. Pokusit se!

Proč investovat do čističky vzduchu?

Při vysokých objemech může mít smysl směrovat soubory do funkce Lambda odpovídající velikosti. To však nenahrazuje Lambda Power Tuning – stále chceme najít nákladově nejefektivnější nastavení paměti pro každou skupinu souborů, které chceme zpracovat.

ČTĚTE VÍCE
Jaké je zrychlení Cadillacu XT4?

Pomocí EventBridge můžeme filtrovat podle rozsahů číselných hodnot. To nám umožňuje odeslat správnou událost vytvořenou objektem S3 na příslušnou lambdu beze změn v našem kódu Lambda!

Viz také

  • Lambda Power Tuning
  • Plně funkční ukázkový projekt

Učíte se AWS’ CDK v TypeScriptu? Podívejte se na můj kurz na Udemy.