Snilld

Yandex open-sourcer YaFF: zero‑copy Protobuf med nær struct‑hastighed

Yandex har frigivet YaFF som open source under Apache 2.0. Formatet er en C++‑implementeret, zero‑copy wire‑repræsentation for Protobuf, hvor .proto forbliver den autoritative kilde, mens kun det fysiske memory‑layout skifter. Ifølge Yandex læser YaFFs Flat‑layout hot data ca. 3,8× hurtigere end FlatBuffers og inden for ca. 1,2× af rå C++‑struct, og har givet 10–20% CPU‑besparelse i deres annonceringssystem. Lovende for AI‑infrastruktur og lav‑latens serving—men kræver nøgtern PoC og skarpe målinger, før gevinster kan bogføres.

21. juni 2026 Peter Munkholm

YaFF er et alternativt wire‑format for Protobuf‑skemaer, implementeret i C++ og udgivet som v0.1.0 under Apache 2.0. Skemaerne i .proto forbliver styrende; det er den fysiske repræsentation i hukommelsen, der ændrer sig. Ifølge Yandex muliggør det zero‑copy reads og skærer parse‑tid i mange backends—relevant i AI‑pipelines, hvor p95 og p99 er styrende for kapacitet og omkostninger.

Hvad Yandex faktisk har udgivet

Yandex beskriver YaFF (Yet another Flat Format) som open source under Apache 2.0 og p.t. skrevet i C++. Versionen er v0.1.0. YaFF erstatter Protobufs wire‑format, ikke Protobuf som schema og værktøjsøkosystem. .proto forbliver single source of truth, mens memory‑layoutet afhænger af valgt strategi. Det er Yandex’ egne udsagn fra den offentlige meddelelse.

Der loves tovejskonvertering mellem YaFF og almindelige Protobuf‑meddelelser for gradvis adoption: flyt enkelte hot paths til YaFF og konverter ved grænserne, mens resten fortsætter på standard Protobuf. Det passer med eksisterende værktøjskæder baseret på protoc, linters, CI og test.

Makro af poleret metalstribe med parallelle spor og cyan/green markører som metafor for hukommelseslayout og hurtig læsesti.

Hvordan YaFF virker teknisk

Kernen er zero‑copy læsninger: feltværdier ligger i en buffer i et layout, der kan aflæses direkte uden parse‑fase, når skemaet tillader det. Der skelnes mellem skema og fysisk hukommelseslayout. API’et ligner en genereret proto‑lignende C++‑grænseflade, men under motorhjelmen hentes felter direkte fra bufferen.

Banner

Yandex beskriver fire layouts, der balancerer skemaevolution og hastighed: Fixed, Flat, Sparse og Dynamic. Fixed er tæt pakket som en struct uden header og forudsætter frosset skema. Flat tilføjer en lille header og begrænset skemaevolution, men holder branch‑count og læsedybde lav. Sparse bruger en metatabel til spredte felter for friere evolution til gengæld for flere reads og grene. Dynamic er standard og vælger Flat eller Sparse ved kørselstid afhængigt af skemaets behov. I praksis kan en skemaændring dermed flytte performanceprofilen mellem klasser.

Yandexs performancepåstande

I Yandex’ egne benchmarks læser Flat‑layout hot data ca. 3,8× hurtigere end FlatBuffers og ca. 22× hurtigere end Protobuf i et bestemt hierarkisk scenarie. Samtidig ligger læsehastigheden inden for ca. 1,2× af en rå C++‑struct. Testene rapporteres som median nanosekunder pr. læs på en AMD EPYC 7713, kompileret med Clang 20.1.8 og kørt med google\/benchmark i Release. Tallene er Yandex’ egne og bør læses med det forbehold.

Hvor det betyder noget i praksis

Hvis læsefordelen holder, er oplagte gevinster i AI‑stakken: model serving, low‑latency feature lookup og streaming‑gateways, hvor Protobuf‑parsing ofte ligger i hot loops. Her prioriteres p95\/p99, og en kortere parse‑sti kan frigive CPU til throughput eller reducere omkostninger.

Mål på: end‑to‑end latency (median og p95\/p99), CPU pr. request og pr. node, memory footprint (peak under load), allocation‑mønstre og cache‑adfærd (via fx perf eller eBPF). Med bindings i spil bør man også følge GC\/allocator‑interaktion. Det afgør, om man henter få eller tocifrede procenter.

Operationsstaging med to rækker af plastikmarkører i bevægelse som metafor for throughput og latency i et PoC-testsetup.

