Uventede egresskostnader: Hvor båndbreddekostnadene kommer fra
Uventede egresskostnader skyldes vanligvis fire vaner: å levere media fra appen, manglende cache-headere, chatty API-er og trafikk på tvers av regioner. Finn kilden og reduser regningen uten å bytte leverandør.
Regningen kommer, og den er fire ganger så høy som du forventet. Compute-linjen er omtrent som budsjettert. Linjen som ikke stemmer, er egress – bytene som forlater infrastrukturen din – og det er stor sjanse for at du aldri har tenkt over den.
Uventede egresskostnader er den vanligste fakturaoverraskelsen ved hosting av applikasjoner, og årsaken er strukturell: Ingenting i utviklingssløyfen din måler bytes. Den bærbare PC-en din tar ikke betalt for dem. Staging har ingen brukere. Første gang båndbredde blir synlig, er på en faktura – og da har du allerede levert vanen som forårsaket den.
Her er hvor kostnadene faktisk kommer fra, rangert etter hvor ofte dette er svaret.
1. Levere media fra applikasjonen
Denne kostnaden overgår de andre med god margin, og det skjer nesten alltid ved et uhell.
Du legger en video i /public for å demonstrere noe. Det fungerer, så den blir liggende. Nå strømmer hvert sidebesøk denne filen ut av containeren din. Én video på 40 MB på en side med tusen besøkende i måneden utgjør 40 GB – fra en fil du oppfattet som en midlertidig plassholder.
Det samme gjelder produktbilder, PDF-filer, brukeropplastinger og fontfiler. Ingen av dem føles som infrastrukturvalg når du legger dem til.
Løsningen er ikke avansert: Statisk media hører hjemme i objektlagring bak en CDN, ikke i filsystemet til applikasjonen. Appen bør levere HTML og JSON. I det øyeblikket den leverer et hero-bilde på 4 MB til hver besøkende, gjør den jobben til en CDN uten å få noen av fordelene ved økonomien i en CDN.
2. Manglende cache-headere
Hvis responsene dine ikke har cache-headere, laster hver besøkende ned alle ressurser på nytt ved hver sidelasting. Gjentatte besøkende laster ned alt på nytt. En crawler laster det ned dusinvis av ganger om dagen.
# 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
Dette er en endring på én linje per responsklasse som ofte fjerner det meste av en båndbredderegning, fordi trafikken den eliminerer, bare er ren repetisjon.
3. API-er som returnerer mer enn klienten bruker
Et listeendepunkt som returnerer komplette objekter når brukergrensesnittet viser tre felter, sender differansen med hver forespørsel, for alltid. Det dukker aldri opp i profiling fordi det er raskt – det er bare stort.
To ting bør du kontrollere på de mest trafikkerte endepunktene dine:
- Er komprimering aktivert?
Content-Encoding: gzipellerbrpå JSON reduserer vanligvis størrelsen med 70–80 %. Det er en linje i middleware, og den mangler ofte. - Sender du felter ingen leser? Å serialisere hele raden fordi ORM-et gjorde det enkelt, er standardoppførselen i de fleste kodebaser.
En klient som poller, gjør begge deler verre med en faktor tilsvarende antall ganger i minuttet den poller.
4. Trafikk på tvers av regioner og tjenester
Hvis appen din er i én region og databasen i en annen, krysser hvert spørringsresultat en betalt grense. Dette er lett å gjøre ved et uhell – du oppretter databasen først, velger en region uten å tenke over det, og plasserer appen et annet sted noen uker senere.
Trafikk mellom dine egne tjenester kan også regnes som egress hvis den forlater det private nettverket og kommer tilbake via et offentlig vertsnavn. To tjenester i samme workspace som snakker sammen over sine offentlige URL-er, betaler to ganger for en samtale som aldri trengte å forlate nettverket.
På Dockup er det vanskelig å gjøre akkurat denne feilen, fordi tjenester adresserer hverandre med interne navn. En tjeneste når main-db.internal:5432, og en annen tjeneste nås via aliaset <slug>.internal – trafikk som forblir inne i workspace-nettverket, berører aldri en offentlig listener. Det er også derfor databasen ikke har et offentlig vertsnavn som standard: Det finnes ikke noe som ved et uhell kan rutes gjennom det.
Finn kilden i stedet for å gjette
Å gjette hvilken av de fire årsakene det er, koster deg en hel fakturaperiode. Mål i stedet:
Les access-loggen etter bytes, ikke antall forespørsler. Sorter de viktigste responsene etter totalt antall leverte bytes, ikke etter antall forespørsler. Endepunktet som sender mest data, er sjelden det som kalles oftest.
Sjekk de største statiske ressursene dine. Hvis noe over én megabyte leveres fra appen din, er det det første du bør flytte.
# 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
Se etter crawlere. En bot som oppfører seg dårlig og laster ned store filer gjentatte ganger, kan stå for mesteparten av en måneds egress på et nettsted med moderat menneskelig trafikk. robots.txt og en noindex på preview-miljøer er enkle tiltak.
Miljøene ingen tar med i beregningen
To vaner genererer egress som aldri dukker opp i noens mentale modell:
Preview-miljøer. Ett preview-miljø per pull request er genuint nyttig og multipliserer samtidig fotavtrykket ditt i det stille. Fem åpne PR-er betyr fem kopier av stacken din, hver med sin egen trafikk – ofte fra de samme crawlerne, fordi preview-URL-er blir indeksert hvis du ikke stopper dem.
Langvarig staging. Staging som har kjørt i åtte måneder, som ingen besøker, laster fortsatt ned images, blir fortsatt crawlet og kjører fortsatt cron-jobbene sine.
Ingen av delene er en grunn til å slutte å bruke dem. Begge er en grunn til å sette grenser: Utløp preview-miljøer når PR-en lukkes, og merk dem med noindex slik at søkemotorer slutter å laste dem ned på dine vegne.
dockup noindex my-project/my-api --on
Slik ser god kostnadsoversikt ut
Du bør kunne svare på tre spørsmål før fakturaen kommer:
- Hva kjører akkurat nå? Også det du har glemt.
- Hva brukte hver av dem? Fordelt på compute og dataoverføring, ikke som ett samlet tall.
- Hva skjer hvis forbruket øker kraftig? En grense som stopper tjenester, er ubehagelig. En grense som ikke finnes, er verre.
Dockup måler infrastruktur separat fra abonnementet, slik at abonnementsprisen ikke skjuler forbruket – og kreditten på 20 dollar i Pro-abonnementet trekkes fra dette forbruket i stedet for å være en rabatt på abonnementsprisen. Poenget er at du kan se hva som er hva.
Kort oppsummert
Flytt media til objektlagring. Angi cache-headere. Aktiver komprimering. Hold tjenester og databasene deres i samme region, og la dem kommunisere over det private nettverket i stedet for det offentlige internettet. Utløp preview-miljøer, og hold dem ute av søkeresultatene.
Disse fem vanene løser nesten alle overraskelser knyttet til båndbreddekostnader, og ingen av dem krever at du endrer hvor du hoster.
Vanlige spørsmål
Hva er egress?
Data som forlater infrastrukturen din på vei mot internett. Responser til brukere, nedlastede filer og API-payloads. Innkommende trafikk er vanligvis gratis; utgående trafikk er som regel ikke det.
Hvorfor er egressregningen min høyere enn compute-regningen?
Nesten alltid fordi applikasjonen leverer filer som hører hjemme på en CDN. Én stor ressurs på en populær side kan koste mer enn flere ukers håndtering av forespørsler.
Reduserer en CDN faktisk kostnadene?
Ja, når den cacher innholdet. Origin-serveren leverer filen én gang per edge i stedet for én gang per besøkende, og CDN-ens pris per gigabyte er vanligvis en brøkdel av prisen hos en applikasjonsplattform.
Koster preview-miljøer like mye som produksjon?
De koster det de bruker, noe som ofte er mer enn forventet fordi hvert miljø er en komplett kopi, og preview-URL-er blir crawlet hvis du ikke forhindrer det.
