Duomenų suspaudimo fizika: nuo Claude Shannon entropijos teorijos iki modernaus Brotli
1948 metais amerikiečių matematikas Claude Shannonas paskelbė epochinį veikalą „A Mathematical Theory of Communication“, padėjusį pamatą šiuolaikinei informacijos teorijai. Shannonas matematiškai įrodė, kad bet koks simbolinis informacijos šaltinis pasižymi fundamentaliu statistiniu pertekliumi – vadinamąja informacine entropija, žyminčia absoliučią teorinę ribą, žemiau kurios joks pranešimas negali būti suspaustas be duomenų praradimo. Šiuolaikiniame žiniatinklyje, kur HTML dokumentai, CSS stiliai, „JavaScript“ bibliotekos ir JSON duomenų srautai formuoja kritinį puslapio atvaizdavimo kelią (Critical Rendering Path), transliuoti nesuspaustus tekstinius failus yra tas pats, kas transportuoti sunkiasvorius konteinerius, pripildytus gryno oro.
Tekstiniai žiniatinklio resursai pasižymi milžiniška struktūrine redundancija: nuolat pasikartojančiomis HTML gairėmis, dešimtis tūkstančių kartų dubliuojamais CSS klasių pavadinimais, ilgais funkcijų kintamaisiais bei nuspėjamais tarpais. Beveik tris dešimtmečius interneto erdvėje viešpatavo DEFLATE algoritmas – Philo Katzo sukurtas hibridinis sprendimas, sujungęs LZ77 žodyninį atitikčių paieškos mechanizmą su Huffmano entropiniu kodavimu. Šis algoritmas tapo visuotiniu standartu per Gzip protokolą (RFC 1952). Gzip buvo nepretenzingas, universalus ir patikimas, tačiau jo architektūrinis 32 kilobaitų slenkančio lango (sliding window) limitas tapo akivaizdžiu butelio kakleliu, kai modernios svetainės iš lengvų hipertekstinių dokumentų išbujojo į kelių megabaitų apimties monolitinius skriptų paketus.
Brotli prieš Gzip: statinio žodyno magija ir kodėl sutaupoma dar 15–25% papildomų duomenų
2015 metais „Google“ inžinieriai Jyrki Alakuijala ir Zoltán Szabadka pristatė Brotli algoritmą (RFC 7932), pavadintą tradicinės šveicariškos bandelės Brötli vardu. Tai nebuvo tiesiog kosmetinis DEFLATE patobulinimas – Brotli atnešė esminį paradigminį lūžį duomenų glaudinimo matematikoje:
- Statinis iš anksto paruoštas žodynas: Skirtingai nei Gzip, kuris suspaudimo žodyną privalo kiekvieną kartą dinamiškai konstruoti nuo nulio iš analizuojamo failo sekų, Brotli viduje turi integruotą fiksuotą žodyną su daugiau nei 13 000 dažniausiai žiniatinklyje sutinkamų žodžių, HTML elementų (pvz.,
<div class="">,display: inline-block), populiarių „JavaScript“ funkcijų bei HTTP URI struktūrų. Dėl šios priežasties net ir maži failai suspaudžiami akimirksniu be pradinių istorinių nuorodų trūkumo. - Eksponentiškai išplėstas paieškos langas: Gzip slankusis langas ribojamas ties 32 KB. Tuo tarpu Brotli langas siekia net iki 16 megabaitų. Tai leidžia kompresoriui aptikti pasikartojančias kodo instrukcijas ir identiškus stilių blokus, atskirtus šimtais tūkstančių simbolių masyviuose kodo paketuose.
- Antrosios eilės kontekstinis modeliavimas: Brotli algoritmas vertina aplinkinių baitų kontekstą ir matematiškai tiksliai prognozuoja sekančius simbolius, pasiekdamas 15–25% didesnį suspaudimo tankį, palyginti su Gzip, išlaikant praktiškai identišką išpakavimo greitį lankytojo naršyklėje.
Nematoma nesuspausto turinio bausmė: kaip dideli failai lėtina mobiliuosius įrenginius ir prastina Core Web Vitals
Programuotojų bendruomenėje gajus paviršutiniškas mitas, kad duomenų suspaudimas tėra smulkmeniška mikrosekundžių optimizacija, aktuali tik ekstremaliems serverių administratoriams. Šviesolaidinio ryšio aplinkoje kompiuterio ekrane atsiųsti nesuspaustą 900 KB failą užtrunka vos 40–60 milisekundžių. Tačiau realiame pasaulyje, kur daugiau nei 65% lankytojų naršo per judriojo ryšio (LTE ir 5G) tinklus, fizikos dėsniai yra negailestingi.
Mobiliajame telefone duomenų siuntimą valdo radijo resursų kontrolės (RRC – Radio Resource Control) būsenų mašina. Kai siunčiamas sunkus, nesuspaustas failas, suskaidytas į dešimtis TCP paketų, telefono modemas priverstinai pervedamas į maksimalios galios energijos vartojimo režimą. Tai drastiškai eikvoja vartotojo bateriją ir didina paketų buferizacijos vėlinimą perpildytose ryšio bazinėse stotyse. Be to, „Google“ paieškos algoritmai vertina vartotojo patirties rodiklius – Core Web Vitals: Largest Contentful Paint (LCP), Interaction to Next Paint (INP) ir First Contentful Paint (FCP). Įjungus Brotli ir sumažinus siunčiamų duomenų svorį 70–85%, dokumentų pristatymo laikas sumažėja nuo 2,5 sekundės iki kelių šimtų milisekundžių, tiesiogiai lemdamas geresnes SEO pozicijas ir mažesnį vartotojų atmetimo rodiklį.
Kritinė Vary: Accept-Encoding antraštės svarba CDN ir naršyklės podėlio (cache) vientisumui
Serverio sukonfigūravimas generuoti suspaustą srautą tėra pusė sėkmingo darbo; lygiai taip pat svarbu užtikrinti, kad tarpiniai tinklo mazgai teisingai atskirtų skirtingus kodavimo formatus. Kai vartotojo naršyklė kreipiasi į serverį, ji siunčia HTTP antraštę Accept-Encoding: gzip, deflate, br, zstd, pranešdama, kokius algoritmus palaiko jos aparatinė įranga. Atsakydamas serveris privalo grąžinti ne tik suspaustus duomenis, bet ir aiškią Vary: Accept-Encoding antraštę.
Ši antraštė tarnauja kaip griežtas nurodymas turinio paskirstymo tinklams (CDN, tokiems kaip „Cloudflare“, „Fastly“ ar „CloudFront“), įmonių ugniasienėms ir tarpiniams proxy serveriams, kad šie talpykloje laikytų atskiras to paties URL adreso kopijas: vieną nesuspaustą, kitą supakuotą Gzip, o trečią – Brotli formatu. Jei ši antraštė pamirštama, agresyvus CDN podėlis gali išsaugoti Brotli suspaustą binarinį srautą ir per klaidą patiekti jį senesnei naršyklei ar paieškos botui, kuris tikėjosi paprasto teksto. Rezultatas – ekrane rodoma neperskaitomų hieroglifų ir binarinių šiukšlių makalynė.
Praktinis gidas: kaip per 1 minutę įjungti Brotli ir Gzip Apache ar Nginx serveryje
Šiuolaikinių suspaudimo mechanizmų įdiegimas reikalauja vos kelių konfigūracijos eilučių, tačiau suteikia ilgalaikį našumo postūmį. Rekomenduojame vadovautis šiomis gerosios praktikos gairėmis:
- Išnaudokite CDN kraštinius mazgus (Edge): Jei naudojate „Cloudflare“, Brotli aktyvuojamas vienu paspaudimu valdymo skyde (Speed → Optimization → Content Optimization → Brotli ON). Kraštinis tinklas pats atlieka derybas su klientu ir automatiškai grąžina Gzip senesnėms sistemoms.
- Sukonfigūruokite Apache serverį: Savo svetainės
.htaccessfaile aktyvuokitemod_brotlimodulį tekstiniams failams, o kaip atsarginį variantą nurodykitemod_deflate. Būtinai permod_headerspridėkiteHeader append Vary: Accept-Encoding. - Nustatykite Nginx direktyvas: Standartiniame
nginx.conffaile įjunkitegzip on; gzip_comp_level 6; gzip_vary on;. Jei jūsų Nginx sukompiliuotas sungx_brotlimoduliu, pridėkitebrotli on; brotli_comp_level 6;. Dinaminiam turiniui 5–6 suspaudimo lygis užtikrina tobulą kompromisą tarp procesoriaus (CPU) apkrovos ir failo dydžio. - Niekada nesuspauskite jau suspaustų binarinių failų: Griežtai ribokite suspaudimo taisykles tik tekstiniams MIME tipams (HTML, CSS, JS, JSON, XML, SVG). Bandymas suspausti JPEG, PNG, WebP, AVIF nuotraukas, WOFF2 šriftus ar ZIP archyvus tik beprasmiškai degina serverio elektros energiją ir netgi padidina galutinį failą dėl antraščių pertekliaus.
- Reguliariai tikrinkite būseną: Po kiekvieno serverio atnaujinimo ar CDN migracijos pasinaudokite TOOL GIGA Gzip ir Brotli suspaudimo tikrintuvu, kad įsitikintumėte, jog jūsų suspaudimo grandinė veikia nepriekaištingai.