Open source kolektor perilaku/pengumpulan event pengguna (Rust) yang ringan namun cepat dan siap langsung dipakai
(github.com/lee-lou2)Kalau Anda butuh mengumpulkan sendiri perilaku pengguna atau event, wajib coba ini setidaknya sekali (tolong🙏) Anda pasti akan puas!
Saya mengembangkan web server dengan Rust yang memungkinkan pengumpulan data yang ringan namun cepat.
Karena kodenya sederhana, bahkan bagi yang belum terbiasa dengan Rust pun mudah melakukan kustomisasi seperti mengubah kode (jika diperlukan, saya juga bisa membantu melakukan beberapa modifikasi 🥳)
Kolektor event ini diimplementasikan seperti berikut.
Spesifikasi teknis
- Bahasa pengembangan: rust(axum)
- Penyimpanan: penyimpanan event (OpenSearch), penyimpanan data pending (Sqlite3)
Ke depannya saya berencana menambahkan dukungan agar storage lain juga bisa digunakan.
Arsitektur sistem
Jenis API
- GET /ping : health check
- POST /events : pengumpulan event
Data yang dikumpulkan
- Informasi pengguna dari token yang termasuk di Headers
- Informasi perangkat/aplikasi yang termasuk di Headers
- Informasi detail event yang termasuk di Body
Bisa dimodifikasi dengan mudah hanya dengan mengubah skema 👍
Detail teknis
Konfigurasi dasar (penjelasan singkat)
- 100.000 channel: berperan mengirim event yang diterima ke consumer; jika semua 100.000 channel penuh, event akan disimpan ke database pending
- 10 thread + consumer: mengambil event dari channel lalu menyimpannya ke OpenSearch dalam batch 1.000 item atau event yang terkumpul selama 10 detik
- 1 scheduler: mengambil event yang disimpan di database pending secara berkala lalu mengirimkannya kembali ke channel
Permintaan pembuatan data (http)
- Menggunakan http api untuk permintaan pembuatan data
- Saat permintaan diterima, data dikirim ke channel; jika semua channel penuh, data disimpan ke database pending
Event consumer (10 thread ringan)
- Event yang diterima dari channel dibundel per 1.000 lalu dikirim sebagai permintaan bulk insert ke OpenSearch
- Jika belum terkumpul 1.000, event yang terkumpul tiap 10 detik akan didaftarkan secara bulk ke OpenSearch
- Jika pendaftaran ke OpenSearch gagal, event disimpan ke database pending
Pendaftaran event pending (Sqlite3)
- Jika channel penuh atau terjadi error saat mendaftarkan ke OpenSearch, event disimpan ke database pending
Scheduler
- Event yang menumpuk di database pending diambil secara berkala lalu dikirim ke channel
- Ke depannya, saya berencana menambahkan penanganan terpisah untuk event yang terus menumpuk atau event yang gagal disimpan ke OpenSearch karena masalah data
Jumlah channel maupun thread ringan perlu disesuaikan dengan resource lingkungan deployment atau jenis OpenSearch yang digunakan 💪
Saya baru sekitar 2~3 bulan belajar Rust, jadi sintaksnya mungkin masih agak canggung, tetapi saya akan terus memperbaikinya.
Mohon banyak perhatian dan juga berbagai feedback ya~~~
Terima kasih 🙇♂️
1 komentar
Diagram arsitektur sistem: https://github.com/lee-lou2/rust-events/blob/main/docs/flowchart.png