- A hozzászóláshoz be kell jelentkezni
- 1164 megtekintés
Hozzászólások
Protobufról szól az életem, az egész világot fel lehet vele építeni :)
- A hozzászóláshoz be kell jelentkezni
Még csak most kezdtem tanulni :)
- A hozzászóláshoz be kell jelentkezni
Belsős interfészeknél és standard folyamatok esetén rendben lehet a protobuf, de én nagyon örülök, hogy vannak önleíró szabványok mint az XML és a JSON. Ha sokat kell dolgoznod majd ezerféle partnerrel, akkor megérted 😉
- A hozzászóláshoz be kell jelentkezni
Mit értesz önleíró alatt? Mert pont a protobuf az, ahol ott a struktúra leírása, ellenben a json / xml párossal, ahol ehhez kell valami külön schema. Vagy azt érted "ön" alatt, hogy az üzenet példányból lehet tippelgetni, mit jelent?
- A hozzászóláshoz be kell jelentkezni
ez egesz addig jo, amig elore meg vannak tervezve a protobuf mezok. aztan ha az evolucio szerint kell meg bele folyamatosan 3-4 uj mezo, 5-8 iteracioban, es meg valami rendet is akarsz tartani a mezoneveknel akkor lesznek az ilyen gnom strukturak:
message Person {
string name = 1;
int32 id = 2;
string email = 3;
string foo = 6
bool bar = 8;
int32 baz = 7;
int32 age = 5;
}
es ha nem csak 8 mezo van hanem 20, akkor goodluck az indexeleshez.
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
- A hozzászóláshoz be kell jelentkezni
Egyrészt nem nagyon értem a példát, másrészt azt végképp nem, hogy mi köze ahhoz, amit mondtam?
- A hozzászóláshoz be kell jelentkezni
A protobuf kifejezetten jól támogatja az evolúciót, nagy hangsúlyt fektettek arra, hogy könnyen lehessen a kompatibilitás elrontása nélkül változtatni a sémát.
Mitől gnóm ez a struktúra? Miért ne lenne rend a mezőneveknél? Mit értesz indexelés alatt?
- A hozzászóláshoz be kell jelentkezni
tegyukfel hogy az elejen van egy egyszeru struktura:
message Person {
string name = 1;
int32 id = 2;
string email = 3;
}
ezzel szepen elbeszelteg, A, B, C, D, E progi egymassal.
aztan jon az igeny hogy be kene rakni az evet hogy A azt is elkuldje B-nek, de a D es E nem erintett, de amugy se lehet frissiteni!
ha jol olvastam a protobuf par megkotessel enged ilyet, csak az uj mezonek uj indexe (tag-nek hivja a protobuf) legyen:
message Person {
string name = 1;
int32 id = 2;
string email = 3;
int32 age = 5;
}
Aztan jon hogy a C proginak uj mezokre van szuksege, ezert kapott megint uj mezot valahol a kozepebe hogy emberileg is olvashato legyen:
message Person {
string name = 1;
int32 id = 2;
string email = 3;
string foo = 6
bool bar = 8;
int32 baz = 7;
int32 age = 5;
}
stbstb.
aztan ezt lasd at hogy most hanyadik indexnel tartunk.
nyilvan jo lenne ha az elejen latnak az osszes mezot, de tudjuk hogy _mindig_ utkozben jonnek az igenyek.
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
- A hozzászóláshoz be kell jelentkezni
De ez miért probléma? Nem engedi kétszer használni ugyanazt a számot. Nem olyan nehéz kitalálni, mi legyen a következő.
- A hozzászóláshoz be kell jelentkezni
Komolyan ez fáj? Mármint egyrészt ennek az alternatívája json földén kb a
- /api/vN/, amit rendes kiscserkész módjára upgradelsz minden változásnál
- leszarás, van benne valami, IJ van a kliensnek, ha nem tetszik
De ha tényleg fáj, akkor már ezer éve elég hosszan ki lehet bírni, ha mondjuk százas távolságra teszed az idket, aztán felezve szúrsz be. Vagy csak hagysz egy kommentet a tetején, hogy # next-id=123.
- A hozzászóláshoz be kell jelentkezni
Amúgy mi is használjuk a next ID kommentet, van rá IDE+linter támogatás. De ritka az olyan több oldalas protobuf, ahol pár másodpercnél tovább tartana átnézni az összes mezőt.
- A hozzászóláshoz be kell jelentkezni
most csak a protobufrol beszelek (nem a gprc-rol), de csak azt az elonyt latom hogy a parsert nem neked kell megirni hanem pb generalja. jah meg kisebb lesz a message, mert a mezoneveket nemkell atvinni! :D
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!
- A hozzászóláshoz be kell jelentkezni
Bocsánat, én ezt az inkoherens izét nem nagyon tudom követni, ami történik.
- A hozzászóláshoz be kell jelentkezni
XML-ből láttam már olyat (fontos állami szervtől kaptuk), ahol escape nélkül szerepelt & a cégek nevében. Nyilvánvaló, hogy ők stringként rakták össze, nekünk meg stringként kellett beolvasni, mert a parser eldobta tőle az agyát. XSLT és XSD segítségével tudna egy-két jó dolgot az XML, de nekem nem hiányzik egyik se.
JSON: ez még rosszabb, mint az XML, mert (amennyire én ismerem) sokkal kevésbé támogatja az erősen típusos adatokat és kódgenerátorokat.
Az ilyen formátumú RPC-ktől pedig PTSD-m van, hiába raktunk össze szabványos (-nak tűnő) szolgáltatásokat WCF-fel, mindig voltak kompatibilitási problémák más partnerekkel, főleg ha titkosítás is szóba került.
A protobuffal *semmi* ilyen probléma nincs. Erősen típusos, gyárilag ad kódgenerátort minden nyelvhez, RPC a szabvány szerves része, és bináris formátum, ami nem csak azért jó, mert spórol a sávszélességgel, de idióta emberek meg sem próbálják kézzel írni/olvasni.
- A hozzászóláshoz be kell jelentkezni
Ezek egyike sem szabvány sajnos, az XML annyiból jobb, hogy ha használsz sémát, azt géppel egyértelműen lehet validálni.
JSON esetén már választanod kell hogy egyáltalán követsz e séma rendszert, szerencsére a JSON schema és az OpenAPI összebútoroztak, így ha az utóbbi v3 újabb verzióit használod, már egészen jól validálható és generálható dolgot kapsz. Aztán jön a pofon, hogy ja a fejlesztő kedvenc framework-je még csak a v2-t támogatja, a generált kód nem tetszik neki, ezért eltöri a generálhatóságot, így onnantól az API dokumentáció és működés elválik egymástól, vagy legalábbis az API first átmegy code first-be.
A protobuf legalább kikényszerít külső séma leírót.
A protobuf meglepő módon az XML időszak kedvenc hibáját teszi szinte magától értetődővé, könnyű kivezetni az API-ra a belső implementációs részleteket, ami ugye antipattern. JSON esetében ez kicsit nehezebb, bár ott sem kell azért küzdeni érte.
Lényeg, hogy mindhárom jó cucc, de másban erős. XML-t bitagyúak szemmel is tudnak olvasni, de a kötött struktúra miatt géppel biztosan kiderül ha problémás. JSON-t bárki tud olvasni, cserében géppel csak annyira tudod ellenőrizni, amennyire az író megszorította a sémát (lásd egy boolean is valójában string benne), emiatt lassú a serialize/deserialize művelet. Grpc baromi gyors, de azt szemmel tuti nem debug-olod.
- A hozzászóláshoz be kell jelentkezni
> A protobuf meglepő módon az XML időszak kedvenc hibáját teszi szinte magától értetődővé, könnyű kivezetni az API-ra a belső implementációs részleteket, ami ugye antipattern.
Vannak erre patternek, pl.: https://protobuf.dev/programming-guides/api/#use-different-messages - és hasonló módon különböző API rétegekben különböző sémákat érdemes használni. A legkülső rétegben egy proto<->JSON konverzió is elfér.
> Grpc baromi gyors, de azt szemmel tuti nem debug-olod.
Nagy ritkán, ha biteket akarsz nézegetni, a CyberChef segít neked a kódolásban. Egyébként a protobuf olyan API-t ad, hogy rossz sémával vagy séma nélkül is tudod dekódolni, és nézegetni a kedvenc debuggeredben, hogy mi jött át. De mivel olyan kötött a sémája, még erre is ritkán van szükség. Szóval szerintem ilyen szempontból ez nem hátrány a szöveg alapú formátumokkal ellentétben. (Ja, amúgy protobufot is lehet szövegként szerializálni. Mi pl. szoktunk így konfig fájlokat írni.)
- A hozzászóláshoz be kell jelentkezni