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.
3- Bant genişliği sonsuz…
(Bandwidth is infinite)
Verinin bir noktadan bir diğer noktaya taşınma süresinden bahsetmiştik, bir de verinin boyutu, daha doğrusu büyüklüğü var. Günümüzde artık çok fazla sorun değil. Özellikle internet ortamında, internet sağlayıcılar bir şekilde bu problem oluşmaması için teknik alt yapılarını geliştiriyor. Ama bu alt yapılar gelişsede verinin boyutunun artması da hızlanıyor. Streaming, IPTV, VoIP gibi teknolojiler ile oldukça büyük verileri işlememiz gerekebiliyor. Bilmiyorum kaçınız hatırlar ama internetin yaygınlaşmaya başladığı dönemlerde, internetteki bir çok site “Bandwidth Limit Exceeded” diye hata verir ve erişilemezdi. Özetle network’de taşıyabileceğimiz verinin boyutunun bir sınırı var. Bu boyutu kontrol altında tutmalıyız ki problem yaşamayalım. Büyük verileri parça, parça taşıyan yapılar oluşturmak ya da taşınan veriyi sıkıştırmak gibi çözümler dikkate alınabilir. Diğer 7 madde kadar geçerli olduğunu artık düşünmüyorum ama yine de bir kenarda dursun…
4- Network güvence altında…
(The network is secure)
Network’ün güvenilir(korunaklı) olduğu ilk aşamada eminim herkes düşünür. En azından çok fazla umursamaz. Firewall’larımız var nede olsa…Biiiip, yanlış cevap… Açıkcası ne kadar network’ün güvenli olduğunu sansanız da, gerçekten güvenli olup olmadığı her zaman tartışılacaktır. Ta ki, sisteminiz herhangi başka bir network’e bağlı olmayana kadar…Ki o zaman da, USB,CD falan gibi dış bileşenlere açık olacaktır. Dolayısıyla sistemler hiç bir zaman güvende olmayacaktır. Bu yanılgıya düşmemek için, hiç bir zaman %100 güvenlikli olabileceğinizi unutmak lazım. Eee peki ne yapacağız… Açıkcası bu konu hakkında sürekli konuşmak ve sürekli çalışmak yapabileceğiniz tek doğru şey. Konuşmak derken, sisteminizin paydaşları sürekli bilgilendirmek, nasıl ve hangi verileri nasıl tutuyorsunuz, bunların erişim yetkileri nasıl, hangi yollar ile denetleniyor ve korunuyor falan filan… Hatta hatta müşteri verisi ile çalışıyorsanız, avukat ya da müşteri ilişkileri birimlerinizi de bu konular hakkında bilgilendirmekte fayda var…
Çok fazla yormamak için şimdilik burada bir ara veriyorum. Geri kalan 4 yanılgıdan da bir sonraki yazıda bahsedeceğim…Şimdilik hoşçakalın… 🙂