Banco de Dados

29 set, 2023

MessagePack: alternativa eficiente ao JSON na serialização de dados

Publicidade

Veja nesse artigo o que é o formato MessagePack de serialização através de um exemplo prático utilizando dois serviços, um em .NET e um outro em Node.js

Dando continuidade a minha serie de artigos sobre dicas de desenvolvimento, hoje abordarei o MessagePack.

Bom, antes de explorarmos o que é o MessagePack, é útil entendermos o JSON (JavaScript Object Notation).

O JSON é um formato de dados bastante comum e amplamente utilizado para estruturar e trocar informações entre sistemas.

A seguir você você tem um exemplo de JSON:

{
  "nome": "Thiago S Adriano",
  "idade": 38,
  "cidade": "São Paulo"
}

Neste exemplo, temos um objeto JSON que descreve informações sobre uma pessoa, incluindo seu nome, idade e cidade.

O JSON é legível por humanos e fácil de entender, o que o torna uma escolha popular para configurações, comunicações entre serviços da web e armazenamento de dados.

Agora, vamos abordar o MessagePack.

O MessagePack é um outro formato de serialização de dados, semelhante ao JSON, mas projetado para ser mais eficiente em termos de espaço e velocidade de codificação/decodificação.

Ao contrário do JSON, o MessagePack é binário, o que significa que não é facilmente legível por humanos, mas é muito compacto e rápido para processar em máquinas.

A seguir você tem o mesmo exemplo anterior que estava com JSON, mas neste exemplo serializado com o formato MessagePack:

\x83\xa4nome\xafThiago S Adriano\xa4idade&\xa8cidade\xa9São Paulo

Conforme você pode notar, esse formato não é facilmente legível, tanto para nós, seres humanos, quanto para os navegadores. Caso você tente abrir um endpoint que esta retornando um valor serializado com o messagepack, ele vai retornar um arquivo.

Bom, depois dessa rápida introdução, vejamos um exemplo prático demonstrando a comunicação entre dois serviços, um em Node.js retornando dados de uma pessoa e um outro em .NET lendo esses dados.

Para pular a etapa de criação de um novo projeto, eu subi a versão final dos projetos desenvolvidos para este artigo no meu Github.

Caso tenha interesse em clonar eles, segue o seu link abaixo

Vamos explorar os dois projetos.

Iniciando pelo projeto desenvolvido em node.js, nós temos apenas um arquivo chamado index.js com o seguinte trecho de código:

const express = require('express');
const msgpack = require('msgpack-lite');

const app = express();
const port = 3000;

app.use(express.json());

// Rota de exemplo que retorna dados em formato MessagePack
app.get('/', (req, res) => {
  const data = {
    nome: "Thiago S Adriano",
    idade: 38,
    cidade: "São Paulo"
  };

  // Codifica os dados em formato MessagePack
  const encodedData = msgpack.encode(data);

  // Define os cabeçalhos de resposta para indicar que estamos enviando dados MessagePack
  res.setHeader('Content-Type', 'application/msgpack');
  res.setHeader('Content-Disposition', 'inline; filename=data.msgpack');

  // Envie os dados MessagePack como resposta
  res.send(encodedData);
});

app.listen(port, () => {
  console.log(`Servidor rodando na porta ${port}`);
});

Analisando este código nós temos um api node.js com express que esta retornando os dados serializados utilizando o pacote msgpack-lite.

Agora avançando para o projeto .NET, nós temos uma classe chamada Pessoacom as anotations da biblioteca MessagePack:

[MessagePackObject]
public class Pessoa
{
    [Key("nome")]
    public string Nome { get; set; }

    [Key("idade")]
    public int Idade { get; set; }

    [Key("cidade")]
    public string Cidade { get; set; }
}

Em seguida nós temos uma requisição simples utilizando o HttpClient deserializando os dados com a biblioteca MessagePack.

Para que você possa ver como ficou a comunicação entre os dois serviços eu gravei um vídeo rápido:

Nesse exemplo estou demonstrando como o projeto .NET recebeu os dados da API desenvolvida em Node.js, em seguida estou serializando ele novamente e convertendo para JSON.

Este foi um exemplo simples, mas acredito que deu para passar como podemos utilizar esse formato de serialização nos nossos microsserviços e como utilizando ele podemos ter mais performance no momento de trafegar estes dados.

Bom, espero que tenham gostado e até um próximo artigo pessoal 🙂

*O conteúdo deste artigo é de responsabilidade do(a) autor(a) e não reflete necessariamente a opinião do iMasters.