Yandex Lança YaFF: Formato Wire Zero-Copy para Protobuf com Leitura 22× Mais Rápida

Yandex YaFF

A Yandex acaba de abrir o código do YaFF (Yet another Flat Format), um formato wire zero-copy para o ecossistema Protobuf. Com licença Apache 2.0 e implementação inicial em C++ (v0.1.0), o YaFF promete leituras até 22× mais rápidas que o Protobuf tradicional e 3,8× mais rápidas que o FlatBuffers.

O problema que o YaFF resolve

Em backends de alta carga, o parsing de Protobuf pode consumir dois dígitos percentuais de CPU — o que, em escala, se traduz em milhares de núcleos físicos. A alternativa zero-copy mais comum é o FlatBuffers (também do Google), mas ele não é um substituto direto para Protobuf: exige manutenção de um schema separado e uma camada de conversão adicional.

O YaFF ataca exatamente essa lacuna: leituras zero-copy preservando a semântica do Protobuf. O arquivo .proto continua sendo a fonte única da verdade — o formato muda apenas como os dados são organizados na memória.

Como funcionam os layouts

O YaFF oferece quatro layouts que determinam como a mensagem é armazenada no buffer:

  • Fixed: struct empacotada simples, sem header e schema congelado. Ideal para primitivas pequenas inline.
  • Flat: adiciona um header de 2 bytes e suporta evolução de schema. Melhor para dados densos em caminhos quentes.
  • Sparse: acessa campos via tabela de metadados (6 bytes de overhead), adequado para schemas esparsos com evolução livre.
  • Dynamic (padrão): seleciona Flat ou Sparse em tempo de execução, usando Flat enquanto o schema permitir.

Benchmarks impressionantes

A Yandex publicou benchmarks reproduzíveis em um AMD EPYC 7713 com Clang 20.1.8. Os números mostram nanossegundos medianos por leitura:

Formato Tempo de leitura (ns) Lentidão vs struct C++
Struct C++ pura 8,14 1,0×
YaFF Flat Layout 9,79 1,2×
YaFF Sparse Layout 21,23 2,6×
FlatBuffers 37,30 4,6×
Protobuf 219,35 26,9×

O YaFF Flat Layout fica a apenas 1,2× da struct C++ pura — um feito notável para um formato que mantém compatibilidade com Protobuf.

Caso de uso real: economia de 10-20% de CPU

O YaFF já roda no sistema de recomendação de anúncios da Yandex, onde reporta economia de 10 a 20% de CPU em escala de produção. A adoção é incremental: basta introduzi-lo em um caminho quente, mantendo a conversão bidirecional com Protobuf nas bordas.

O código em ação

#include "feed.pb.h"   // gerado pelo protoc
#include "feed.yaff.h"  // gerado pelo yaff_generate()

// 1. Serializa uma mensagem Protobuf existente para buffer YaFF
feed::FeedResponse proto = LoadFeedResponse();
const auto buffer = yaff::Serialize<protoyaff::feed::FeedResponse>(proto);

// 2. Lê campos diretamente do buffer — sem parsing
const auto& response = yaff::ReadMessage<protoyaff::feed::FeedResponse>(buffer.Data());
for (const auto& item : response.items()) {
    std::string_view title = item.title();
    std::string_view author = item.author().name();
}

// 3. Converte de volta para Protobuf quando necessário
feed::FeedResponse restored;
response.ParseTo(restored);

Disponibilidade

O YaFF está disponível no GitHub com documentação completa em yaff.tech. A integração é feita via CMake (find_package) ou Conan. A geração de código utiliza protobuf_generate() seguido de yaff_generate(), com os tipos gerados no namespace protoyaff::<package>.


Fonte: MarkTechPost | Repositório: GitHub

Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *