Serialização de dados utilizando Rust, Flatbuffers e ZeroMQ

22/11/2023 16:35 Comentário(s) Por Carlos Korovsky

A troca de mensagens no formato JSON é o método mais comum de comunicação dentro de um sistema, entretanto não é o mais performático, para obter uma melhor performance é necessário otimizar o tamanho das mensagens, para isso utilizamos o processo de serialização, transformando o formato de uma mensagem em outro.


Existem diversas bibliotecas de serialização, sendo a Flatbuffers uma das mais performáticas. O presente artigo tem como objetivo discorrer sobre algumas funcionalidades dessa biblioteca e mostrar como utilizá-la.

Por que utilizar Flatbuffers para comunicação ? 

  • Baixo consumo de recursos, não necessita de espaço adicional para acessar os dados serializados;
  • Flexível, permite retrocompatibilidade entre versões diferentes dos esquemas de serielização;
  • Fácil de usar;
  • Fortemente tipada;
  • Crossplatform, o compilador FlatC permite permite a utilização de Flatbuffers na maioria das linguagens;

Por onde começar ?

Instalando o transpilador FlatC, responsável por traduzir os schemas das mensagens em código, muitas distribuições linux trazem o pacote flatbuffers e flatbuffers-devel, para outros casos consulte é necessário compilar a partir do código fonte.

Definindo um esquema

Vamos definir um esquema básico de comunicação seguindo a documentação:

No esquema acima temos uma mensagem Base que é composta por uma id, um nome e um dispositivo. Utilizando a declaração union podemos utilizar diferentes dispositivos em um campo da mensagem. Essa union se comporta como uma tupla, tendo como valor na posição 0 o campo oculto None permitindo que a mensagem seja enviada sem um dispositivo.


Agora basta compilar o arquivo .fbs criado utilizando o comando:

flatc --rust nome-do-arquivo.fbs

E adicionar o arquivo generated.rs ao projeto.

Exemplo:

Para exemplo vamos utilizar a biblioteca de comunicação zeromq em uma arquitetura cliente-servidor simples, considerando o projeto já com as dependências segue o código do servidor:
E do cliente: 

Resultado:

Partilhar -