Index denníkaDockup / poznámka z terénu
Note / unexpected-egress-charges

Nečakané poplatky za egress: Odkiaľ pochádzajú účty za bandwidth

Nečakané poplatky za egress zvyčajne spôsobujú štyri návyky: servovanie médií z aplikácie, chýbajúce cache headers, príliš komunikatívne API a traffic medzi regiónmi. Zistite zdroj a znížte účet bez zmeny providera.

Príde účet a je štyrikrát vyšší, než ste čakali. Položka za compute približne zodpovedá vášmu rozpočtu. Tá, ktorá nezodpovedá, je egress — bajty odchádzajúce z vašej infraštruktúry — a je dosť možné, že ste sa nad ním doteraz ani raz nezamysleli.

Nečakané poplatky za egress sú najčastejším prekvapením pri fakturácii za hosting aplikácií a dôvod je štrukturálny: vo vašom vývojovom cykle nič nemeria počet bajtov. Notebook vám za ne nič neúčtuje. V stagingu nie sú používatelia. Prvýkrát sa bandwidth stane viditeľným až na faktúre — a vtedy už máte nasadený návyk, ktorý ho spôsobil.

Tu je prehľad, odkiaľ skutočne pochádza, zoradený podľa toho, ako často je príčinou.

1. Servovanie médií z aplikácie

Tento dôvod výrazne prevyšuje ostatné a takmer vždy ide o náhodu.

Do /public vložíte video, aby ste niečo predviedli. Funguje, takže tam zostane. Pri každom zobrazení stránky sa teraz tento súbor streamuje z vášho kontajnera. Jedno 40 MB video na stránke s tisíckou návštevníkov mesačne predstavuje 40 GB — zo súboru, ktorý ste považovali za dočasnú ukážku.

Rovnaký problém sa týka produktových obrázkov, PDF súborov, uploadov používateľov a fontov. Keď ich pridávate, žiadny z nich nepôsobí ako infraštruktúrne rozhodnutie.

Riešenie nie je zložité: statické médiá patria do object storage za CDN, nie do filesystemu vašej aplikácie. Aplikácia by mala servovať HTML a JSON. Keď začne každému návštevníkovi servovať 4 MB hero obrázok, robí prácu CDN, ale bez akejkoľvek ekonomiky CDN.

2. Chýbajúce cache headers

Ak vaše responses nemajú cache headers, každý návštevník si pri každom načítaní stránky stiahne každý asset. Vracajúci sa návštevníci si všetko stiahnu znova. Crawler si to stiahne desiatkykrát denne.

# Fingerprinted build assets never change — cache them for a year
Cache-Control: public, max-age=31536000, immutable

# HTML changes — revalidate but allow a short window
Cache-Control: public, max-age=0, must-revalidate

# Anything user-specific
Cache-Control: private, no-store

Ide o zmenu na jednom riadku pre každú triedu response, ktorá pravidelne odstráni väčšinu účtu za bandwidth, pretože eliminovaný traffic je číre opakovanie.

3. API, ktoré vracajú viac, než klient využije

List endpoint, ktorý vracia celé objekty, hoci UI vykresľuje tri polia, posiela tento rozdiel pri každom requeste — navždy. Pri profilovaní sa to nikdy neukáže, pretože je rýchly — len veľký.

Na najvyťaženejších endpointoch si overte dve veci:

  • Je zapnutá kompresia? Content-Encoding: gzip alebo br v JSON zvyčajne zmenší objem o 70–80 %. Je to jeden riadok v middleware a často chýba.
  • Posielate polia, ktoré nikto nečíta? Serializovanie celého riadku len preto, že to ORM uľahčilo, je predvolené správanie väčšiny codebase.

Polling klient zhoršuje obe veci v pomere k počtu pollovaní za minútu.

4. Traffic medzi regiónmi a službami

Ak je vaša aplikácia v jednom regióne a databáza v inom, výsledok každého query prekračuje spoplatnenú hranicu. Dá sa to ľahko spraviť omylom — najprv vytvoríte databázu, bez rozmýšľania vyberiete región a o niekoľko týždňov umiestnite aplikáciu niekam inam.

Traffic medzi vašimi vlastnými službami môže byť tiež egress, ak opustí private network a vráti sa cez public hostname. Dve služby v rovnakom workspace, ktoré spolu komunikujú cez svoje public URL, platia dvakrát za rozhovor, ktorý nikdy nemusel opustiť sieť.

