Coletor de comportamento/eventos de usuário open source (Rust), leve e rápido, pronto para usar
(github.com/lee-lou2)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
- GET /ping : verificação de saúde
- 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
Gráfico da arquitetura do sistema: https://github.com/lee-lou2/rust-events/blob/main/docs/flowchart.png