Colector de comportamiento/eventos de usuario de código abierto (Rust), ligero pero rápido y listo para usar
(github.com/lee-lou2)Si necesitas recolectar comportamiento de usuarios o eventos, pruébalo al menos una vez (por favor🙏). ¡Seguro te va a gustar!
Desarrollé un servidor web con Rust que permite recolectar datos de forma ligera pero rápida.
El código es simple, así que incluso quienes no están familiarizados con Rust pueden personalizarlo fácilmente, por ejemplo haciendo cambios en el código (si hace falta, incluso puedo ayudar con algunas modificaciones 🥳)
El recolector de eventos está implementado de la siguiente manera:
Especificaciones técnicas
- Lenguaje de desarrollo: rust(axum)
- Almacenamiento: guardado de eventos (OpenSearch), guardado de datos pendientes (Sqlite3)
Planeo agregar soporte para que también se puedan usar otros almacenes.
Arquitectura del sistema
Tipos de API
- GET /ping : verificación de salud
- POST /events : recolección de eventos
Datos recolectados
- Información del usuario del token incluido en los headers
- Información del dispositivo/app incluida en los headers
- Información detallada del evento incluida en el body
Se puede modificar fácilmente con solo cambiar el esquema 👍
Detalles técnicos
Configuración base (explicación simple)
- 100 mil canales: se encargan de pasar los eventos recibidos a los consumidores; si los 100 mil canales están llenos, se guardan eventos pendientes en la base de datos
- 10 hilos + consumidores: reciben eventos de los canales y los guardan en OpenSearch agrupándolos de 1000 en 1000, o bien guardan los eventos acumulados durante 10 segundos
- 1 scheduler: recupera los eventos guardados en la base de datos de pendientes en intervalos específicos y los vuelve a enviar a los canales
Solicitud de creación de datos (http)
- Solicitud de creación de datos usando http api
- Al recibir la solicitud, se envía al canal; si todos los canales están llenos, se guarda en la base de datos de pendientes
Consumidor de eventos (10 hilos ligeros)
- Los eventos recibidos desde los canales se agrupan de 1000 en 1000 para hacer solicitudes de registro masivo a OpenSearch
- Si no se acumulan 1000, los eventos reunidos se registran masivamente en OpenSearch cada 10 segundos
- Si falla el registro en OpenSearch, se guardan en la base de datos de pendientes
Registro de eventos pendientes (Sqlite3)
- Si el canal se llena o ocurre un error al registrar en OpenSearch, se guardan en la base de datos de pendientes
Scheduler
- Consulta los eventos acumulados en la base de datos de pendientes en intervalos específicos y los vuelve a enviar al canal
- Más adelante planeo agregar un manejo separado para eventos que se acumulen de forma continua o que no puedan guardarse en OpenSearch por problemas de datos
La cantidad de canales o de hilos ligeros debe ajustarse según los recursos del entorno donde se despliegue o el tipo de OpenSearch 💪
Apenas llevo 2 o 3 meses usando Rust, así que la sintaxis puede verse un poco torpe, pero pienso seguir mejorándola constantemente.
¡Les agradezco mucho el interés! También agradeceré todo tipo de feedback~~~
Gracias 🙇♂️
1 comentarios
Diagrama de la arquitectura del sistema: https://github.com/lee-lou2/rust-events/blob/main/docs/flowchart.png