Yazılım Mimarileri ve Tasarım Desenleri Üzerine

Uzun Süren API Request’lerini Ölçeklendirme Yöntemleri

Uzun Süren API Request'lerini Ölçeklendirme YöntemleriMerhaba,

Geliştirdiğimiz uygulamalarımızda illa ki tamamlanması dakikalarca süren bir endpoint’in ortaya çıkması neredeyse kaçınılmazdır. Misal olarak; yıllarca toplanan verilerin istatistiki olarak raporlanması gerektiği durumlarda, toplu veri aktarımlarında veya response döndürülmeden önce birkaç servise ve veritabanına yayılan iş akışı süreçlerinde geliştirdiğimiz endpoint’ler, ister istemez haddinden fazla tedirginlik yaratan bekleme süreleri ile varlık gösterebiliyorlar. Ki böyle endpoint’lerin varlığından ziyade ortaya çıkardıkları sorunlar bizler için risk teşkil ediyor. Nedir bu sorunlar? diye sorarsanız… Bu endpoint’lerden beslenen servislerin ya da bizzat kullanıcıların dakikalar boyunca bekletiliyor olmalarıdır! Eğer bekleyen bir servisse timeout’a düşme ihtimali vardır, yok eğer bir kullanıcıysa en iyi ihtimalle bunalma ihtimali… Ve tüm bu süreç boyunca API’da bu request’i işlem süresi boyunca açık tutacaktır ve bu durumda da sunucu açısından bir thread’in ve concurrency bütçesi söz konusu olacaktır. Hele hele böyle bir durumda bu endpoint’te zuhur edecek olan küçük bir trafik artışı, API’nin geri kalanını da potansiyel olarak çökertecektir. Bu içeriğimizde bu tarz sorunlara karşı nasıl yaklaşımlar ve çözümler uygulamamız gerektiğine dair istişarede bulunacak ve çalışmalarımızı daha idealize hale getirmeye çalışıyor olacağız. O halde buyurun başlayalım…

Özellikle son zamanlarda bu konuda çok fazla yanlış uygulama gözlemlediğimi itiraf edebilirim. Muhtemelen insanlar, genellikle “API request’i 5 dakika sürüyor ama sorun değil” diye düşünmektedirler. Halbuki asıl problem kodun uzun sürmesi değil, HTTP’nin doğasının buna uygun olmamasıdır!

Önce şu soruyu sormakta fayda vardır… Bir API request’inin uzun sürmesi neden problemdir?

Uzun bir request bitene kadar TCP bağlantısı ve HTTP connection açık kalacak, Kestrel request context’i süre boyunca yaşayacak ve arada Nginx, IIS, API Gateway ve Load Balancer varsa onlar da isteğin tamamlanmasını timeout sayaçları çalışır vaziyette bekleyecektir. Tüm bunların yanında tabi ki de client’da request’in yanıtını (response) bekleyecektir. Şimdi düşünün… Böyle bir request’i 1000 kullanıcı aynı anda yaparsa ne olacak?

Ayrıca uzun request süreçlerinde birçok sistemin(Nginx, IIS, Azure App Service, API Gateway, Load Balancer ve Browser) timeout süreleri birbirlerinden farklı olduğu için ciddi bir risk söz konusu olacaktır. Şöyle ki; diyelim ki client timeout aldı ve retry mekanizması ile tekrar request’te bulundu. Eee, bu durumda tekrar aynı süreç başlatılacak ve netice olarak iki kez bu iş yükü cereyan etmiş olacaktır! (Bu tarz durumlara karşın idempotency cidden önem kazanmaktadır)

Peki çözüm ne hoca? dediğinizi duyar gibiyim… Doğrusunu söylemek gerekirse tek bir çözüm yok! Duruma göre uygulanması gereken farklı desenler var… Ve bence bunları aşağıdaki gibi sürelere göre kategorize edebiliriz:

İş Süresi Yaklaşım
< 2 sn Senkron HTTP
2 – 10 sn Duruma göre senkron veya asenkron süreç
10 sn+ Background processing
Dakikalar Queue + Worker
Saatler Workflow / Job scheduler

Hadi şimdi gelin tek tek desenleri doğrusuyla ve yanlışıyla incelemeye başlayalım.

Burada incelediğimiz yöntemlerde ele aldığımız bellek içi (in-memory) kuyruk (queue) yaklaşımına ek olarak, bir veritabanı tabanlı çözümden de yararlanılabilir. Esas olan, belirlenen amaca ulaşmaktır. Bu yaklaşımların temel hedefi, özellikle endpoint’lerde meydana gelebilecek ani yük artışları karşısında sistemi daha dayanıklı ve güvenilir hâle getirmektir.

Kısaca özetlersek;

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Örnek çalışmaya aşağıdaki GitHub reposundan erişebilirsiniz.
https://github.com/gncyyldz/AspNetCore.ApiScalingPatterns
Bu repository, ilgili konuya dair örnek çalışmanın kaynak kodlarını ve mimari yapısını içermektedir. Detaylar için GitHub üzerinden incelemede bulunabilirsiniz.


GitHub’da Görüntüle →

Exit mobile version