Ako radite u svijetu razvoja, sigurno ste se susreli s vječnom dilemom kako premjestiti podatke s jednog mjesta na drugo bez rušenja mreže. Godinama je JSON bio neosporni kralj zbog svoje jednostavnosti, ali kako aplikacije rastu, a promet vrtoglavo raste, počinjemo primjećivati da Slanje običnog teksta je teret prilično težak za izvedbu.
Tu nastupa Protobuf, alat koji je stvorio Google što u osnovi osigurava da informacije putuju na mnogo kompaktniji i brži način. To nije samo alternativa, to je kvalitativni skok u učinkovitosti Za one koji žele iscijediti svaki bajt iz svoje infrastrukture, posebno u mikroservisnim okruženjima ili mobilnim aplikacijama gdje je svaka milisekunda važna.
Što su točno Protocol Bufferi i kako funkcioniraju?
U biti, Protocol Buffers je strukturirani mehanizam serijalizacije podataka koji je potpuno jezično i platformski neutralan. Za razliku od tekstualnih formata, Protobuf koristi binarno kodiranjeTo znači da se podaci ne pohranjuju kao čitljive riječi, već kao optimizirani niz bajtova.
Da bi ovo funkcioniralo, prvo moramo definirati našu strukturu podataka u datoteci s ekstenzijom .proto. U ovom dokumentu koristimo jezik za definiranje sučelja (IDL) gdje specificiramo poruke i njihova polja. Svako polje ima naziv, tip podataka i, što je najvažnije, jedinstveni broj oznakeOvaj broj omogućuje sustavu da zna koje podatke čita bez potrebe za ponavljanjem naziva polja u svakoj poruci, što se događa u JSON-u i troši puno prostora.
Usporedba performansi: Protobuf vs. JSON i FlatBuffers
Kad stvari stavimo na vagu, razlika je nevjerojatna. Ako usporedimo Protobuf s klasičnim JSON-om, prvi daleko pobjeđuje u brzini serijalizacije i deserijalizacije. Zapravo, moguće je. smanjite vrijeme obrade do 80% i veličinu konačnog rezultata u sličnom omjeru, uvijek ovisno o prirodi podataka.
- JSON: To je najpraktičnija i najčitljivija opcija za ljude, idealna za brzo otklanjanje pogrešaka, ali je spora i nezgrapna zbog svoje tekstualne prirode.
- Protokolni međuspremnici: Usklađuje jednostavnost korištenja s brutalnim performansama. Standardni je izbor za one koji koriste gRPC i kojima je potrebna besprijekorna komunikacija između poslužitelja.
- Ravni međuspremnici: To je stariji brat u smislu optimizacije memorije. Njegova najveća prednost je... "nulta kopija"To znači da možete pristupiti podacima bez potrebe za njihovom potpunom deserijalizacijom u memoriji, što ga čini preferiranom opcijom za zahtjevne videoigre i aplikacije.
Što se tiče pohrane, Protobuf je obično kompaktniji od FlatBuffersa jer koristi tehniku cijelobrojnog predstavljanja koja Zauzima samo prostor koji je strogo potreban. prema vrijednosti broja.
Implementacija i praktična upotreba
Za pokretanje Protobufa, uobičajeni pristup je korištenje Googleovog kompajlera za generiranje klasa za pristup podacima u vašem željenom jeziku, bilo da se radi o Javi, C++, Pythonu ili Node.jsu. Ove klase već dolaze s potrebnim metodama za popuniti, serijalizirati i deserializirati Informacije bez komplikacija.
Međutim, postoje implementacije poput protobuf-net u .NET ekosustavu koje omogućuju kraći put. Umjesto muke s .proto datotekama, možete koristiti atributi dekoratora kao što su ProtoContract i ProtoMember izravno u C# klasama. To pojednostavljuje tijek rada dodjeljivanjem oznaka izravno u kodu, a istovremeno održava učinkovitost binarnog formata.
Vrste i verzije polja
Tijekom njegove evolucije pojavile su se različite verzije. Najnovija, proto3 je pojednostavljena verzija i optimiziran iz izvornog proto2, dizajniran za uklanjanje redundancija i poboljšanje kompatibilnosti. Unutar ovih shema možemo obraditi različite modifikatore:
- Potreban: Označava da je polje obavezno; ako nedostaje, poruka se smatra neinicijaliziranom.
- Izborni: Omogućuje da polje bude prisutno ili ne, dodjeljujući zadanu vrijednost ako nije navedena.
- Ponavljano: Idealno za popise ili kolekcije, što omogućuje da se polje pojavi neograničen broj puta.
Uz osnovne tipove poput stringa, int32, float ili bool, Protobuf vam omogućuje stvaranje složene hijerarhije putem ugniježđivanja poruka i korištenja nabrajanja (enuma), što ga čini izuzetno fleksibilnim za modeliranje složenih poslovnih domena.
Primjeri upotrebe i mrežna arhitektura
Najčešća primjena ove tehnologije nalazi se u gRPC okviru. Ovaj sustav udaljenog pozivanja procedura (RPC) koristi Protobuf kao jezik za razmjenu, omogućujući aplikaciji pozivanje funkcija na drugom računalu kao da su u istom procesu. To je temeljno za komunikacija između mikroservisa biti gotovo trenutan.
U sektorima poput financijskog trgovanja koriste se specifične strukture poruka. Na primjer, mogu se definirati poruke zahtjeva (Req), odgovora (Res), događaja (Event) i modela. Za upravljanje fragmentacijom mreže, korisni teret često je omotan u poruka spremnika (ProtoMessage) što uključuje vrstu korisnog tereta i ID poruke, osiguravajući da prijemnik točno zna kako interpretirati primljene bajtove.
Mogućnost optimizacije serijalizacije putem ponovne upotrebe pokazivača ili normalizacije stringova može dovesti do ekstremnih ušteda prostora. U stvarnim scenarijima, pokazalo se da prelazak sa standardnog formata na onaj optimiziran FlatBuffersima ili Protobufom smanjuje opterećenje usluge. 60 sekundi do samo 3 ili 4 sekunde, uklanjajući kritična uska grla.