すぐに使える、軽量かつ高速なユーザー行動/イベント収集器(Rust)オープンソース
(github.com/lee-lou2)ユーザー行動やイベントそのものの収集が必要であれば、ぜひ一度使ってみてください。きっと満足していただけると思います!
Rust を使って、軽量でありながら高速にデータ収集できる Web サーバーを開発しました。
コードがシンプルなので、Rust に慣れていない方でもコード変更などのカスタマイズが簡単にできます(必要であれば一部修正も対応できます)。
イベント収集器は次のように実装されています。
技術仕様
- 開発言語 : rust(axum)
- ストレージ : イベント保存(OpenSearch)、保留データ保存(Sqlite3)
他のストレージも使えるように今後追加する予定です。
システム構成
API 種類
- GET /ping : ヘルスチェック
- 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件のコメント
システム構成図: https://github.com/lee-lou2/rust-events/blob/main/docs/flowchart.png