Arda Çetinkaya Yazılım ve arada kendim ile ilgili saçmaladıklarım…

2015 Nisan ayında, Microsoft, Azure platformunda yeni bir hizmetini tanıtmıştı. Azure Service Fabric olarak adlandırılan bu hizmet ile güvenilir, kolay yönetilebilir, erişilebilir ve en önemlisi ölçeklendirilebilir dağıtık sistemler geliştirmek mümkün hale geliyordu. Hala “Preview” olan bu hizmet, bu sene farklı yeni özellikleri ile bir adım daha ileriye gelir umarım. Son bir kaç zamandır kurcalama fırsatım olduğu için, kısaca neymiş, ne değilmiş biraz bahsetmek istedim…

Azure Service Fabric(ASF), Azure içinde, kendi yönettiğimiz ölçeklendirilebilir sistemler geliştirmemiz için sunulan bir hizmet olarak da tanımlanabilir. AFS aslında Azure’un diğer başka hizmetlerinde de, Microsoft’un kullandığı bir hizmet. Azure SQL Database, DocumentDB ve Event Hubs gibi bir çok hizmet bu yapı üstünde ölçeklenip çalışıyor. Kısacası, Azure’un içindeki bir servisin dışarıya açılması da diyebiliriz, Azure Service Fabric için.

Microservices konsepti son bir kaç yıldır oldukça popüler bir konu olarak, dağıtık sistem tasarımlarında kendine yer ediniyor. Azure Service Fabric hizmetini bu noktada, Microservices mimari sitilini sistemlerinde kullanmak isteyenlere cloud tarafında olan bir çözüm olarak düşünebiliriz. Tek başına, kendi iş mantığına ve çalışma ortamına sahip bir çok servisi kullanarak geliştirilen uygulamaları ve bu servisleri Azure Service Fabric üzerinde geliştirip, barındırıp yönetebiliyoruz.

service-fabric-overview

AFS üzerinde iki farklı programlama modeli API olarak bizlere sunuluyor. Reliable Actors API ve Reliable Services API… Geliştirilecek servislerin yaptığı işler ve amaçlarına göre seçim yapılması gereken bu API’lar farklı ihtiyaçlar için tasarlanmış.

Reliable Actors API, bir birinden tamamen bağımsız, durumunu ve iş kurallarını kendi içinde tutan, dış kaynak erişimi olmayan, tek thread’li servis ihtiyaçları için tercih edilmelidir. Mesela, belli formattaki büyük Excel dosyalarını parse edip, kaydetmek için bu API’yi tercih edebilirsiniz.

Reliable Services API ise, farklı bileşenler ile konuşması gereken, geliştireceğiniz servisler içinde state gerektiren durumlar olduğunda ve servis iletişimini kendiniz yönetmek istediğinizde tercih edebileceğiniz bir programlama API’si. Önümüzdeki günlerde bunlara örnek kodlar ile daha fazla zaman ayıracağım. O yüzden şimdi kafanız biraz karıştıysa, önümüzdeki yazılarda ayınlanma yaşayacaksınız. :)

Azure Service Fabric üzerindeki servisleriniz ihtiyaçınıza göre bu iki modelden biri olabilir. Yani illa bir tanesi olmak durumunda diye bir şey yok. Bir servisiniz Reliable Actors API ile geliştirilmiş olup, diğer başka bir servis Reliable Services API ile geliştirilmiş olabilir. Bu noktada, önemli olan her iki API’de geliştirmiş olduğunuz servisler, ölçeklenebilir ve erişilebilir olacaktır.

Service-fabric-local-cluster

Bu programlama modellerinden, biraz daha Azure Service Fabric bileşenlerine geçelim. Yukarıda bahsetmiş olduğum API’lere göre geliştirdiğiniz servisler, ASF üzerinde belli bir düzen içinde bulunuyor. Kısaca ne olduklarına bakalım.

Devam