Implementerings- og integrationsudfordringer

Tovejskonvertering hjælper adoption, men koster i grænserne; den overhead skal måles. Skemaevolution kan skubbe layoutvalg fra Flat til Sparse og ændre læseomkostninger—governance om feltændringer bliver vigtigere. Build og tooling er et reelt spørgsmål: v0.1.0 er C++‑centreret, så polyglotte miljøer får brug for wrappers eller konverteringslag. Observability og debugging ændrer sig også: færre parse‑trin, men større afhængighed af memory‑layout. Hvad ender i crash dumps, og hvordan inspiceres buffers menneskeligt? Det er ikke udfoldet i det offentlige materiale.

Risici og begrænsninger

Mangler: uafhængige benchmarks på andre CPU‑arkitekturer og med ikke‑Yandex‑workloads; dokumenteret multi‑language support (v0.1.0 nævner kun C++); erfaringer med corner cases ved skemaevolution; debug‑oplevelse og værktøjer; samt sikkerhed og validering af malformerede payloads i et direkte memory‑layout. De emner er ikke behandlet i det offentlige materiale og kræver yderligere test.

Banner

Hvordan teams bør validere YaFF

Kør en fokuseret PoC på en læsetung hot path. Definér succeskriterier—fx ≥10% CPU‑reduktion i p95, uændret fejlrates og ingen regressions i end‑to‑end KPI’er. Hold baseline stabil og mål både med syntetiske tests og replay af rigtige trafikspor.

Byg en test‑suite, der dækker skemaevolution, fejlindsprøjtning og boundary cases. Instrumentér med wall‑clock, cycles per op, cache miss rate og allocator‑events. A\/B i staging og derefter forsigtig canary i produktion, hvis signalerne er klare.

Makro af poleret metalstribe med parallelle spor og cyan/green markører som metafor for hukommelseslayout og hurtig læsesti.

Konkrete målepunkter i PoC

  • p50, p95 og p99 latency for endpoint eller pipeline—både end‑to‑end og lokalt omkring parsing
  • CPU pr. request og total CPU i peak—før og efter
  • RSS og peak memory samt allocation rate og fragmentering
  • Fejlmode ved malformed input—valideringstid og error propagation
  • Stabilitet ved skemaevolution og migrationsplaner

    Konsekvenser for leverandører og open source‑landskabet

    FlatBuffers og Cap’n Proto leverer også zero‑copy, men kræver egne IDL’er og toolchains. Det giver ofte dobbelt skema‑vedligehold og manuelle konverteringer. YaFFs påstand er at bevare Protobuf‑semantik og API‑lignende ergonomi og blot udskifte det fysiske layout. Hvis det holder, kan valget tippe mod at blive på Protobuf‑skemaer og kun skifte wire‑format på udvalgte hot paths. På kort sigt kræver det dog sprogbindings, dokumenteret tooling og uafhængige benchmarks. På mellemlang sigt kan det presse FlatBuffers og Cap’n Proto dér, hvor Protobuf allerede er governance‑kernen.

    Konklusion og anbefaling

    YaFF er teknisk interessant: open source, Apache 2.0, Protobuf‑kompatibelt fokus på server‑side performance. De rapporterede gevinster er store nok til at retfærdiggøre en målrettet PoC på de varmeste stier i AI‑platforme og realtidsdatapipelines. Det er samtidig v0.1.0 og C++‑centreret med åbne spørgsmål om sprogstøtte, debug og sikkerhed. Anbefalingen er enkel: test hurtigt og disciplineret. Hvis profilerne flytter sig markant, så gå videre; hvis ikke, så luk ned og brug tiden andetsteds.

    Bagerst: Kilder og reproducérbarhed

    Alle tekniske påstande om YaFF—licens, sprog, version, layouts, tovejskonvertering, benchmarks og produktionserfaring—stammer fra Yandex’ offentlige materiale og den refererede artikel. Benchmark‑setup ifølge Yandex: AMD EPYC 7713, Clang 20.1.8 og google\/benchmark i Release. Alle performance‑tal her er Yandex’ egne og bør reproduceres i egne miljøer. Indhent gerne direkte repo‑link fra Yandex for reproducerbarhed og kør deres benchmark‑suite på jeres egne workloads.

    • Yandex’ annoncering af YaFF med tekniske detaljer og benchmarks, MarkTechPost gengivelse
    • YaFF benchmarkdokumentation med adgangstider og testopsætning

Kilder

    Gør brugeroplevelsen bedre.
    Hvilket firma arbejder du for?