Integração e API

API em Lote (Batch API)

O escopo de uma Batch API é agrupar múltiplas operações; não é executar tudo como uma única transação. Uma requisição pode conter 10, 100 ou mais suboperações e devolver resultado individual por item. Google Workspace usa `multipart/mixed`; outras APIs usam arrays JSON. O principal critério é latência de rede. A limitação é o erro parcial: itens podem ter status diferentes, ordem não garantida e cobrança ou quota contabilizada por subrequisição.


🔀 Tipos de Comunicação
JSON BATCH
Envelope JSON com operações
O cliente envia um array de itens, cada um com ID, operação e payload. Um exemplo de iluminação contém 50 comandos de brilho. A resposta devolve `results` correlacionados por ID, com status e erro. O servidor pode processar em paralelo ou série. A ordem de retorno não deve ser presumida. IDs únicos são obrigatórios. O limite de itens, como 100 por lote, protege memória e tempo. O tamanho total, por exemplo 1 MB, também. O contrato precisa definir se um item inválido rejeita apenas ele ou todo o envelope. Para automação, a resposta parcial deve atualizar somente dispositivos confirmados. Um lote aceito não significa que cada atuador executou fisicamente.
MULTIPART
Batch HTTP multipart/mixed
APIs do Google Workspace combinam requisições HTTP completas em uma única mensagem `multipart/mixed`. Cada parte contém método, URL, cabeçalhos e corpo; a resposta traz partes com status próprios. Isso preserva semântica de endpoints existentes sem criar um endpoint JSON específico. As subrequisições continuam contando individualmente para quotas. O formato é mais complexo de gerar e analisar. Fronteiras MIME, Content-ID e cabeçalhos precisam estar corretos. A execução pode ser separada pelo servidor. Não assumir ordem de execução. Uma operação dependente da anterior não deve ser colocada no mesmo lote sem mecanismo explícito. O ganho vem de reduzir round trips, não de obter transação.
TRANSACTION
Operações atômicas em lote
Algumas APIs oferecem lote atômico: todas as mudanças são aplicadas ou nenhuma. Google Docs `batchUpdate` processa uma lista de requests num documento com regras específicas. Bancos oferecem transações. Esse comportamento precisa ser declarado. Não se deve inferir pelo nome batch. Em casa inteligente, ligar 20 luzes dificilmente é uma transação física: uma pode estar offline. O servidor pode aceitar atomicamente a intenção, mas a execução distribuída continua parcial. Para configurações em banco, atomicidade pode ser real. O contrato deve separar validação, commit e efeitos externos. Rollback de um comando já enviado a uma fechadura não é garantido. Sagas ou compensação podem ser necessárias.
ASYNC
Batch assíncrono por job
Lotes grandes podem ser aceitos com HTTP 202 e um `job_id`. O cliente consulta o status ou recebe webhook. O servidor processa em segundo plano, grava progresso e resultados por item. Isso evita timeout de uma requisição de minutos. O job precisa de expiração, cancelamento e idempotência. Uploads podem usar arquivo CSV, NDJSON ou objeto em storage. Em plataforma IoT, atualizar firmware de 10 mil dispositivos é um job, não uma chamada síncrona. O resultado deve distinguir agendado, enviado, aplicado e falho. A API precisa limitar concorrência para não saturar gateways. O cliente não deve reenviar todo o lote por um timeout sem consultar o job.
✅ Vantagens Arquiteturais
Reduz overhead de conexão e latência de ida e volta
Cem chamadas HTTPS separadas podem exigir cem conjuntos de cabeçalhos, filas e round trips. HTTP/2 multiplexa e reduz parte, mas cada requisição ainda tem processamento e quota. Um lote envia uma conexão lógica e recebe uma resposta. Em link de 100 ms, o ganho pode ser grande se o cliente não paraleliza. Em LAN de 1 ms, menor. A decisão deve medir. O payload maior pode demorar e ultrapassar limites. Compressão ajuda em JSON repetitivo. O servidor precisa evitar ler tudo em memória quando o lote é grande. Streaming NDJSON pode ser alternativa. Batch não substitui HTTP/2; são camadas complementares.
Permite validação e planejamento conjunto
O servidor vê o conjunto e pode detectar duplicatas, agrupar por gateway, ordenar dependências e reduzir chamadas externas. Um lote de 200 leituras de dispositivos pode ser transformado em uma consulta única ao banco. Um lote de comandos Zigbee pode ser escalonado para não congestionar a malha. O benefício depende da implementação. Processar apenas um loop sobre o endpoint individual ainda reduz rede, mas não o backend. Otimizações precisam preservar semântica. Agrupar comandos pode mudar ordem. O sistema deve documentar. Para dispositivos a bateria, a janela de disponibilidade pode orientar o lote. O planejamento central melhora eficiência, mas acrescenta complexidade.
Facilita sincronização inicial de estados
Um aplicativo recém-instalado pode solicitar estados de 300 dispositivos em um lote ou endpoint bulk. Isso reduz tempo. A resposta precisa incluir versão, timestamp e disponibilidade. Se o estado muda durante a coleta, o snapshot pode ser inconsistente. Um token de versão ou sequência ajuda. Após o snapshot, o cliente assina eventos desde o cursor. Sem essa transição, pode perder mudanças. Em automação, a sincronização deve separar configuração e estado. Um dispositivo offline não deve zerar. O lote devolve erro por item. O cliente mostra parcial e tenta novamente apenas os falhos.
Melhora eficiência de escrita em armazenamento
O backend pode usar transação, bulk insert ou pipeline. Cem registros de telemetria gravados juntos reduzem commits. Bancos e brokers possuem APIs bulk. O lote precisa de limite para não bloquear. Um batch de 1000 pode ser ótimo; 1 milhão, perigoso. A escolha é medida por throughput e latência. Buffers introduzem atraso: esperar 5 s para encher lote pode ser inadequado para alarme. Classes críticas são enviadas imediatamente; telemetria pode agrupar. O benefício é custo por operação. O sistema deve descarregar buffer com tempo máximo mesmo sem atingir tamanho.
Torna erros parciais explícitos quando o contrato é bem definido
Uma resposta pode devolver `207 Multi-Status` ou HTTP 200 com status por item. O cliente sabe o que repetir. Cada item precisa de ID e, para escrita, chave idempotente. Retentar somente `429` e `5xx` temporários; não repetir `400` sem correção. Dependências complicam: se o item B depende de A, o lote precisa declarar ou ser dividido. A API deve limitar detalhes sensíveis em erros. O resultado precisa ser estável. Um erro geral de transporte deixa ambiguidade sobre o processamento; idempotência e endpoint de consulta resolvem.