Lego’ya olan ilgimi Twitter ya da Instagram‘dan takip edenler bilir, takip etmeyenlerde bilemez, o yüzden takip etsinler; diye reklam kokan bir giriş ile uzun zamandan sonraki yazıma başlıyorum…Siz Lego falan ne alaka demeden, hala bu yaşımda Lego alıp, saatlerce onlarla uğraşan biri olduğumu belirtim. Yaşasın içimdeki çocuk… Peki ne alaka?

Lego1Efenimm, şimdi Türkiye’deki Lego distribütorlüğünü Adore Oyuncak yapıyor. Dolayısıyla zaman zaman takip ettiğim bir yer. Ama hangi ürünler gelmiş, neler bitmiş falan sürekli mağazalarına gidip bakmak her zaman mümkün değil. Gelmesini beklediğim ürünlerin gelip gelmeyeceklerinin kesin olmaması, gelirlerse ne zaman geleceklerinin de belli olmaması, içimdeki çocuğun en büyük sıkıntısı. Neyse ki, internet çağında yaşıyoruz da, firmanın internet sitesinden bir şekil kontrol edebiliyoruz. Ama içimdeki sabırsız çocuk her gün, her gün internetteki sayfasına bakmaktan da sıkılmış durumda. Lanet olsun içimdeki çocuğa…

Lego3İçimdeki çocuğu biraz olsun sakinleştirmek için, Cloud’un nimetlerinden neden yararlanmıyorum diye düşündüm bir akşam…Hani böyle sıkılırsınız ya, hiç bir şey yapmak istemezsiniz falan, ahaa da öyle bir akşam. Yoksa hiç işim olmaz, ne uğraşıcam…(yersen)

Azure’da, node.js ile basit bir iş(web jobs) yapıp hem sıkıcı akşamıma renk katmak, hem de içimdeki çocuğu biraz sakinleştirmek üzere işe koyuldum. Çok uzun uzun anlatmak istemiyorum. Oldukça basit çünkü… Madde madde özetleyerekten, hangi teknolojileri, hangi amaçla kullandığımı vurgulayarak, Cloud ve basit diğer API’ler ile neler yapabileceğimizi paylaşmak istiyorum sadece.

Basit özetlemek gerekirse yaptığım şey, belli bir zamanda, otomatik olarak çalışan bir kod parçası ile, bir web sitesini “parse” edip, belli bir alanındaki değeri bir yerde saklayıp, bu değerin değişimini e-mail olarak kendime atmak.

  • Belli bir zamanda otomatik olarak çalışması için Azure‘da ki WebJobs bileşenini kullandım.
  • Çalışan kod, sunucu tarafında event-driven I/O işlemleri için tercih edilebilecek olan node.js‘de çalışan basit bir javascript. node.js tercih etmiş olmamın sebebi, kesinlike kısa sürede yapmak istemem. Başka kodlarla yazılmış programlarıda Azure WebJobs’da çalıştırabilirsiniz. (*.exe, *.bat, *.py, *.jar, *.php…)
  • node.js’de html sitesini parse etmek için cheerio modülünü tercih ettim
  • Bildirimleri e-mail olarak yapabilmek için SendGrid e-mail alt yapısını tercih ettim. Hem ücretsiz olması, hem de Azure’da ve node.js’de modülünün olması tercih sebebimdi.
  • Azure’un Storage Service‘ini de, parse ettiğim veriyi saklamak için tercih ettim. Tek basit bir değer saklayacağım için ve Azure’un node.js’deki SDK‘sını kurcalamak için güzel bir fırsat.

Anahtar kelimeleri verdikten sonra aşağıda kodu da bulabilirsiniz. Açıkcası çok fazla ayrıntısına girmek istemedim. Basit bir ihtiyaçlarımızı, nasıl çözebileceğimizi vurgulamak ve biraz merak uyandırmak için umarım faydası olur. İlerleyen günlerde belki daha ayrıntılı olarak da bahsedebilirim ama beklemeden sorularınız olursa yorum kısmında ya da e-mail ile bana iletebilirsiniz.

