9 pontos por leelou2 2025-01-09 | 1 comentários | Compartilhar no WhatsApp

Se você precisa coletar comportamento de usuário ou eventos por conta própria, vale muito a pena testar (por favor 🙏). Com certeza você vai ficar satisfeito!

Desenvolvi um servidor web em Rust capaz de coletar dados de forma leve, mas rápida.

O código é simples, então mesmo quem não está acostumado com Rust pode personalizá-lo facilmente, fazendo alterações no código e afins (se precisar, eu mesmo posso ajudar com algumas modificações 🥳).

O coletor de eventos foi implementado da seguinte forma:

Especificações técnicas

  • Linguagem de desenvolvimento: rust(axum)
  • Armazenamento: eventos salvos no OpenSearch, dados pendentes salvos no Sqlite3

Pretendo adicionar suporte para que outros armazenamentos também possam ser usados.

Estrutura do sistema

Tipos de API

  1. GET /ping : verificação de saúde
  2. POST /events : coleta de eventos

Dados coletados

  • Informações do usuário do token incluído nos headers
  • Informações do dispositivo/app incluídas nos headers
  • Informações detalhadas do evento incluídas no body

Pode ser ajustado facilmente apenas alterando o schema 👍

Detalhes técnicos

Estrutura básica (explicação simples)

  • 100 mil canais: fazem o papel de encaminhar os eventos recebidos para os consumers; se os 100 mil canais estiverem todos cheios, os eventos pendentes são salvos no banco de dados
  • 10 threads + consumers: recebem eventos dos canais e os agrupam em lotes de 1000, ou salvam no OpenSearch os eventos acumulados durante 10 segundos
  • 1 scheduler: busca os eventos salvos no banco de dados de pendências em intervalos específicos e os envia novamente para os canais

Requisição de criação de dados (http)

  • Solicitação de criação de dados via API http
  • Ao receber a requisição, ela é encaminhada para os canais; se todos os canais estiverem cheios, é salva no banco de dados de pendências

Consumer de eventos (10 threads leves)

  • Os eventos recebidos dos canais são agrupados em lotes de 1000 para uma requisição de inserção em massa no OpenSearch
  • Se não chegarem a 1000, os eventos acumulados são registrados em massa no OpenSearch a cada 10 segundos
  • Se o registro no OpenSearch falhar, os eventos são salvos no banco de dados de pendências

Registro de eventos pendentes (Sqlite3)

  • Se os canais estiverem cheios ou ocorrer erro ao registrar no OpenSearch, os dados são salvos no banco de dados de pendências

Scheduler

  • Consulta periodicamente os eventos acumulados no banco de dados de pendências e os envia para os canais
  • No futuro, pretendo adicionar um tratamento separado para eventos que continuam se acumulando ou que não conseguem ser salvos no OpenSearch por problemas de dados

A quantidade de canais e de threads leves precisa ser ajustada de acordo com os recursos do ambiente de implantação e com o tipo de OpenSearch usado 💪

Ainda estou há apenas 2~3 meses usando Rust, então a sintaxe pode soar um pouco estranha, mas vou continuar melhorando aos poucos.

Agradeço muito o interesse e também todo tipo de feedback~~~
Obrigado 🙇‍♂️

1 comentários