Reaktif programlama: veri akışlarıyla engellemeden çalışmak
Sözlük

Reaktif programlama: veri akışlarıyla engellemeden çalışmak

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 3 dk okuma

Reaktif programlama, veriyi akış olarak ele alan ve engellemeden çalışan bir yazılım yaklaşımıdır. Geri basıncı, WebFlux ilişkisini ve sınırlarını okuyun.

Reaktif programlama nedir?

Reaktif programlama, veriyi tek seferlik bir değer olarak değil, zaman içinde gelen bir akış olarak ele alan programlama yaklaşımıdır. Kod, akışa gelen her olaya tepki verecek şekilde tanımlanır; bir sonuç beklenirken çalışan iş parçacığı bloke edilmez. Böylece sınırlı sayıdaki iş parçacığı çok sayıda eşzamanlı isteği yönetebilir.

Bu yaklaşım asenkron çalışma, bildirimsel dönüşüm zincirleri ve veri üreticisiyle tüketicisi arasındaki hız farkının yönetilmesi üzerine kuruludur. Java dünyasında bu fikir, Reactive Streams belirtimi ve onu uygulayan kütüphanelerle yaygınlaşmıştır.

Reaktif sistem ile reaktif programlama aynı mı?

Değil. Reactive Manifesto, reaktif sistemi şu özelliklerle tanımlar: duyarlı, dayanıklı, esnek ve mesaj güdümlü. Bunlar bir mimari hedefidir. Reaktif programlama ise bu hedefe yaklaşmak için kullanılabilecek bir kodlama tekniğidir.

Bir uygulama reaktif kütüphane kullanıp yine de dayanıksız olabilir; öte yandan reaktif programlama kullanmadan da mesaj tabanlı, dayanıklı bir sistem kurulabilir. Terimlerin karıştırılması, ekiplerin reaktif kodu yazmakla sistemin gerçekten esnek olmasını eşdeğer sanmasına yol açar.

Nasıl çalışır: yayıncı, abone ve geri basınç

Modelin merkezinde yayıncı ile abone vardır. Yayıncı veriyi üretir, abone tüketir. Aralarına araya giren operatörler akışı dönüştürür: filtreler, birleştirir, eşler. Hiçbir şey abone olunmadan akmaya başlamaz; zincir yalnızca tanım olarak kalır.

Geri basınç, abonenin yayıncıya ne kadar veri kaldırabileceğini bildirmesidir. Üretici tüketiciden hızlıysa veri birikir ve bellek dolar; geri basınç bu birikimi önler. Tüketici talep ettiği kadar veri alır, fazlası bekletilir ya da elenir. Kararlı bir uygulamanın ayırt edici özelliklerinden biri budur.

Küçük bir örnek

Örneğin bir sipariş servisi, her istek için veritabanından müşteriyi, ardından bir dış serviste stok durumunu sorgulasın. Klasik modelde her istek bir iş parçacığını yanıt gelene kadar bekletir. Yük arttığında iş parçacığı havuzu tükenir ve yeni istekler sıraya girer.

Reaktif modelde müşteri sorgusu başlatılır, iş parçacığı serbest bırakılır; yanıt geldiğinde zincirin sonraki adımı çalışır. Aynı iş parçacıkları başka isteklere hizmet verir. Kazanç, yalnızca bekleme süresinin çoğunu dış sistemlerde geçiren, giriş çıkış ağırlıklı işlerde belirginleşir.

WebFlux ve Spring ekosistemi

Spring Framework'te reaktif web yığınının adı WebFlux'tur. Klasik MVC modeli istek başına bir iş parçacığı kullanırken WebFlux, engellemeyen bir çalışma ortamı üzerinde akış tipleriyle çalışır. Tek bir değeri temsil eden ve birden çok değeri temsil eden ayrı tipler bulunur.

WebFlux'un işe yaraması için zincirdeki her halkanın engellemeyen olması gerekir. Veri erişimi için reaktif sürücüler kullanılmalıdır; zincirin ortasında engelleyen bir çağrı varsa kazanç kaybolur. Bu yüzden WebFlux'a geçiş yalnızca bağımlılığı değiştirmek değil, veri katmanını ve test yaklaşımını da yeniden düşünmek anlamına gelir.

Ne zaman kullanılmalı, ne zaman kullanılmamalı?

Reaktif yaklaşım, çok sayıda eşzamanlı bağlantının yönetildiği, akış niteliğindeki veriyle çalışan ve çok sayıda dış servise bağlanan uygulamalarda anlamlıdır. Gerçek zamanlı bildirimler ve akış tabanlı entegrasyonlar tipik örneklerdir.

Buna karşılık düşük trafikli, işlem ağırlıklı ve engelleyen kütüphanelere bağlı bir uygulamada reaktif model maliyet getirir: hata ayıklama zorlaşır, yığın izleri okunmaz hâle gelir ve ekibin öğrenme eğrisi uzar. Seçim, beklenen yüke ve ekibin deneyimine göre yapılmalıdır.

Mindset programlarında nerede yer alır?

Mindset'in Spring Boot İleri Seviye: Reactive ve WebFlux eğitimi; reaktif programlama temelleri, WebFlux ile servis geliştirme, reaktif veri erişimi, dayanıklılık ve geri basınç yönetimi, test ve hata ayıklama, performans, izleme ve üretim modüllerini kapsar.

İlgili Mindset programı

Spring Boot İleri Seviye: Reactive ve WebFlux

Sık sorulanlar

Sık sorulan sorular

Reaktif programlama her uygulamayı hızlandırır mı?

Hayır. Kazanç, ağırlıklı olarak giriş çıkış beklemesi yüksek ve eşzamanlı bağlantısı çok olan uygulamalarda ortaya çıkar. İşlemci yoğun hesaplamalarda tek bir isteğin süresi kısalmaz. Hız beklentisi yerine ölçeklenebilirlik ve kaynak kullanımı beklentisiyle değerlendirmek gerekir.

Geri basınç tam olarak neyi çözer?

Veriyi üreten taraf, tüketenden hızlı olduğunda ara bellekler dolar ve sistem çökebilir. Geri basınç, tüketicinin kaldırabildiği kadar talep etmesini sağlar. Böylece hız farkı, bellek taşması yerine kontrollü bir yavaşlamaya dönüşür.

Reaktif kodu test etmek neden farklıdır?

Akış, abone olunana kadar çalışmadığı ve sonuçlar zaman içinde geldiği için klasik atama ve karşılaştırma yetmez. Akışı adım adım doğrulayan test araçları ve sanal zaman kullanımı gerekir. Hata ayıklamada da zincirin hangi halkasında sorun çıktığını izlemek ek özen ister.

Reaktif öğrenmeden önce neyi bilmek gerekir?

Asenkron çalışma, iş parçacığı ve eşzamanlılık kavramlarını, ayrıca fonksiyonel tarzdaki dönüşüm zincirlerini rahat okuyabilmek gerekir. Spring ile servis geliştirmişseniz, klasik modeldeki sınırlamayı deneyimlemek reaktif modelin neden ortaya çıktığını anlamayı kolaylaştırır.

Reaktif Programlama Nedir? Akış ve Geri Basınç