Güvenlik konusu yazılım için oldukça ilginç bir nokta. Herkesin bildiği ama farkında olmadığı garip bir konu. Gerçek hayatta da aslında böyle. Başımıza kötü bir olay gelmediği sürece, güvenliğe çok dikkat etmiyoruz. Gelişen dünya düzeninde, gündelik hayatta bu farkındalık artık çok daha fazla olsa da yazılım konusunda gereken önemi hala tam veremiyoruz.

Bilişim dünyasının bir parçası olmaktan kaçınamadığımız bu çağda, teknolojinin ve yazılımın hayatımızın bir parçası olması güvenlik konusunun daha önemli olmasını sağlıyor aslında. Çoğu işimizi bilgisayar ile yapabiliyor, internet ile 7/24 her yere bağlanabiliyor ve ekonomik/sosyal ihtiyaçlarımızı elimizden düşürmediğimiz telefonlar ile her yerden karşılayabiliyoruz. Bunları yaparken son kullanıcı olarak, bu sistemleri geliştirenler olarak, yazılımları kodlayanlar olarak ya da bu sistemlere destek veren kişiler olarak hepimizin güvenlik konusunda dikkat etmesi gereken şeyler var. Kısacası, güvenlik hepimizin problemi

Guvenlik

Hepimizin problemi olduğu için, herkesin kendince dikkat etmesi noktalar var. “Şifrelerimizi doğum yılımız ya da 123456 gibi ardaşık sayılar yapmıyoruz” ya da “SSL sertifikası olmayan sitelerden kredi kartımızla alışveriş yapmıyoruz”,”Şifrelerimizi kağıtlara yazıp, sağa sola yapıştırmıyoruz” gibi şeylerden çok bahsetmeye gerek yok. Bu farkındalık daha hızlı bir şekilde oluşmaya başlıyor artık. IT sektöründe çalışan kişiler olarak, bu farkındalığın oluşmasında biz ne kadar rol oynuyoruz ya da neler yapıyoruz biraz da artık bunu sorgulamak lazım.

“123456”‘nın şifre olarak kullanılmaması gerektiğini bilmemize rağmen, şifre gerektiren üyelik sistemleri geliştirirken “123456”nın şifre olarak seçilememesine, yazdığı kodda kaç yazılımcı dikkat ediyor; merak ediyorum şahsen… Hala bir çok uygulama, üyelik aşamasında bu tarz şeylere izin veriyor. Ya da SSL sertifikası olmayan sitelerde verilerimizi paylaşmıyorken, neden kendi geliştirdiğimiz uygulamalarda SSL’i zorunlu tutmuyoruz. Statik olarak kullanıcı isimlerini ve hatta şifreleri hala uygulamaların içinde “hard-coded” tutan yazılımlar var mesela. Aynı şekilde IP adresleri de mevcut…

Guvenlik

Neler güvenli ve neden güvenli olması gerekiyor?” sorusu aslında en başta hepimizin sorması ve hepimizin beraber cevap bulması gereken bir soru. Sistem güvenliği, yazılım güvenliği, veri güvenliği ve daha farklı gruplamalar ile tüm ilgili paydaşların ilgisini gerektiren konular var. Sistem açısından; belli ağ içerisinde, belli bir sunucunun belli port’ları önemli olurken, veri sistemi tarafında da, verinin öneminden dolayı sunucu ve disk çeşiti önemli olabilir. Kritik olan, bu noktada bunların hep beraberce konuşulması. Neler güvenli ve neden güvenli olması sorularındaki cevaplar net olduğu zaman bazı şeyler daha kolay olacaktır.

