Definindo o Contrato do Dado
Antes de integrar provedores, é essencial definir o significado de cada campo. Um campo chamado 'price' pode representar o preço da última negociação, o preço médio, um índice agregado ou o ponto médio entre compra e venda. O contrato interno deve especificar pelo menos essas distinções para evitar interpretações equivocadas.
Horários de Observação e Recebimento
Todo registro deve carregar dois horários: observed_at representa quando a fonte observou ou produziu o dado, enquanto received_at indica quando seu sistema o recebeu. A diferença entre ambos ajuda a identificar latências, filas congestionadas e respostas antigas servidas por caches externos.
Proveniência e Normalização
A proveniência deve sobreviver à normalização. Guarde o nome do provedor, o endpoint ou canal utilizado e, quando possível, um identificador da resposta. Se o valor final for calculado a partir de várias fontes, registre quais participaram, quais foram descartadas e qual método de agregação foi usado. Sem essa trilha, investigar um pico incorreto vira arqueologia: o número está no banco, mas ninguém consegue explicar como chegou lá.
Dados Vencidos
A validade depende do ativo e do caso de uso. Dez minutos podem ser aceitáveis em um relatório diário, mas não em uma interface que se apresenta como tempo real. Defina um limite de frescor por categoria e calcule a idade usando observed_at, não apenas o momento da última gravação. Uma coleta recente pode conter uma observação antiga.
Fontes Multiples e Fallback
Use múltiplas fontes com regras previsíveis. Cada fonte pode ter cobertura, liquidez e metodologia distintas. Estabeleça uma ordem ou estratégia por ativo e documente quando a troca acontece. Por exemplo, use uma fonte primária enquanto ela estiver saudável, recorrer à secundária quando houver timeout ou dado vencido e comparar ambas durante a recuperação. Para ativos líquidos, uma mediana entre fontes elegíveis pode reduzir o impacto de um valor extremo. Para mercados pouco líquidos, agregar sem considerar volume e origem pode criar uma precisão ilusória.
Cachês e Prazos
O cache reduz latência e protege contra limites de requisição, mas precisa preservar a idade do conteúdo. Uma resposta em cache deve incluir o timestamp original e seu estado atual. Adote dois prazos: um TTL curto para operação normal e uma janela limitada de stale-if-error. Dentro da segunda janela, o sistema pode retornar o último valor conhecido, desde que marque claramente como vencido. Depois dela, é mais seguro declarar indisponibilidade.
Circuit Breaker
Um circuit breaker interrompe chamadas repetidas, evitando que o sistema se sobrecarregue e caia. Este é um recurso crucial para garantir a confiabilidade dos dados de mercado cripto.