9 puan yazan leelou2 2025-01-09 | 1 yorum | WhatsApp'ta paylaş

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

  1. GET /ping : sağlık kontrolü
  2. 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 🙇‍♂️