Geliştirdiğimiz sistemlerin dışarıya açılan, son kullanıcıya hitap eden kısmı, “uygulamalar” oluyor genelde. Web, mobil(cep telefonu,tablet..vs) ya da masa üstü gibi farklı ön yüzler ile artık hayatımızın her alanında karşımıza çıkan “uygulamaları” geliştirirken çeşitli güvenlik prensiplerine daha fazla önem vermek gerekiyor sanırsam. Televizyondaki bir uygulamadan havale yapabiliyor olmak, ya da tüm kişisel bilgilerimizi herkesle paylaşabilmek(?) kötü niyetli insanların güvenlik açıklarını tespit etmesinde büyük motivasyon sağlıyor. Uygulamaları geliştirirken de benzer motivasyonun bizde olması lazım.

Uygulamaların girdilerinin doğrulanması, kripto işlemlerinin belli standartlar içerisinde yapılması, yetkilendirme adımlarına dikkat edilmesi gibi daha bir çok çeşitli güvenlik prensipleri artık yazılım geliştirme sürecimizin bir artık parçası olmalı. Sonradan yapılacak güvenlik iyileştirmeleri daha zorlayıcı olacağından baştan eşeği sağlam kazığa bağlamakta fayda var. Mesela yazılım geliştirirken atladığımız “input validation“lar, kötü niyetli insanlar için açık kapı oluşturabiliyor. “SQL Injection” ya da “XSS” bunun bilinen en büyük örnekleri… Kullanılan teknolojiye göre “Buffer overflow” hatalarından hafızaya müdahale edip, istenmeyen komutların çalıştırılabilmesi, hatalardan sistemin açık kapılarını bulup erişim yetkisi olmayan verilere erişim gibi konular uygulamalarımızı geliştirirken engelleyebileceğimiz bir kaç örnek. Genelde sistemlere ya da son kullanıcıya güvenip, bazı varsayımlar içerisinde bulunduğumuz için bu tarz noktalara dikkat edemiyoruz. “Hiç kimseye güvenme” yaklaşımı bu noktada geliştirdiğimiz uygulamalar içinde geçerli…Zaman kötü, kolla kodu.. 😛

Guvenlik

IoT(Internet of Things) ile uygulamaların(yazılımların) artık her yerde olacak olması ile güvenlik konuları daha önemli olacak. Güvenlik konusuna gereken özeni vermezsek, teknoloji bir çözüm olmaktan çok bir problem olmaya başlayacaktır, benden söylemesi… Umarım bilişim dünyası insanı olarak bu konulara daha fazla önem verip, nelerin, neden güvenli olması gerektiğini daha fazla sorgulayıp, güvenli sistemler geliştirmeyi amaçlarız.

Microsoft’un geliştiriciler için sanal olarak düzenlediği Connect(); etkinliğinde bugün neler oldu kısa kısa özetlemeye çalışacağım. Merak edenler için derlemiş olalım. Daha fazla ayrıntı ve etkinliğin videoları için tabi ki https://channel9.msdn.com adresini ziyaret etmenizi öneririm.

Connect()

.NET Core ve ASP.NET 5 RC versiyonu çıktı.

1 yılı aşkın zamandır açık kaynak olarak geliştirilen .NET Core ve ASP.NET 5, Release Candiate olarak bugün itibari ile RTM versiyonuna yaklaştı. Bir derleme yazısı olduğu için, uzun uzun neler değişti, neler geldi tek tek anlatmayacağım. Yayınlanan “Release Notes”‘lardan tüm ayrıntılara bakabilirsiniz.

RC ile hem .NET Core’un hem de ASP.NET 5’i “Go Live” lisans modeli ile üretim ortamlarında da isterseniz kullanabilirsiniz. ASP.NET 5’in son versiyonunu http://get.asp.net adresinden indirebilirsiniz.

Entity Framework 7 RC versiyonu çıktı.

