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.
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.
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": "[email protected]",
"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.
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.
Isto foi útil?