Serialização de dados eficiente: conheça o Protobuf
4 minutos de leitura
Quando a serialização de dados se faz necessária?
Quando desenvolvemos sistemas que necessitam de algum tipo de comunicação baseada em mensagens, independente do modelo arquitetural adotado, se faz necessário planejar em como estruturar e serializar as mensagens que irão trafegar pela rede – seja ela uma rede interna ou até mesmo a internet.
O XML foi o formato adotado durante anos para fazer esse intercâmbio, até o surgimento e consolidação do JSON, que se tornou popular por ser bastante leve, simples de manipular, sem esquema (é um ponto questionável) e de fácil leitura.
Com a ascensão da arquitetura orientada a serviços e microsserviços, se faz necessário pensar em alternativas de serialização de dados mais eficientes, principalmente quando se trata de comunicação de serviços internos, bem como no que diz respeito a tamanho e velocidade (serialização e tráfego).
Estamos falando de comunicação entre inúmeras máquinas e serviços distintos, que podem até mesmo estar em espaços físicos diferentes, onde a latência poderá se tornar um fator crítico, sobretudo se a plataforma necessita de um nível de resposta mais próximo do real-time.
Diferente de uma aplicação monolítica, que é executada em um único processo, onde as chamadas para componentes/módulos são feitas através de funções ou métodos de linguagem, os microsserviços possuem uma latência maior por sua natureza, pois ganham a complexidade dos sistemas distribuídos, tendo que efetuar chamadas para processos remotos.
Ok, mas qual a alternativa sugerida?
Será apresentada, a seguir, uma alternativa de serialização de dados – sem detalhes a respeito de seu funcionamento ou da utilização em si, mas conhecer as opções pode já ser muito vantajoso para desenvolvedores(as) que se interessam pelo tema. Algumas outras serão listadas no final deste artigo.
Serialização de dados eficiente
O protocolo de buffers, comumente chamado de Protobuf é um exemplo de serialização de dados mais eficiente. Ele é um mecanismo extensível (disponível para várias linguagens de programação) de serialização binária que permite a especificação de um esquema de dados através de uma linguagem. Este protocolo foi desenvolvido internamente pela Google em 2001 com o objetivo de ser mais rápido e menor que o XML, sendo hoje um projeto de código aberto.
O teste de desempenho a seguir foi realizado por Kartik Khare, atualmente engenheiro de software na Walmart e disponibilizado neste artigo. O conteúdo traz mais detalhes sobre o que foi utilizado em relação à hardware e software.
Além disso, um simples software que exibe o tamanho (Bytes) de uma pequena mensagem serializada em JSON e Protobuf foi desenvolvido e publicado no repositório: proto-json.
O exemplo em questão apresenta uma redução da carga de um pouco mais de 12% para o dado serializado com Protobuf em relação ao JSON. Essa redução pode ser ainda maior em cenários onde a carga de dados é mais complexa, uma vez que o JSON possui repetição de campos no caso da utilização de vetores.
Com isso é possível notar que existe um ganho considerável de tempo na serialização/desserialização, tanto quanto na redução de seu tamanho. Há ainda uma outra análise publicada por Bruno Kerbs, onde ele concluiu ser capaz de trafegar 50 mil instâncias de um objeto exemplo em 25 milissegundos com Protobuf, enquanto JSON levou cerca de 150 milissegundos entre duas aplicações Java. Desse modo, nota-se que Protobuf é uma alternativa válida para tornar mais eficiente a comunicação intra-serviços.
Se você gostou desse artigo e tem interesse em conhecer também outras alternativas de serialização, recomendo: Avro, Flatbuffers e Thrift.