Holiday Weather: z Heroku na serverless AWS — a 4× rýchlejšie pri najpomalších požiadavkách
Nezdokumentované Java „mikroslužby“ na Heroku sa stali TypeScript serverless platformou na AWS. Medián odozvy klesol z 334 ms na 207 ms a najpomalšia požiadavka z 2,3 s na 0,3 s.
- Odvetvie
- Cestovné médiá
- Klient
- Holiday Weather ↗
- Rok
- 2020
Holiday Weather — web s počasím, predpoveďami a priemermi pre dovolenkové destinácie — bežal ako sada Java/Spring „mikroslužieb“ na Heroku bez dokumentácie, so zamotanými vzájomnými závislosťami a slabou podporou pôvodného tímu. Každá zmena bola riziková a 90. percentil odozvy presahoval 1,3 sekundy.
Najprv sme navrhli presun na AWS ECS bez zmeny kódu, potom sme obhájili prepis — TypeScript na Lambde, DynamoDB so streamami, SQS, S3 a Redis cache pred webom — a postavili ho. Dáta o počasí prichádzajú cez FTP podľa harmonogramu, lokality sa spravujú cez admin API a každý krok je viditeľný v CloudWatch.
Nová platforma obslúži medián požiadavky za 207 ms (predtým 334 ms) a najpomalšiu za 302 ms (predtým 2 290 ms) — a keď bola stabilná, zdedené sťahovanie cez FTP sme nahradili API poskytovateľa.
Východisková situácia
Holiday Weather poskytuje britským dovolenkárom aktuálne počasie, predpovede a mesačné priemery pre stovky destinácií — Malorka, Tenerife, Maldivy, Cancún. Za webom bežala Java (Spring) aplikácia na Heroku, rozdelená na „mikroslužby“, ktoré boli viac zamotané než modulárne: bez dokumentácie, vzájomne závislé, s Redisom v pozadí a len sporadickou podporou tímu, ktorý ich postavil.
Pre majiteľov to znamenalo tri problémy naraz: nikto nevedel systém bezpečne meniť, prevádzka stála viac, než mala, a používatelia to cítili — 90. percentil odozvy bol 1,3 sekundy a najpomalšie požiadavky trvali vyše dvoch.
Dva návrhy
Prvý návrh — lift and shift. Zabaliť existujúce Java služby do kontajnerov a spustiť ich na AWS ECS. Na papieri najmenšie riziko, ale nezdokumentovaná zložitosť by sa len presťahovala na novú faktúru.
Druhý návrh — prepis pre platformu. Nanovo implementovať dátovú pipeline a API v TypeScripte na AWS Lambda, ukladať lokality a predpovede do DynamoDB a zmeny distribuovať cez DynamoDB Streams, oddeliť kroky pomocou SQS, archivovať surové dáta do S3 a pred web dať Redis cache. Viac práce na začiatku; systém, ktorému tím klienta potom naozaj rozumie a vie ho prevádzkovať.
Klient si vybral prepis.
Výsledná architektúra
| Krok | Čo beží |
|---|---|
| Príjem dát | Predpovede prichádzajú z API poskytovateľa (pôvodne plánované sťahovanie zazipovaných súborov cez FTP — pozri nižšie) |
| Lokality | Admin API definuje, ktoré destinácie existujú; sú uložené v DynamoDB |
| Spracovanie | Lambda funkcie parsujú dáta, filtrujú ich podľa zoznamu lokalít a posielajú prácu do SQS |
| Úložisko | Spracované predpovede v DynamoDB; surové súbory archivované v S3 |
| Servírovanie | Web číta z Redis cache, ktorú pipeline priebežne obnovuje |
Všetko je infraštruktúra ako kód a každý krok reportuje do CloudWatch, takže chybný feed alebo pomalý poskytovateľ sa ukáže ako graf, nie ako sťažnosť zákazníka.
Čísla
Rovnaká záťaž proti obom platformám (ApacheBench, časy v ms):
| Heroku (staré) | AWS (nové) | |
|---|---|---|
| Priemer | 521 | 216 |
| Medián | 334 | 207 |
| 90. percentil | 1 316 | 297 |
| 99. percentil | 2 290 | 302 |
| Najdlhšia požiadavka | 2 290 | 302 |
Príbeh je v chvoste: najpomalšia požiadavka na novej platforme je rýchlejšia než medián na starej.
A potom sme položili správnu otázku
Pipeline stále začínala plánovaným sťahovaním zazipovaných súborov z FTP servera poskytovateľa dát — lebo tak sa to robilo odjakživa. Keď bola platforma stabilná, vrátili sme sa k poskytovateľovi a spýtali sa, čo ešte ponúka. Mali riadne API. Sťahovanie cez FTP sme nahradili priamou integráciou na API: predpovede prichádzajú vo chvíli, keď sú publikované, nie podľa časovača, kód na príjem dát sa scvrkol na zlomok a z pohotovostného zoznamu zmizla ďalšia pohyblivá súčiastka.
Poučenie, ktoré si odvtedy berieme do každej migrácie: prestavajte platformu, ale spochybnite aj vstupy, ktoré ste zdedili.

Konzultácia priamo s naším inžinierom
Napíšte, čo riešite. Do dvoch pracovných dní dostanete konkrétny návrh s rozsahom a cenou.
- Odpovedá senior inžinier alebo lead audítor, nie account manažér
- Pevný rozsah a cena skôr, než sa začne pracovať
- Procesy certifikované podľa ISO 9001 a ISO 27001, NDA na požiadanie