Filtrează articolele

Tehnologie

Yandex deschide codul sursă pentru YaFF: un format de serializare zero-copy pentru Protobuf cu viteză aproape de cea a unei structuri C++

În lumea dezvoltării software, performanța și eficiența sunt mereu în centrul atenției, mai ales când vine vorba de serializarea datelor. Protobuf (Protocol Buffers) este unul dintre cele mai populare formate de serializare, folosit pe scară largă în sisteme distribuite, microservicii și aplicații care necesită schimb rapid de date. Însă, chiar și Protobuf are limitări, în special când vine vorba de citirea datelor fără a face copii inutile în memorie. Aici intervine YaFF (Yandex Fast Format), o soluție open-source lansată recent de Yandex, care promite să revoluționeze modul în care lucrăm cu Protobuf.

YaFF este un format de serializare „zero-copy” (fără copiere) pentru ecosistemul Protobuf. Ce înseamnă asta? În termeni simpli, atunci când citești date serializate, în mod normal trebuie să le decodifici și să creezi obiecte în memorie, ceea ce implică alocări și copii. YaFF elimină această etapă, permițând citirea directă a datelor din buffer, fără a le duplica. Rezultatul? Performanță aproape de cea a unei structuri native C++, cu un consum redus de CPU și memorie.

Yandex a păstrat fișierul .proto ca sursă unică de adevăr, ceea ce înseamnă că nu trebuie să schimbi definițiile mesajelor tale. Singura modificare este modul în care datele sunt stocate în memorie. Asta face ca integrarea să fie extrem de ușoară: poți folosi același .proto, iar YaFF se ocupă de restul.

Cele patru layout-uri ale YaFF



YaFF oferă patru moduri de organizare a datelor în memorie, fiecare optimizat pentru un anumit tip de utilizare:

1. Fixed Layout – pentru mesaje cu câmpuri fixe, unde structura este cunoscută dinainte. Este cel mai rapid, deoarece datele sunt stocate într-un mod care permite acces direct, ca la o structură C++.

2. Flat Layout – similar cu Fixed, dar permite și câmpuri opționale. Este ideal pentru majoritatea cazurilor de utilizare, oferind un echilibru între viteză și flexibilitate.

3. Sparse Layout – conceput pentru mesaje cu multe câmpuri goale sau opționale. În loc să aloce spațiu pentru toate câmpurile, YaFF stochează doar câmpurile prezente, economisind memorie.

4. Dynamic Layout – cel mai flexibil, potrivit pentru mesaje cu structură dinamică, unde câmpurile pot apărea sau dispărea în timpul execuției. Deși este mai lent decât celelalte, oferă cea mai mare adaptabilitate.

Benchmark-ul care impresionează



Yandex a publicat benchmark-uri care arată că Flat Layout citește datele de aproximativ 1,2 ori mai lent decât o structură C++ brută. Cu alte cuvinte, performanța este atât de apropiată încât diferența devine aproape neglijabilă în aplicațiile reale. În comparație cu Protobuf standard, YaFF poate fi de 2-3 ori mai rapid la citire, în funcție de scenariu.

Un exemplu concret vine din sistemul de recomandări publicitare al Yandex, unde YaFF a redus consumul de CPU cu 10-20% la scară de producție. Asta înseamnă economii semnificative de costuri și o latență mai mică pentru utilizatori.

Cum funcționează zero-copy?



În Protobuf clasic, când primești un mesaj serializat, trebuie să-l parsezi și să creezi un obiect în memorie. Acest proces implică alocări de memorie, copierea datelor și, adesea, conversii de tip. YaFF, pe de altă parte, păstrează datele într-un format binar care poate fi citit direct, fără a le muta. Practic, pointerii din codul tău pot accesa direct buffer-ul de intrare, ca și cum ar fi o structură C++.

Asta este posibil datorită unui design atent al layout-urilor, care aliniază datele la granițe naturale de memorie și evită padding-ul inutil. De asemenea, YaFF suportă câmpuri de tip string și bytes fără a le copia, ci doar referindu-se la ele.

Unde se potrivește YaFF?



YaFF nu este un înlocuitor universal pentru Protobuf. El este optimizat pentru scenarii în care viteza de citire este critică și unde datele sunt citite frecvent, dar scrise rar. De exemplu:

  • Sisteme de recomandări (ca în cazul Yandex)

  • Baze de date în memorie

  • Cache-uri distribuite

  • Aplicații de tip streaming

  • Microservicii cu trafic intens


  • În schimb, pentru aplicații unde datele sunt scrise des sau unde flexibilitatea maximă este necesară, Protobuf standard poate fi încă alegerea mai bună.

    Impactul în comunitatea open-source



    Yandex a publicat YaFF sub o licență permisivă, ceea ce înseamnă că oricine poate să-l folosească, să-l modifice și să-l integreze în propriile proiecte. Acest lucru este important deoarece aduce inovația dintr-un gigant tech la îndemâna dezvoltatorilor mici și mijlocii.

    De asemenea, YaFF este construit pe baza Protobuf, ceea ce înseamnă că poate fi folosit alături de instrumentele existente: generatoare de cod, validatoare de schemă etc. Nu trebuie să renunți la ecosistemul Protobuf pentru a beneficia de performanța YaFF.

    Concluzie



    YaFF reprezintă un pas important în evoluția serializării datelor. Prin eliminarea copierii inutile și oferind layout-uri specializate, Yandex a reușit să creeze un format care se apropie de viteza structurilor native C++, păstrând în același timp compatibilitatea cu Protobuf. Pentru echipele care se confruntă cu probleme de performanță la citirea datelor serializate, YaFF poate fi soluția mult așteptată.

    De ce este important:


    YaFF nu este doar o altă bibliotecă de serializare. Este o demonstrație că se poate obține performanță aproape de nivelul limbajului nativ fără a sacrifica flexibilitatea sau a complica dezvoltarea. Într-o eră în care fiecare milisecundă contează, iar costurile de CPU se adună rapid la scară, un format zero-copy poate face diferența între un sistem care abia face față și unul care rulează eficient. Mai mult, deschiderea codului sursă de către Yandec încurajează inovația și colaborarea în comunitatea open-source, permițând altor companii și dezvoltatori să adopte și să îmbunătățească această tehnologie.

    Acest site folosește cookie-uri pentru a-ți oferi o experiență de navigare cât mai plăcută. Continuarea navigării implică acceptarea acestora.