.NET Core ile beraber Entity Framework 7‘nin de Release Candiate versiyonu çıktı. Takip edenleriniz bilecektir. EF 6.x ve EF 7 şeklinde bir farklılaşma oldu. Yaklaşım 1 yıldır, .NET Core ve açık kaynak vizyonuna uygun bir şekilde EF 7 de geliştirilmekteydi. Biraz daha lightweight olması ve cross-platform olması ile geliştirme yatırımın büyük bir kısmı buna gidiyordu. Bugün itibari ile RTM’e en yakın versiyonu yayınlanmış oldu. RTM’e kadar bu versiyonuna yeni bir özellik eklenmeyecek ve bildirilen bug’ların düzeltilmesi ve dökümantasyon geliştirilecek. Entity Framework 7 ile ilgili geliştirmelere başlamak, neler oldu, neler değişti bunları takip etmek için http://docs.efproject.net/en/latest/ adresini takip edebilirsiniz.

System.Data.SqlClient da artık cross-platform

.NET Framework’ün veri erişim yöntemleri açısından en çok tercih edilen System.Data.SqlClient da artık cross platform. Yani OS X ve Linux’da da bu uzayadının sınıflarını falan kullanmak mümkün artık. Tabi ki eksiklikleri var. Named Pipes desteği yok, sadece TCP bağlantı desteği var gibi bir kaç handikapı olsa da ilerleyen zaman içerisinde bütün bu eksiklerde giderilecektir. https://gist.github.com/cartermp/3c826e1d15577268eda6 adresinden biraz daha ayrıntılı bilgilere ulaşabilirsiniz.

Visual Studio Code açık kaynak oldu…

Cross-platform olarak geçtiğimiz aylarda Visual Studio Code ile tanışmıştık hatırlarsanız. Artık kendisi de açık kaynak dünyasında yerini aldı. Node.js’den, Go’ya, PHP’den Javascript’e, C#’a, HTML’e kadar aklınıza gelebilecek bir çok geliştirme dilini yazabildiğimiz bu basit ama etkili text editörü aynı zamanda “extensions” özelliğini kazandı. Yani artık bu editör için eklenti yazıp, eklenti indirebileceğiniz.

Visual Studio MarketPlace Preview oldu…

Eklenti demişken, daha önce Visual Studio Gallery olarak bildiğimiz, Visual Studio’nun eklenti havuzu çeşitlendi ve Visual Studio MarketPlace duyuruldu. Daha sonra Visual Studio Gallery’nin de yerini alacak bu eklenti havuzu, Visual Studio versiyonları için çeşitli eklentiler indirip, eklentiler yükleyebileceğiniz bir yer olacak. https://marketplace.visualstudio.com/ adresinden eklentilere göz atabilirsiniz. Şimdilik biraz az ama kısa zamanda hızlı bir şekilde artacaktır. Aynı zamanda buradan Visual Studio üyelik modeli de sunulmaya başlanıyor. Yıllık ya da aylık üyelik seçenekleri ile Visual Studio’nun özelliklerinden yararlanabileceksiniz.

Visual Studio Online’da isim değişikliği ve dahası…

Daha önce de isim değişikliği olmuştu ama bu sefer sanırım artık son. Visual Studio’nun TFS ile entegre olan “cloud” ürünü Visual Studio Online artık Visual Studio Team Services. Tabi ki sadece isim değişikliği söz konusu değil. Code Search özelliği, JMeter ile Load test özelliği, test adımlarında yeni özellikler ve daha bir çok buradan öğrenebilirsiniz.

Azure Service Fabric, microservice tabanlı uygulamalar için Preview oldu…

En son Build// etkinliğinde duyurulan, microservices tabanlı uygulamalar geliştirmek ve yönetmek için Azure’da hizmet veren Azure Service Fabric bugün Preview oldu.

Azure ile ilgili tabi başka yeniliklerde duyuruldu. Mesela Azure SDK 2.8 versiyonu çıktı.

 

Geliştiriciler için yeni Visual Studio Dev Essentials programı…

