Web Sunucusunun Aldığı İstekleri Ne Kadar Sürede İşlediğini Kafka ve Go ile Kaydetme

ASP.NET WebAPI projesi

  • /api/products
    GET, POST, PUT, DELETE metotları ile istekler alabilecek ve dummy data oluşturmak için kullanılacak. Geri dönüşleri sadece 204 olacak ve içerisinde logic bir işlem yapılmayacak fakat bu metotlara giden istekler, 0 ile 3000 ms arası bekletilecek.
  • /health/api/products
    Son bir saatte /api/products’a giden isteklerin ne kadar sürede işlendiğinin bilgisini database’den alıp, sunacak.

ASP.NET WebAPI projesinin oluşturulması

İhtiyacımız olan paketlerin eklenmesi

  • Npgsql
    Postgres database için kullanacağımız kütüphane.
  • Confluent.Kafka
    Kafka serverımız ile iletişim kurarken, Produce işlemleri için kullanacağımız kütüphane.

ResponseLog.cs

Models/ResponseLog.cs

Services

  • FileLogService
    Gelen mesajı bir dosyaya kaydetmek ve kaydettiği bilgiyi, konsolda bildirmek.
  • KafkaLogService
    Gelen mesajı belirlenen bir topic’e göndermek(Produce etmek) ve gönderdiği bilgiyi konsolda bildirmek.

LogService.cs

Services/Abstract/LogService.cs

FileLogService.cs

Services/FileLogService.cs

KafkaLogService.cs

Services/KafkaLogService.cs

ActionFilters

  • Delayer
    Delayer attribute’unu alan end-pointler’in rastgele bir değer aralığında bekletilmesini sağlamak için var.
  • TimeTracker
    Yaptığı tek bir iş var, oda TimeTracker attribute’unu alan bir yere istek giderse, isteğin end-point’e ilk ulaştığı süreyi HttpContext.Items dictionarysi içinde tutmak.

Delayer.cs

Filters/Delayer.cs

TimeTracker.cs

Filters/TimeTracker.cs

Routes

Products

Controllers/ProductsController.cs

Health

Controllers/HealthController.cs

Startup.cs

ResponseLoggerMiddleware

Go ile Kafka mesajlarını okumak ve Database’ın güncellenmesi

initDatabase

insertMessages

consumeAndInsertMessages

main

Dashboard

En sonunda elde ettiğimiz

  • Yapmak istediğimiz işlem için ilişkisel bir veritabanını kullanmak gereksiz, NoSQL bir database tercih edilmesi daha iyi olurdu.
  • Topic bir sabit olarak tutuluyor, ResponseLog ile hangi topic için işlem yapılacağı belirtilebilir.
    ResponseLog ile gelecek topic bilgisi ile hangi end-point route’undan geldiği bilgisi belirtilebilir ve ona ait bir dosyaya veya ona ait bir kafka topic’ine bu response log aktarılır.
    Örnek; şuanda sadece tek bir route’u izliyoruz ve bu route(/api/products). Herhangi yeni bir route’u izlemek istediğimiz zaman, bunun loglarını aynı topicte ve aynı dosyada tutmamız gerekecek, bunu yapabiliriz ama artık verilerimiz anlamlı bir veri olmaktan çıkar.
  • Aynı topicte tutarak, anlamlı/ayırt edici verileri nasıl elde edebiliriz?
    Farklı routelardan gelen ResponseLog’u aynı topicte tutarak ayırt edici hale getirebiliriz. Bunun için, ResponseLog’a yeni bir property ekleriz ve bu property, route bilgisini tutar ve artık ResponseLog mesajını şu hale getirebiliriz;
    /API/PRODUCTS GET 156 1628171244941
    /API/USERS PUT 50 1628171244941
    Bu değişiklikler sonrası, database tablomuza route’un ayırt edilmesi için bir alan daha eklemeliyiz ve Go ile yazdığımız consumer ve database güncelliyici buna göre şekillenmelidir. Aynı zamanda Health controller’ı ile sunulan verilerinde dışarıdan bir parametre ile filtrelenebilir olması gereklidir.
  • Dosyaya yazma işleminin Web Server tarafından yapılması yerine, consumer tarafından hem database’e insert etme hem de dosyaya yazma işlemi yapılabilirdi.
  • Dashboard’a veri sunuşunun optimize edilmesi gerekiyor, server tarafından sadece son bir saatte olan requestleri filtreleyip sunuyoruz ve Dashboard tarafında ise her seferinde son bir saatlik verileri gruplayıp onları chart’a veriyoruz. Çok fazla istek alan bir server için pek efektif bir yol değil.
    Eğer Dashboard ilk defa veri alıyorsa son bir saatlik verileri alarak, sonraki istekler içinse en son isteğin yapıldığı süreden sonraki kayıtların getirilmesi istenerek chart sadece yeni gelen verilerle birlikte güncellenerek, bu sorun çözülebilir.

--

--

--

https://halilkocaoz.com

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Halil İbrahim Kocaöz

Halil İbrahim Kocaöz

https://halilkocaoz.com

More from Medium

Enhancing Overchute

StaFi r- token Liquidity — An Amazing Solution to DeFi based Liquidity problems

Extracting thermochemical properties from laser absorption spectroscopy (LAS) measurements in…

Archetypal Masculinity in Frank Herbert’s Dune