Büyüyen ve gelişen teknoloji dünyasında, kompleks problemlere çözüm sağlarken çoğu zaman büyük yanılgılar içerisinde olabiliyoruz. “Yaaa onun olması zor, milyonda 1 ihtimal” diye atladığımız bazı yazılım kavramlarının saniyede 3 milyardan fazla iş yapabilen işlemcilerde çalıştığını unutuyoruz. Problem olana kadar bu yanılgıların çok farkında olamıyoruz genellikle. Özellike birden fazla parçadan oluşan dağıtık sistemlerde bu yanılgılar daha fazla oluyor. 90’larda Peter Deutcsh‘ın ortaya çıkardığı “The Eight Fallacies of Distributed Computing”, günümüzde hala çoğumuzun yanılgıya düştüğü konular olarak karşımıza çıkıyor.
Her ne kadar dağıtık sistemler için söylemiş olsa bile, günümüzdeki çoğu yazılım çözümleri için dikkat edilebilecek başlıklar olduklarını düşünüyorum. Açıkcası sadece bu yanılgılardan bahsetmek istemiyorum, bu yanılgılara düşmemek için çözümlerimize farklı nasıl bakabilir ile de kafanızı biraz karıştıracağım. 🙂
1- Network güvenilir…
(The network is reliable)
İş yerlerinde, yerel ağ içinde olduğumuz ve genellikle sahip olduğu kapasite zorlanmadığı için network’lerin sağlam olduğu, problem yaşanmayacağını düşünürüz. Donanım olarak artık switch’ler ve router’lar farklı özellikler ile bu problemleri çok hissettirmese de, her zaman sağlam bir network üzerinde çalışacağız diye kesin bir yargı yok. En basitinden, bilinçsizce sökülen güç kabloları yaşanan şeyler…Network üzerinde farklı sistemlerin bir araya gelmesi ile oluşan çözümlerde özellikle, network problemleri ciddi sorunlara yol açabilir. Dolayısıyla network güvenilir değil…
Bu yanılgıya düşmemek için yazılımlarımızda çeşitli iyileştirmeleri başta geliştirebiliriz. Mesela kaçımız web servis request’lerinde HttpTimeoutException‘ı dikkate alıp, bir retry mekanizması oluşturuyor. Ya da ACK/NACK(acknowledge messages) yapısı kurup, request’lerin sağlıklı gittiğini doğruluyor… Network’ün güvenilir olduğu yanılgısı içerisinde olursak, en basitinden bir e-ticaret sitesinden bir bankaya yapılan request’de oluşan timeout’ları atlayabiliriz. “Yapılan işlemler başarılı mı yapıldı, ya yapılmadıysa…Bir daha request yapalım o zaman…Ama ya başarılı olduysa, çift işlem olmasın…”
2- Network’deki geçikme sıfır…
(Latency is zero)
“Latency” olarak adlandırılan bir kavram vardır; bir verinin bir noktadan, bir diğer noktaya taşınmasında geçen süreye denir. Ve ne yazık ki bu süreyi sıfıra yakın varsayarız genelde… Genelde lokal network’lerde(LAN) çalıştığımızdan böyle bir yanılgıya sahip oluyoruz. Geliştirdiğimiz uygulamalar internet üzerinde çalışacak ya da geniş bir kapalı network’lerde çalışacaksa, mutlaka ama mutlaka performans testi yapmalıyız. İstanbul’da LAN’da sorunsuz çalışırken, internete açtığınız uygulamaya 1 milyar nüfuslu Çin’den erişmek istediklerinde network’deki git-gel’lerden dolayı kesin problem yaşarsınız… Ben şimdiden söyliyim…
Mesela bir örnek olması için; genelde uygulama ve veri tabanı arasındaki iletişim bu açıdan problem yaratır. O/R Mapping araçları ile lazy-loading kavramı hayatımıza girince, uygulama-veri tabanı arası git gellerin artması network’de geçikme problemlerine sebep olabilir. DTO’ların varlık sebeplerinden bir tanesi de bu problem zaten… Bundan dolayı sadece ihtiyacımız olduğu zaman network’e çıkmalıyız, çıkmamız gerektiği durumlarda da kullanacağımız verinin hepsini almalıyız.