Kui töötad arendusmaailmas, oled kindlasti kokku puutunud igivana dilemmaga, kuidas andmeid ühest kohast teise liigutada ilma võrku kokku jooksmata. Aastaid on JSON oma lihtsuse tõttu olnud vaieldamatu kuningas, kuid rakenduste kasvades ja liikluse hüppeliselt kasvades hakkame märkama, et lihtteksti saatmine on märkimisväärne jõudluse kitsaskoht.
Siin tulebki mängu Protobuf, Google'i loodud tööriist , mis tagab sisuliselt andmete palju kompaktsema ja kiirema liikumise. See pole lihtsalt alternatiiv; see on märkimisväärne hüpe efektiivsuses neile, kes soovivad oma infrastruktuurist iga baidi välja pigistada, eriti mikroteenuste keskkondades või mobiilirakendustes, kus iga millisekund loeb.
Mis täpselt on protokollipuhvrid ja kuidas need toimivad?
Sisuliselt on Protocol Buffers struktureeritud andmete serialiseerimismehhanism, mis on täiesti keele- ja platvormineutraalne. Erinevalt tekstipõhistest vormingutest kasutab Protobuf binaarset kodeeringut , mis tähendab, et andmeid ei salvestata loetavate sõnadena, vaid optimeeritud baitjärjestusena.
Selleks, et see toimiks, peame kõigepealt defineerima oma andmestruktuuri failis laiendiga .proto. Selles dokumendis kasutame liidese definitsioonikeelt (IDL), kus määrame sõnumid ja nende väljad. Igal väljal on nimi, andmetüüp ja mis kõige tähtsam, unikaalne sildinumber . See number võimaldab süsteemil teada, milliseid andmeid ta loeb, ilma et peaks igas sõnumis väljanime kordama, mis JSON-is juhtub ja võtab palju ruumi.
Jõudluse võrdlus: Protobuf vs. JSON ja FlatBuffers
Kui asju skaalale asetada, on vahe hämmastav. Kui võrrelda Protobufi klassikalise JSON-iga, siis esimene võidab serialiseerimise ja deserialiseerimise kiiruses kindlalt. Tegelikult on võimalik töötlemisaega vähendada kuni 80% ja lõpptulemuse suurust sarnases proportsioonis, alati olenevalt andmete olemusest.
- JSON: See on inimestele kõige mugavam ja loetavam variant, ideaalne vigade kiireks parandamiseks, kuid oma tekstipõhise olemuse tõttu aeglane ja tülikas.
- Protokolli puhvrid: See tasakaalustab kasutusmugavust ja jõhkrat jõudlust. See on standardvalik neile, kes kasutavad gRPC-d ja vajavad sujuvat serveritevahelist suhtlust.
- FlatBuffers: Mälu optimeerimise osas on see vanem vend. Selle suurim eelis on... "nullkoopia"See tähendab, et andmetele pääsete juurde ilma neid mälus täielikult deserialiseerimata, mistõttu on see eelistatud valik nõudlike videomängude ja rakenduste jaoks.
Salvestusruumi osas on Protobuf tavaliselt kompaktsem kui FlatBuffers, kuna see kasutab täisarvude esitamise tehnikat, mis hõivab ainult arvu väärtusele vastavalt rangelt vajaliku ruumi .
Rakendamine ja praktiline kasutamine
Protobufi käivitamiseks kasutatakse tavaliselt Google'i kompilaatorit, et genereerida andmetele juurdepääsu klassid teie eelistatud keeles, olgu selleks Java, C++, Python või Node.js. Need klassid sisaldavad juba vajalikke meetodeid andmete täitmiseks, serialiseerimiseks ja deserialiseerimiseks ilma probleemideta.
Siiski on .NET ökosüsteemis implementatsioone nagu protobuf-net, mis pakuvad lühemat lähenemist. .proto-failidega tegelemise asemel saate oma C# klassides otse kasutada dekoraatori atribuute nagu ProtoContract ja ProtoMember . See lihtsustab töövoogu, määrates sildid otse koodis, säilitades samal ajal binaarvormingu tõhususe.
Väljatüübid ja versioonid
Selle evolutsiooni käigus on tekkinud erinevaid versioone. Kõige uuem, proto3, on algse proto2 lihtsustatud ja optimeeritud versioon, mis on loodud koondamiste kõrvaldamiseks ja ühilduvuse parandamiseks. Nende skeemide piires saame hallata mitmesuguseid modifikaatoreid:
- nõutav: See näitab, et väli on kohustuslik; kui see puudub, loetakse teade initsialiseerimata.
- Valikuline: Võimaldab välja olemasolu või puudumist, määrates vaikimisi väärtuse, kui seda pole esitatud.
- Kordunud: Ideaalne loendite või kogumite jaoks, võimaldades välja kuvada mis tahes arv kordi.
Lisaks põhitüüpidele nagu string, int32, float või bool võimaldab Protobuf luua keerulisi hierarhiaid sõnumipesastamise ja enumite kasutamise abil, muutes selle äärmiselt paindlikuks keerukate ärivaldkondade modelleerimiseks.
Kasutusjuhud ja võrguarhitektuur
Selle tehnoloogia kõige levinum rakendus on gRPC raamistik. See kaugprotseduurikutse (RPC) süsteem kasutab vahetuskeelena Protobufi, mis võimaldab rakendusel kutsuda funktsioone teisel masinal nii, nagu oleksid nad samas protsessis. See on oluline, et muuta mikroteenuste vaheline suhtlus peaaegu koheseks.
Sellistes sektorites nagu finantskaubandus kasutatakse spetsiifilisi sõnumistruktuure. Näiteks saab defineerida päringu- (Req), vastuse- (Res), sündmuse- (Event) ja mudelisõnumeid. Võrgu killustatuse haldamiseks pakitakse kasulik koormus tavaliselt konteinersõnumisse (ProtoMessage) , mis sisaldab kasuliku koormuse tüüpi ja sõnumi ID-d, tagades, et vastuvõtja teab täpselt, kuidas vastuvõetud baite tõlgendada.
Võimalus optimeerida serialiseerimist pointeri taaskasutamise või stringi normaliseerimise abil võib kaasa tuua äärmise ruumi kokkuhoiu. Reaalsetes olukordades on näidatud, et üleminek standardvormingult FlatBuffersi või Protobufiga optimeeritud vormingule vähendab teenuse koormust 60 sekundilt vaid 3 või 4 sekundile , kõrvaldades kriitilised kitsaskohad.