Microsoft, geliştiriciler için yeni bir ücretsiz programı da bugün duyurdu. Visual Studio Dev Essentials adı altındaki bu programla, geliştiricilerin bir çok Microsoft ürününe ücretsiz erişim sağlaması mümkün olacak. Xamarin, Pluralsight gibi farklı şirketlerin ürün ve servislerini de içerecek bu programdan yararlanmak için https://www.visualstudio.com/products/visual-studio-dev-essentials-vs adresini ziyaret etmeniz yeterli.

Microsoft artık çok hızlı çıktı üreten bir yazılım ve servis firması haline geldi. Dolayısıyla yetişmek zor. Umarım başlangıç için bu derleme biraz faydalı olmuştur. Zamanınız olursa, yarın da sanal olarak devam edecek etkinlik. Kaçırmayın derim.

 

vNext kavramı ile tanıştığımız Microsoft’un farklı işletim sistemlerinde de çalışan yeni framework’ü .NET Core ile ilgili önceki yazılarda birşeyler paylaşmaya çalışmıştım hatırlarsanız. Önümüzdeki günlerde RC1, 2016’nın ilk çeyreğinde de RTM versiyonun çıkması planlanan bu framework’e ben de ilerleyen zaman içerisinde biraz daha değinmek istiyorum. Bu zamana kadar çok fazla değinmek istemedim çünkü hala gelişmekte olan ve tam stabil halini almış bir versiyon henüz yok. Ama yavaş yavaş RTM’e yaklaştığımız için, yavaş yavaş ben de karalayabilirim sanırım artık.

.NET Core, Microsoft tarafından açık kaynak olarak geliştirilen, dışarıdan da katkı alan bir framework. Dolayısıyla tüm gelişme anına tanıklık edebiliyorsunuz. GitHub‘dan takip edip, siz de katkıda bulunabilirsiniz. Bunu özellikle hatırlattıktan sonra .NET Core içindeki Dependency Injection(DI) kavramından bahsetmeye çalışacağım. DI, .NET Core’un bir parçası olarak, ASP.NET 5’in de temel bir bileşeni olarak karşımıza çıkıyor. Tüm framework içerisindeki bağlılıkları yönetmek ve geliştirmek bu yeni yaklaşım ile beraber daha kolay bir hal alıyor. Kısaca ve basitçe yeni DI yaklaşımı ile .NET Core’da, tek bir yerde uygulamamızın bağlılıkları yönetebiliyoruz.  Farklı DI bileşenlerini de, bu yapının yerine geçebilecek şekilde kullanabiliyoruz tabi ki.

.NET Core içinde DI yapısı, Service Locator tasarım kalıbı ile tasarlanmış. Microsoft.Framework.DependencyInjection.IServiceCollection arayüzünden geliştirilen ServiceCollection üzerinden bağlılıklar oluşturuluyor. Uygulamalardaki bağlılıkları, uygulamaların kullandığı servisler olarak düşünebilirsiniz yani.

            var services = new ServiceCollection();

ServiceCollection sınıfı ile servisleri, yaşam döngülerine göre ekleyebiliyoruz.

            services.AddTransien<IUserService>(s=> new UserManagementService());
            services.AddInstance(typeof(IUserService),new UserManagementService());
            services.AddScoped(typeof(IUserService),s=> new UserManagementService());
            services.AddSingleton(typeof(IUserService),s=> new UserManagementService());

Bağlılıkları 4 tane farklı yaşam döngüsü ile tanımlayabiliyoruz.

  • AddTransient: Her seferinde bağlı nesnenin tekrar yaratılmasını sağlar
  • AddSingleton: Bağlı nesneye erişildiğinde tek bir nesne yaratılmasını sağlar
  • AddInstance: Her nest çağrısında, tanımlanan nesneyi sağlar
  • AddScoped: ServiceCollection’nın kapsamına göre nesnenin yaratılmasını sağlar.

