9 ポイント 投稿者 leelou2 2025-01-09 | 1件のコメント | WhatsAppで共有

ユーザー行動やイベントそのものの収集が必要であれば、ぜひ一度使ってみてください。きっと満足していただけると思います!

Rust を使って、軽量でありながら高速にデータ収集できる Web サーバーを開発しました。

コードがシンプルなので、Rust に慣れていない方でもコード変更などのカスタマイズが簡単にできます(必要であれば一部修正も対応できます)。

イベント収集器は次のように実装されています。

技術仕様

  • 開発言語 : rust(axum)
  • ストレージ : イベント保存(OpenSearch)、保留データ保存(Sqlite3)

他のストレージも使えるように今後追加する予定です。

システム構成

API 種類

  1. GET /ping : ヘルスチェック
  2. POST /events : イベント収集

収集データ

  • Headers に含まれるトークンのユーザー情報
  • Headers に含まれるデバイス/アプリ情報
  • Body に含まれるイベント詳細情報

スキーマ変更だけで簡単に修正可能です 👍

技術詳細

基本構成(簡単な説明)

  • 10万個のチャネル : 受け取ったイベントをコンシューマーに渡す役割。10万個のチャネルがすべて埋まった場合はデータベースに保留イベントを保存
  • 10個のスレッド + コンシューマー : チャネルからイベントを受け取り、1000件ずつまとめるか、10秒間たまったイベントを OpenSearch に保存
  • 1個のスケジューラー : 保留データベースに保存されたイベントを一定周期で読み出し、再びチャネルへ渡す

データ生成リクエスト(http)

  • http api を使ってデータ生成をリクエスト
  • リクエストを受けるとチャネルへ渡し、チャネルがすべて埋まっていれば保留データベースに保存

イベントコンシューマー(10個の軽量スレッド)

  • チャネルから受け取ったイベントを1000件ずつまとめて OpenSearch に一括登録リクエスト
  • 1000件たまっていない場合は 10 秒単位でたまったイベントを OpenSearch に一括登録
  • OpenSearch 登録に失敗した場合は保留データベースに保存

保留イベント登録(Sqlite3)

  • チャネルがいっぱいになったり、OpenSearch 登録エラーが発生した場合は保留データベースに保存

スケジューラー

  • 保留データベースにたまったイベントを一定周期で照会してチャネルへ渡す
  • 今後、連続してたまるイベントやデータ問題で OpenSearch に保存できないイベントについては、別途処理を追加する予定です

チャネル数や軽量スレッド数は、デプロイ環境のリソースや OpenSearch の種類に応じて調整する必要があります 💪

まだ Rust を始めて 2〜3 か月なので、文法が少しぎこちない部分はあるかもしれませんが、継続的に改善していく予定です。

たくさんの関心をいただけるとうれしいです。さまざまなフィードバックもお待ちしています。
ありがとうございます 🙇‍♂️

1件のコメント