Na Dockup je táto konkrétna chyba ťažko možná, pretože služby sa navzájom adresujú pomocou interného mena. Služba sa pripojí na main-db.internal:5432 a k inej službe cez jej alias <slug>.internal — traffic, ktorý zostáva vo workspace network, sa nikdy nedostane k public listeneru. Aj preto databáza predvolene nemá public hostname: nie je čo omylom smerovať cez verejnú sieť.

Ako to zistiť namiesto hádania

Hádať, ktorá zo štyroch príčin to je, znamená premárniť celý billing cycle. Namiesto toho merajte:

Čítajte access log podľa počtu bajtov, nie podľa počtu requestov. Zoraďte top responses podľa celkového objemu servovaných bajtov, nie podľa počtu requestov. Endpoint, ktorý posiela najviac dát, je len zriedka ten, ktorý sa volá najčastejšie.

Skontrolujte najväčšie statické assety. Ak sa z vašej aplikácie servuje čokoľvek väčšie než megabajt, toto je prvá vec, ktorú treba presunúť.

# What is the service actually doing right now
dockup metrics my-project/my-api --json

# And what is it logging
dockup logs my-project/my-api -n 1000

Sledujte crawlerov. Zle fungujúci bot, ktorý opakovane sťahuje veľké súbory, môže tvoriť väčšinu mesačného egress na stránke s miernou návštevnosťou ľudí. robots.txt a noindex v preview environments sú lacné riešenia.

Prostredia, na ktoré nikto nemyslí

Dva návyky generujú egress, ktorý sa vôbec neobjavuje v mentálnom modeli tímu:

Preview environments. Preview pre každý pull request je naozaj užitočné, no nenápadne znásobuje váš footprint. Päť otvorených PR znamená päť kópií stacku, každú s vlastným trafficom — často od rovnakých crawlerov, pretože preview URL sa indexujú, ak im v tom nezabránite.

Dlhodobo bežiaci staging. Staging, ktorý beží osem mesiacov a nikto ho nenavštevuje, stále sťahuje images, stále ho prehľadávajú crawlery a stále spúšťa svoje cron jobs.

Ani jedno nie je dôvodom prestať ich používať. Obe veci však treba obmedziť: preview expirujte po zatvorení PR a označte ich ako noindex, aby ich vyhľadávače vo vašom mene prestali sťahovať.

dockup noindex my-project/my-api --on

Ako vyzerá dobrá fakturácia

Ešte pred vystavením faktúry by ste mali vedieť odpovedať na tri otázky:

  1. Čo momentálne beží? Vrátane vecí, na ktoré ste zabudli.
  2. Koľko toho každá služba spotrebovala? Rozdelené na compute a transfer, nie ako jedno číslo.
  3. Čo sa stane, ak spotreba vyskočí? Limit, ktorý zastaví služby, je nepríjemný. Limit, ktorý neexistuje, je horší.

Dockup meria infraštruktúru oddelene od plánu, takže poplatok za plán neskrýva usage — a kredit $20 v Pro pláne sa od usage odpočítava, nejde o zľavu z poplatku. Podstatné je, že vidíte, ktorá časť je ktorá.

Stručná verzia

Presuňte médiá do object storage. Nastavte cache headers. Zapnite kompresiu. Služby a ich databázy držte v jednom regióne a nechajte ich komunikovať cez private network namiesto verejného internetu. Preview environments expirujte a zabráňte ich zobrazovaniu vo výsledkoch vyhľadávania.

Týchto päť návykov rieši takmer každý nečakaný účet za bandwidth a žiadny z nich nevyžaduje zmenu hostingu.

Často kladené otázky

Čo je egress? Dáta opúšťajúce vašu infraštruktúru smerom na internet. Responses používateľom, sťahované súbory, API payloady. Inbound traffic je zvyčajne bezplatný, outbound zvyčajne nie.

Prečo je môj účet za egress vyšší než účet za compute? Takmer vždy preto, že aplikácia servuje súbory, ktoré patria na CDN. Jeden veľký asset na populárnej stránke môže stáť viac než celé týždne spracovania requestov.

Naozaj CDN znižuje tieto náklady? Áno, ak cachuje. Origin servuje súbor raz pre každý edge namiesto raz pre každého návštevníka a cena CDN za gigabajt je zvyčajne zlomkom ceny aplikačnej platformy.

Stoja preview environments toľko ako produkcia? Stoja toľko, koľko spotrebujú, čo je často viac, než očakávate, pretože každé z nich je úplná kópia a preview URL prehľadávajú crawlery, ak tomu nezabránite.