Hemen Kullanıma Hazır, Hafif ama Hızlı Kullanıcı Davranışı/Olay Toplayıcısı (Rust) Açık Kaynak
(github.com/lee-lou2)Kullanıcı davranışı ya da olayları doğrudan toplamanız gerekiyorsa mutlaka bir kez deneyin (lütfen🙏), kesinlikle memnun kalacaksınız!
Rust kullanarak hafif ama hızlı veri toplayabilen bir web sunucusu geliştirdim.
Kod basit olduğu için Rust'a çok aşina olmayanlar bile kod değişikliği gibi özelleştirmeleri kolayca yapabilir. (Gerekirse bazı düzenlemeleri ben de yapabilirim 🥳)
Olay toplayıcısı aşağıdaki şekilde uygulanmıştır.
Teknik özellikler
- Geliştirme dili: rust(axum)
- Depolama: olay saklama(OpenSearch), bekleyen veri saklama(Sqlite3)
Farklı depoları da kullanabilecek şekilde eklemeyi planlıyorum.
Sistem yapısı
API türleri
- GET /ping : sağlık kontrolü
- POST /events : olay toplama
Toplanan veriler
- Header'larda bulunan token içindeki kullanıcı bilgisi
- Header'larda bulunan cihaz/uygulama bilgisi
- Body'de bulunan olay ayrıntıları
Yalnızca şema değişikliğiyle kolayca düzenlenebilir 👍
Teknik ayrıntılar
Temel yapılandırma (kısa açıklama)
- 100 bin kanal: alınan olayları consumer'a iletme görevini üstlenir; 100 bin kanalın tamamı doluysa veritabanına bekleyen olay kaydedilir
- 10 thread + consumer: kanaldan olayları alır, bunları 1000'erli gruplar hâlinde ya da 10 saniye boyunca biriken olayları OpenSearch'e kaydeder
- 1 scheduler: bekleyen veritabanına kaydedilen olayları belirli aralıklarla alıp tekrar kanala iletir
Veri oluşturma isteği (http)
- Veri oluşturma isteği için http api kullanılır
- İstek alındığında kanala iletilir, kanalın tamamı doluysa bekleyen veritabanına kaydedilir
Olay consumer'ı (10 hafif thread)
- Kanaldan alınan olaylar 1000'erli gruplar hâlinde OpenSearch toplu ekleme isteğiyle gönderilir
- 1000 adede ulaşmamışsa, 10 saniyelik aralıklarla biriken olaylar OpenSearch'e toplu eklenir
- OpenSearch'e kayıt başarısız olursa bekleyen veritabanına kaydedilir
Bekleyen olay kaydı (Sqlite3)
- Kanal dolduğunda veya OpenSearch kayıt hatası oluştuğunda bekleyen veritabanına kaydedilir
Scheduler
- Bekleyen veritabanında biriken olayları belirli periyotlarla sorgulayıp kanala iletir
- İleride art arda biriken olaylar ya da veri sorunları nedeniyle OpenSearch'e kaydedilemeyen olaylar için ayrı işlemler eklemeyi planlıyorum
Kanal sayısı ya da hafif thread sayısı, dağıtım yapılan ortamın kaynaklarına veya OpenSearch türüne göre ayarlanmalıdır 💪
Henüz Rust'ta 2~3 aylığım, bu yüzden sözdizimi biraz acemice olabilir; bunu sürekli iyileştirmeyi planlıyorum.
İlginizi bekliyorum, çeşitli geri bildirimler de çok memnun eder~~~
Teşekkür ederim 🙇♂️
1 yorum
Sistem mimarisi şeması: https://github.com/lee-lou2/rust-events/blob/main/docs/flowchart.png