Boas práticas ao validar mensagens em um pipeline consumer

Conheça as melhores práticas para transferir mensagens entre processos e validar mensagens recebidas por um consumer.

Ao gerenciar integrações que exigem segregação, dividir a integração em múltiplos pipelines pode melhorar a clareza e eficiência. A seguir, veja um exemplo de cenário e algumas práticas recomendadas.

Cenário de exemplo: Processamento de pedidos de pagamento em um e-commerce

Imagine uma integração que processa pedidos de um e-commerce. Para gerenciar eficientemente um grande volume de pedidos, você decide dividir a integração em dois pipelines:

  • Pipeline A: Recupera os pedidos de uma API.

  • Pipeline B (consumer): Recebe os dados dos produtos extraídos dos pedidos e os envia para outra API.

  1. Uso de Eventos para a segregação do processo

Para integrar processos que demandam segregação, use Eventos para delegar tarefas específicas a outro pipeline (o consumer).

Nesse contexto, é essencial:

  • Definir precisamente os dados que o consumidor receberá.

  • Estabelecer um contrato claro entre os processos.

Isso assegura que a mensagem transmitida seja precisa, concisa e válida, facilitando a comunicação e reduzindo possíveis erros entre os dois processos.

  1. Otimização dos dados enviados ao consumer

No Pipeline A, a API de pedidos retorna o seguinte JSON:

{
  "status": 200,
  "body": {
    "numPedido": "001",
    "produtos": [
      {
        "codigo": "123",
        "nome": "Produto A"
      },
      {
        "codigo": "456",
        "nome": "Produto B"
      }
    ],
    "cliente": {
      "nome": "Cliente Exemplo",
      "cpf": "123.456.789-10",
      "email": "cliente@email.com",
      "enderecos": {
        "logradouro": "Rua de Exemplo",
        "numero": "10",
        "cep": "01010-10"
      }
    }
  },
  "headers": {
    "Cache-Control": "no-cache,must-revalidate,max-age=0,no-store,private",
    "Content-Type": "application/json;charset=UTF-8",
    "Date": "Wed, 01 Jul 2020 19:04:46 GMT",
    "Expires": "Thu, 01 Jan 1970 00:00:00 GMT",
    "Set-Cookie": "BrowserId=up7LXrwv46wesv5NEeg9ps_4AgB_",
    "Strict-Transport-Security": "max-age=31536000; includeSubDomains",
    "Transfer-Encoding": "chunked",
    "Vary": "Accept-Encoding",
    "X-B3-Sampled": "0",
    "X-B3-SpanId": "8c419a93i3bsi0=9d8e54316",
    "X-B3-TraceId": "8c419a9389gba9y54316",
    "X-Content-Type-Options": "nosniff",
    "X-ReadOnlyMode": "false",
    "X-XSS-Protection": "1; mode=block"
  }
}

Contudo, para o Pipeline B, apenas o array de "produtos" é necessário:

{
  "produtos": [
    {
      "codigo": "123",
      "nome": "Produto A"
    },
    {
      "codigo": "456",
      "nome": "Produto B"
    }
  ]
}

Enviar o JSON completo para o Pipeline B incluiria dados desnecessários. Em vez disso, use um conector Transformer (JOLT), JSON Generator, ou Event para processar o JSON e garantir que somente as informações essenciais de “produtos” sejam enviadas.

Por que evitar o envio de payloads JSON completos?

Enviar o JSON completo pode sobrecarregar o Pipeline B com dados irrelevantes, possivelmente incluindo centenas de linhas, quando apenas uma fração é necessária. Limitar a transferência de dados às informações essenciais melhora a eficiência, independemente do volume de dados.

Outros benefícios incluem:

  • Logs de execução: Mensagens menores resultam em logs mais claros e fáceis de gerenciar.

  • Manutenção: Dados simplificados facilitam a resolução de problemas e atualizações, especialmente quando pessoas diferentes estão envolvidas em manter a integração.

  1. Validação de dados e contratos

Para uma validação de dados robusta, o Pipeline B pode usar:

  • Conector Validator: Use um JSON Schema para definir precisamente o JSON esperado pelo consumer.

  • Conector Choice: Use JSONPath para validar elementos específicos na mensagem recebida. Por exemplo, expressões como $.produtos or $.produtos[?(@.codigo && @.nome)] garantem que somente dados válidos sejam processados.

Caso essas condições não sejam atendidas, um fluxo de erro será acionado, interrompendo o processo devido ao descumprimento do contrato especificado.

Atualizado