9 puntos por leelou2 2025-01-09 | 1 comentarios | Compartir por WhatsApp

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

  1. GET /ping : verificación de salud
  2. 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

 
leelou2 2025-01-09