Bu yaşam döngülere göre oluşturulan nesnelere; daha doğru isim ile servislere, IServiceProvider arayüzünden geliştirilen sağlayıcı sınıfı ile ulaşabiliyoruz.


            IServiceProvider provider = services.BuildServiceProvider();
            
            IUserService userService = provider.GetService<IUserService>(); 
            var userName = userService.GetUserName();

Yine tabi ki kendi sağlayıcı sınıfımızı yazmak mümkün. Sağlayıcı sınıfından gelen GetService() metodu ile bağlı olan nesneye/servise erişebiliyoruz.

VS Code

DI yeni ASP.NET 5 ve MVC 6’da built-in bir özellik olarak karşımıza çıkıyor. MVC tarafında çeşitlik konfigürasyon yöntemleri ile web uygulamalarındaki bağlılıkları yönetmek oldukça kolaylaşıyor. Bu yazıda bahsettiğim konunun örnek kodunu GitHub’a ekledim, buradan eklemeler ve düzenlemeler yapabilirsiniz diyerekten bitirelim.Bu giriş yazısı ile umarım biraz merak uyandırmayı başarmışımdır.

Bu yazıyı CoreCLR’ın Beta8 versiyonu ile yazdım. Bu versiyondan sonra Microsoft.Framework.DependencyInjection.* namespace’i Microsoft.Extensions.DependencyInjection.* olarak değişiyor.

 

Biraz geç oldu ama kaldığımız yerden devam edelim. Bir önceki yazılarda dağıtık sistemlerdeki yanılgılardan bahsetmeye başlamıştım. İlk 4 tanesini bitirmiş, geri kalanlarının üstünden de bir sonraki yazıda geçeceğimi belirtmiştim…İşte bir sonraki yazı.

8fallacies

5- Topoloji değişmez

(Topology doesn’t change)

NetworkTopologySistemleri oluştururken, ilk tasarımımız hiç değişmeyeceğini düşünmek bu yanılgıya düşmemizin en büyük sebebi. Hiç müdahale etmesek bile zaman faktörü bu değişikliğe sebep olacaktır. Bundan dolayı sistem tasarımlarımızı yaparken dış etkenlere dikkat etmemiz gerekir. IP değişiklikleri, hatta biraz daha kapsamlısı network değişiklikleri, firewall benzeri güvenlik katmanları ve benzeri fiziksel parçalar dağıtık sistemler tasarlarken mutlaka dikkat etmemiz gereken konular. Bu tarz fiziksel yapıların ayrılmış ve soyutlanmış olması çok önemli.  En basitinden “hard-coded” IP adresleri kullanıyor olmamız, değişen network’de problem yaratacaktır. Dolayısıyla DNS isimleri tercih edilmeli. İletişim protokolü olarak, daha esnek yapıların(mesela multicast) tercih edilmesi topolojideki değişikliklerden minimum derecede etkilenmemiz sağlayacaktır.

6- Sadece bir tane yönetici vardır

(There is one administrator)

system-admin-horrorKüçük sistemlerde belki bir tane “admin” gerçekten(?) vardır. Ama sistemler büyüdükçe ve dağıtık bir yapı oluştuğu zaman, bu sistemlerde yetkili olan; “admin” rolündeki kişi sayısıda artar. Bunun farkında olmadan, sistemin bir parçasında yapılan bir değişiklik ciddi sıkıntılara yol açabilir. Dolayısıyla sistemleri tasarlarken, birden fazla farklı sistem yöneticisi olabileceğinin farkında olmak lazım. Sistemin farklı bileşenlerine yapılan güncellemeler ya da patch geçişleri, geçildiği bileşeni iyileştirebileceği gibi o bileşeni kullanan diğer parçaları olumsuz etkileyebilir. Tabi bir sistemde ne kadar çok “admin” varsa o sistemde kordineli bir çalışma yapmak o kadar zordur. LDAP ya da Domain’de yapılan bir değişiklik, uygulama sunucusundaki “Authentication” modunu etkileyebileceği için, bu tarz değişiklikler tüm sistem yöneticilerinin kordineli çalışmasıyla yapılmalıdır.

 

