Laravel Vapor

Prvně si představíme obecnou definici, co je vlastně Laravel Vapor. Jedná se o automaticky škálovatelnou, serverless deployment platformu pro Laravel bežící na AWS Lambda. Vapor abstrahuje komplexitu řízení Laravel aplikace na AWS Lambda, stejně tak odstiňuje práci s SQS queues, databází, Redis clustery, sítí, CloudFront CDN a mnoho dalšího. Hlavní výhody Vaporu jsou tedy:

  • Automaticky škálovatelná webová/queue infrastruktura pro Laravel
  • Prakticky žádný časový deployment a rollbacky
  • Enviromentální proměnné
  • Databázový management, včetně časové zálohy a její škálování
  • Redis management, včetně škálování clusterů
  • Automatické nahrávání příloh na Cloudfront CDN během deploymentu
  • Unikátní URL pro každý enviroment
  • Vlastní aplikační domény
  • DNS management
  • Management certifikátů a jejich obnova
  • Aplikační, databázové a cache metriky
  • CI friendly

Ve zkratce si lze Vapor představit jako Laravel Forge pro serverless technologii.

Serverless

Tolik k obecné definici Vaporu. Nicméně stále dokola omíláme termíny jako serverless a AWS Lambda. Co si přesně pod tím máme představit, se nyní pokusím vysvětlit.

Když se podíváme do souboru index.php v Laravel aplikaci, najdeme tam toto:

$response = $kernel->handle(
  $request = Illuminate\Http\Request::capture()
);

$response->send();

Když pošlete požadavek na aplikaci, metoda Kernel::handle tento požadavek zpracuje a odpověď pošle zpět do vašeho prohlížeče. Běžně hostujete tuto aplikaci na nějakém serveru, který čeká na přicházející požadavek a zavolá index.php kdykoliv je potřeba. Řekněme, že vaše aplikace běží na malém DigitalOcean dropletu a platíte za něj 5$ měsíčně.

Nyní si představte, že můžete nahrát pouze metodu Kernel::handle jako servisu a platíte pouze tehdy, když tato metoda běží. Nemusíte se starat o zajišťování serveru, upgrady dalších knihoven, řešit velikost a všechny tyto věci. Prostě jen nahrajete funkci a platíte jen tehdy, když funkce běží. A o tom je prakticky celé serverless.

AWS Lambda

Lambda funguje jako FaaS (Function as a service) a Laravel Vapor ji využívá pro běh Laravel aplikace jako funkce, která je zavolána až když je potřeba. Prostě jen nahrajete aplikace na Vapor a to je vše, o server se vůbec nestaráte.

Lambda je hlavně využívaná jako část Microservices architektury, kde lambda znamená, že má na práci je jednu věc:

  • nahrajete obrázek na S3, lambda je zavolána a vygeneruje thumbnail verzi vašeho obrázku
  • pošlete job na queue, lambda je zavolána a zpracuje tento job
  • časově si nastavíte job a AWS zavolá lambdu kdykoliv je potřeba
  • pošlete HTTP požadavek na endpoint a lambda je zavolána a vygeneruje odpověď
  • můžete také zavolat lambdu kdykoliv je potřeba

To obvykle znamená, že musíte vaší aplikaci rozdělit do několika různých servisů, kde každá service má svoji vlastní část kódu a vy musíte nahrávat tyto různé funkce do AWS a dávat jim pokyny kdy se má spustit která lambda. Například uživatel odešle objednávku, vy nařídíte AWS aby spustila lambdu "new-order". Uživatel si vyžádá fakturu, vy nařídíte AWS aby spustila lambdu "generate-invoice". Uživatel potřebuje seznam produktů, vy nařídíte AWS aby spustila lambdu "product-list" a tak dále.

Zatímco Microservices architektura má v řadě případu nezvratné výhody, přidává to zároveň mnohem větší složitost do vašeho projektu, jelikož musíte řídit a dirigovat všechny servisy aby fungovaly společně. Laravel Vapor vezme váš kód a převede ho na funkce. V závislosti na události, která spouští danou funkci, Vapor zavolá určitou část vaší aplikace. Tímto způsobem je veškeré volání zajištěno Laravelem. Například pokud uživatel navštíví endpoint api/products, Vapor předá HTTP požadavek na Laravel router a pošle odpověď zpět. Nebo pokud je job dostupný na SQS, Vapor tento job předá na workera aby jej zpracoval.

Díky tomu můžete mít všechny výhody serverless bez nutnosti měnit způsob psaní Laravel aplikace. Vapor automaticky přebírá veškerou práci při převodu Laravel aplikace aby pracovala serverless.

Jak to funguje

Vapor konvertuje aplikaci na jedinou lambdu. Nicméně pro nastavení jiných konfigurací pro HTTP a CLI prostředí, Vapor vytvoří dvě identické lamdy na AWS.

HTTP lambda je zodpovědná za HTTP požadavky a můžete nastavovat množství paměti AWS, která se má alokovat pro HTTP požadavky nebo nastavit časový limit.

CLI lambda je zodpovědná za běh artisan příkazů, zpracování jobů a časové řízení jobů. Stejně tak můžete také nastavovat paměť či časový limit.

enter image description here

Proč používat Vapor?

Neřešíte update, CPU/RAM monitorování, restartování serveru, selhání hardwaru atd. Můžete si více užívat spánku, protože být na telefonu 24 hodin celý týden je stresující a vyčerpávající. Oznámení ve dvě hodiny ráno, že nastal výpadek a nutnost ho řešit, nepotěší nikoho. Jasně, nestává se to zase tak často, nicméně Vy (nebo někdo za vašeho týmu), musí být vždy připraven tento problém řešit. Použitím Vaporu nic takového řešit nemusíte a namísto vás bude ve dvě hodiny ráno vstávat někdo z AWS týmu. Váš čas tak můžete strávit budováním aplikace.

Nepotřebujete najímat DevOps podporu a mít tak někoho, kdo bude o výpadku informován a bude na to co nejdříve reagovat.

Vapor je vhodný v případě, že nevíte jakou budete mít návštěvnost. Například během měsíce můžete mít párkrát potřebu zpracovávat více než 400 milionů požadavků a pak normálně jeden milion požadavků za den. Díky Vaporu nemusíte řešit přetížení a budete platit pouze za požadavky, které zpracujete.

Laravel Vapor byl vytvořen Taylorem Otwellem a Laravel týmem. Díky tomu je zajištěno, že celá platforma je vytvořena především pro framework, který aplikace používá.

Kdy nepoužívat Vapor?

Nyní se na věc podívejme více objektivně. Pokud řešíte cenu hostingu kdykoliv je částka větší než 500 Kč měsíčně nebo pokud se vám zdá částka 39$ měsíčně za Vapor příliš vysoká, pak si upřímně myslím, že Vapor nebude pro vás vhodný.

Vapor je především pro lidi, kteří když uslyší "39 dolarů prakticky za bezúdržbovost serveru", okamžitě odpoví "Hned mě přihlaš!". Nicméně vždy záleží na aktuální potřebách firmy/jedince, kdy je potřeba zvážit výhody (serverless) a nevýhody (případná cena). Avšak v případě potřeby se vždy dá využít cenově přijatelnější Laravel Forge, který ikdyž není serverless, tak nabízí také mnoho výhod.