Yazılım Geliştirme Trendleri 2017/3: Async
Herşey 2009'da Ryan Dahl’in, Multi Thread yerine, Single Thread +Non-Blocking’in daha iyi bir yöntem olduğunu iddia ettiği Node JS sunumuyla başladı diyebiliriz.
Non-blocking’i 2 açıdan da tanımlamak mümkün:
- Bir bilgisayarın kaynaklarının hiçbir zaman “boşuna” bloke edilmemesi
- Program cümleciklerinin hiçbir zaman bir kaynağı “boşuna” bloke etmemesi.
Blocking için bir örnek:
Müdür: “Bana dünün satışlarını getirir misin, bekliyorum..”
Burada bekleyen kaynak (müdür) boşu boşuna bekliyor. Aslında beklerken başka işler yapabilir. Ama kısa süreceğini düşündüğü için, başka bir işe başlamaya veya yarım kalmış başka bir işe devam etmeye değmez diye düşünüyor ve beklemeyi tercih ediyor. Kafasını karıştırmamak için herşeyi sırayla (synchronously) yapmak istiyor.
Müdürümüz Non-Blocking olsaydı şöyle olurdu:
Müdür: “Bana dünün satışlarını getirir misin?” Haydi görüşürüz!
ve müdürümüz “yapılacak listesinde” (event loop) sıradaki işe geçer… Eğer karşısına gene blocking (tamamlanması kendi elinde olmayan, dış kaynaklara bağlı olan) bir iş çıkarsa, gene bir istekte bulunur ve sıradaki işe geçer. Bu arada daha önce istediği işlerden bazıları sonuçlanırsa, “yapılacak işler listesi”ne eklenir. Müdürümüz de o işe kaldığı yerden devam eder. Sonuç, müdürmüz artık hep çalışır, hiç durmaz.
Karşılaştırmayı bu şekilde (müdürümüz Blocking mi, Non-Blocking mi olsun?) yapınca, Non-Blocking’in daha verimli bir yöntem olduğunu söyleyemek zor değil. Ancak karşılaştırmayı şöyle yapmaya çalışırsak, öngörmesi zor bir durumla karşı karşıya kalıyoruz:
A) Non Blocking 1 Müdür VS B) Blocking 200 Müdür
Hangisi daha iyi iş çıkarır? Denklemin sol tarafı (A) hep sabit: 1 Müdürümüz var. Sağ tarafta ise sembolik olarak 200 Müdürümüz var dedik. Ancak bu rakam 300 de olabilir, 1000 de olabilir. Ama sonuçta kısıtlı bir kaynaktan (sayıdan) bahsediyoruz. (Multi thread deyince aklınıza kaç thread geliyorsa)
Ryan Dahl 2009'da denklemin sol tarafının (A) daha verimli olacağını iddia etmişti. Nitekim birçok uygulamada haklı çıktı. Hem de 10 kata, 100 kata varan verimlilik artışlarından bahsedebiliyoruz. Ancak bu durum her tür uygulama için geçerli değil. Yaşanan geçmiş tecrübelere göre şu şekilde bir sınıflandırma yapabiliriz:
- A) CPU kullanımı düşük, çok sayıda işlem (I/O) var ise: Single Thread + Non Blocking
- B) CPU kullanımı yoğun, az sayıda işlem (I/O) var ise Multi Thread + Blocking
İnternetteki bütün siteleri düşünün. Dünyadaki tüm HTTP isteklerinden %99.99'unun A sınıfında olduğunu tahmin etmek zor değil. Bu da Non-Blocking, Single Treading bir mimari sunan Node JS’in HTTP Server’daki haklı zaferini açıklıyor.
Node JS’in başarısının bir başka nedeni de JavaScript tabanlı olması. Ancak bu konuyu daha sonra ele alacağım.
Node JS ve iddiası pazarı alıp götürürken; Microsoft, Java vb. bu paradigmayı hızlıca benimsemek istedi ancak Non-blocking (veya Async) programlama, çok yapısal bir değişiklik olduğu için bu geçiş hiç de kolay olmadı. Neredeyse tüm kütüphanelerin ve mimarilerin (framework) tekrar yazılması, üstüne blocking kod yazmayı öğrenmiş tüm kullanıcıların, async kod yazmaya yönlendirilmesi gerekiyordu ki, bunun kolay bir geçiş olamayacağı aşikardı. Dolayısıyla hem Microsoft tarafı, hem Oracle (Java) karışık (mixed) modeller izlediler.
Bugün Java tarafındaki en yaygın ve kuvvetli yazılım çatısı olan Spring de, ağırlığını Reactor’e (https://projectreactor.io/) vermeye başladı. 5.0 ile artık Spring tarafında da bu paradigma kayışını daha sert yaşayacağız. Ancak uzun bir süre Spring MVC (klasik model) ile paralel ilerleyeceğe benziyor. Bu da bir bagaj demek.
Async programlamanın çok açık bir zaferi ile karşı karşıyayız. Bu da bizi Functional Programming, Promises, Callback ve Rx dünyasına sokuyor.
**
Eğer sıfırdan yazılım kariyerine başlamak istiyorsanız, 3 aylık yoğun programlar düzenliyorum. Bilgi için: https://www.yenikodyazilimkursu.com/
—
Test Invite online sınav sistemi ile tanışın: İşe alım sınavları, Genel Yetenek Testleri ve İngilizce Seviye Tespit Testleri
Video kayıtlı ve zorunlu tam ekran ile güvenli online sınavlar yapmak için: https://www.testinvite.com/lang/tr/online-sinav-sistemi.html