DataARTIGO

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

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

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.

Thiago AdrianoAutor

Microsoft (MVP), atualmente trabalha como Arquiteto de Software para TV Bandeirantes. Nesses últimos anos, focou nas tecnologias criadas pela Microsoft, mas sempre esteve antenado para as novas tecnologias que estão surgindo no mercado. Em um breve resumo, é uma pessoa apaixonada pelo que faz, tem a sua profissão como hobby.

Ver perfil