Merhaba Arkadaşlar,
Eğitmenlik yaptığım dönemlerde .Net'in en zor alanlarından birisi de Remoting idi. Konu aslında Client-Server mantığına uygun olacak şekilde farklı process'ler arasında veri alışverişinin yapılmasından ibaretti ancak uygulaması web servis geliştirmek kadar kolay olmuyordu. TCP/IP bazlı ağlarda .Net Remoting epeyce iyi performans sergilemekteydi. Özellikle ağ üzerinde hareket eden nesnelerin Binary olarak serileşmesi ve TCP/IP protokolünün devrede olması hız avantajı sağlıyordu. Zaman içerisinde servis odaklı yaklaşımlarda kullanılan WCF gibi alt yapılar .Net Remoting yerine tercih edilmeye başlandı. Dağıtık Uygulamalar(Distributed Applications) olarak geçen bu konu Ruby dilinde de kullanılabiliyor. Üstelik çok çok daha basit. Standart Ruby kurulumu ile birlikte gelen drb modülü bu işler için ele alınmakta(dRuby, Masatoshi Seki tarafından geliştirilmiş bir üründür ve standart Ruby kütüphanesi içerisinde yer almaktadır)
Aslında dağıtık uygulamaların çıkış amacı şöyle özetlenebilir; Bir bilgisayar problemini tek seferde N sayıda process üzerinden çözümlemeye çalışmak. Zamanında SETI projesi vardı. Sanıyorum ki bu vakaya verilebilecek en güzel örneklerden birisidir. 2011de kaynak yetersizliğinden duran proje 2012de tekrar hayata geçirilmişti. Son durumu nedir bilemiyorum ama katılımcı olmak için bu adrese bakılabilir.
Ruby dünyasında bu iş için drb kütüphanesini kullanıyoruz. Tahmin edileceği üzere bir sunucu ve bu suncuya çalıştığı süre boyunca bağlanacak istemciler söz konusu. Bu ikili dağıtık bir Ruby uygulamasının iki ana parçasını oluşturmakta. Sunucu ve istemcilerin temel özelliklerini aşağıdaki şekilde olduğu gibi sıralayabiliriz.
Peki basit bir sunucu ve bu sunucu ile iletişim kuracak istemci(ler) nasıl geliştirilebilirler? Yoksa aşağıdaki ekran görüntülerindeki gibi olabilir mi?
Önce sunucu uygulama;
ardından istemci uygulama;
ve çalışma zamanında olanlar
Aslında örnek son derece basit. Sunucu uygulama üzerinde bir dizi tanımlıyor ve 8890 nolu port üzerinden yayına çıkıyoruz. Uygulamayı açık tutmak için sonsuz bir döngümüz var. Döngü içerisinde 5er saniyelik duraksamalarımız ve sonrasında anlık olarak objects isimli dizi içeriğini ekrana basan kod parçamız bulunuyor. Terminal ekranına bir çeşit log bıraktığımızı düşünebiliriz.
İstemci tarafındaki kod parçasında ise 8890 nolu porta bağlanıyor ve new_with_uri metodu ile uzak nesneyi yakalıyoruz. Uzak nesne serileştirilebilir formatta olan bir dizi aslında. Dolayısıyla istemci tarafında << gibi operatörleri kullanarak sunucu tarafındaki sürece ait olan diziye yeni elemanlar ekleyebilir veya dizi bazlı çeşitli işlemler gerçekleştirebiliriz. Dahası bu dizi içeriğindeki nesneleri 8890 nolu porttan hizmet eden sunucuya bağlanan tüm istemciler için kullanabiliriz. İşte en yalın haliyle Distributed Ruby' ye merhaba demiş olduk(Bu arada dRuby konusu ile ilgili olarak Amazon'daki şu kitabı tavsiye ederim)
Bir başka ipucunda görüşmek dileğiyle hepinize mutlu günler dilerim.