7- Veri aktarım maliyeti sıfırdır.

(Transport cost is zero)

Veri aktarım maliyeti sıfır olsaydı gerçekten, “leased line” kavramı hayatımızda olmazdı. Dağıtık sistemlerin en önemli noktalarından biri, sistemler arasındaki verinin taşınmasının kolay olmadığı. Firmalar, dağıtık olarak tasarlardıkları sistemleri için özel network’ler kurup, network seviyesinde izole olmak için binlerce dolar harcıyor.  En basitinden böyle düşünürken maliyet sıfır değil. Ama buradaki maliyet sadece bu değil.  Günümüzde artık veri aktarırken 1sn.’nin üzerinde bir zaman problem olabiliyor. Bu zaman kavramı işte maliyetin diğer bir ayağı. Mesela network’de taşınan verinini serialization ve deserialization işlemlerinin uzun sürmesi(-ki uzun sürer) bu zaman maliyeti için önemli bir noktadır. Ama çok farkında olmayız… Bu noktada hem yazılım, hem donanım maliyetlerine dikkat edebildiğimiz, kontrol edip yönetebildiğimiz sistemler tasarlayabilmek önemli. Her ne kadar donanımsal olarak ölçeklendirebilsekte, aynı şekilde yazılımsal olarakta ölçeklendirebileceğimiz aktarım yöntemlerini düşünmemiz mutlaka gerekecektir.

8- Ağ homojendir

(The network is homogeneous)

Günümüzde artık hiç bir network homojen değil.  Tüm sistemlerin homojen olabileceği yanılgısına sanırım artık kimse düşmüyordur. Düşen varsa da, umarım biran önce farkına varır gerçeklerin. Artık öyle bir zamandayız ki, sistemlerin bir kısmı Java olurken, başka bir kısmı .NET, başka bir kısmı ise node.js olabiliyor. Veri platformu olarak Oracle tercih eden bir sistem, NoSQL veri platformunda herhangi bir ürünü kullanan sistemle beraber çalışabiliyor. SOAP mesajları alan bir sistem, başka biriyle JSON ile konuşuyor. Dolasıyla sistemleri tasarlarken bu gerçeklerin farkında olmak lazım. .NET’in ilk zamanlarında *.asmx servislerinin java ile uyumsuzluğu bir çok kişinin yaşamış olduğu bir problemdir diye düşünüyorum. Dağıtık sistemlerin farklı özelliklere sahip bileşenler ile geliştirilebileceğini ve bu bileşenlerin birlikte çalışabilmesinin sağlanması oldukça önemli. Yoksa dağıtık sistem olmasının bir önemi olmuyor zaten…

Umarım biraz olsun faydalı olmuştur ve bazı noktalara neden dikkat etmemiz gerektiğini anlatabilmişimdir. Daha az yanılgıya düştüğümüz sistemler dileyerek kapatalım konuyu…Kapattık…

Bir kaç önceki yazımda dağıtık sistemler ile ilgili bir şeyler karalamaya çalışmıştım. Daha çok kurumsal oluşumlarda büyük ve orta ölçekli çözüm ve sistemler, dağıtık sistemlere benzerlik gösterse de, Cloud kavramı ile çeşitlenen yazılım çözümlerini anlamak, hatta bu çözümlerin bir parçası olmak için temel bir kaç anahtar kelimeyi bilmek ve anlamak gerekiyor diye düşünüyorum. Bu yüzden dağıtık sistemler ile ilgili bir kaç şey daha karalayacağım, bir önceki yazının sonunda belirttiğim gibi…

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.

8fallacies

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)

cayb0İş 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)

impossibruLatency” 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.

Devam