9 points par leelou2 2025-01-09 | 1 commentaires | Partager sur WhatsApp

Si vous avez besoin de collecter directement les comportements utilisateur ou des événements, essayez-le au moins une fois (s’il vous plaît 🙏), vous en serez certainement satisfait !

J’ai développé avec Rust un serveur web léger mais rapide, capable de collecter des données efficacement.

Le code est simple, donc même si vous n’êtes pas familier avec Rust, vous pouvez facilement le modifier et le personnaliser (si besoin, je peux aussi vous aider à en ajuster certaines parties 🥳).

Le collecteur d’événements est implémenté comme suit :

Spécifications techniques

  • Langage de développement : rust(axum)
  • Stockage : événements enregistrés dans OpenSearch, données en attente stockées dans Sqlite3

Il est prévu d’ajouter la prise en charge d’autres stockages également.

Architecture du système

Types d’API

  1. GET /ping : vérification d’état
  2. POST /events : collecte d’événements

Données collectées

  • Informations utilisateur du token inclus dans les headers
  • Informations appareil/application incluses dans les headers
  • Détails de l’événement inclus dans le body

Une simple modification du schéma permet de l’adapter facilement 👍

Détails techniques

Configuration de base (explication simple)

  • 100 000 canaux : ils servent à transmettre les événements reçus aux consumers ; si les 100 000 canaux sont tous pleins, les événements sont stockés dans la base de données d’attente
  • 10 threads + consumers : ils récupèrent les événements depuis les canaux, les regroupent par lots de 1000 ou enregistrent dans OpenSearch les événements accumulés pendant 10 secondes
  • 1 scheduler : il recharge à intervalles réguliers les événements stockés dans la base d’attente pour les renvoyer dans les canaux

Requête de création de données (http)

  • Requête de création de données via une API http
  • À la réception d’une requête, l’événement est transmis à un canal ; si tous les canaux sont pleins, il est stocké dans la base de données d’attente

Consumer d’événements (10 threads légers)

  • Regroupe par 1000 les événements reçus depuis les canaux et envoie une requête d’indexation massive à OpenSearch
  • Si 1000 événements ne sont pas accumulés, les événements collectés sont indexés en masse dans OpenSearch toutes les 10 secondes
  • En cas d’échec d’enregistrement dans OpenSearch, ils sont stockés dans la base de données d’attente

Enregistrement des événements en attente (Sqlite3)

  • Si les canaux sont saturés ou si une erreur survient lors de l’enregistrement dans OpenSearch, les événements sont stockés dans la base de données d’attente

Scheduler

  • Interroge à intervalles réguliers les événements accumulés dans la base de données d’attente et les retransmet dans les canaux
  • Plus tard, il est prévu d’ajouter un traitement séparé pour les événements qui s’accumulent en continu ou ceux qui ne peuvent pas être enregistrés dans OpenSearch à cause de problèmes de données

Le nombre de canaux et de threads légers doit être ajusté en fonction des ressources de l’environnement de déploiement et du type d’OpenSearch utilisé 💪

Je n’utilise Rust que depuis 2 à 3 mois, donc la syntaxe peut encore sembler un peu maladroite, mais je compte l’améliorer régulièrement.

Merci pour votre intérêt, et pour tous vos retours également~~~
Merci 🙇‍♂️

1 commentaires

 
leelou2 2025-01-09