İçeriğe geç →

Microsoft Orleans ile Distributed Virtual Actor Model’e Giriş

Merhaba arkadaşlar.

Bu makale konumda straightforward bir şekilde concurrency problemlerini düşünmeden, distributed bir şekilde high-scale application’lar geliştirebilmemize olanak sağlayan Orleans project konusuna giriş yapmak istiyorum.

Nedir Bu Orleans Project?

Yukarıda da bahsettiğim gibi, concurrency problemlerini düşünmeden high-scale, distributed cloud-based uygulamalar geliştirebilmemiz için Microsoft’un 2014 yılında duyurmuş olduğu bir framework/platform’dur.

Orleans, concurrency ve high-scale gibi problemleri çözebilmek için altyapısında Actor Model yaklaşımını temel almaktadır ve tamamen horizontal scalability‘e odaklanmaktadır.

Actor’ler hakkında bir kaç şey söylemem gerekirse eğer:
  • Her şeyden önce message odaklıdırlar (her bir actor’un, bir mailbox’ı vardır)
  • Tamamen async bir yapıya sahiptirler
  • Her bir aktör, bir diğerinden bağımsızdır (memory share etmezler) ve birbirlerine message gönderebilirler
  • Yüksek performanslara sahiptirler
Peki actor’ler kısaca ne yapar?
  • Birden fazla actor yaratabilirler
  • Message’ı bir diğer actor’e gönderebilirler
  • Bir sonraki message ile, ne yapılacağını belirtirler

Buradan anlayabileceğimiz üzere, message’lar sayesinde actor’ler yaşamlarını sürdürebilmektedirler ve actor’ler bir yığından meydana gelmektedirler. Bu model’in özü, actor’leri temel olarak basit computing units olarak kullanmaktır diyebiliriz. Ayrıca actor’ler state’leri tutabildiği gibi, davranışları da tutabilmektedir ve diğer actor’ler ile message yoluyla iletişim kurabilmektedirler.

Orleans ise actor based bir platform’dur. Actor model, yapısı gereği high availability ve low latency‘i kolaylıkla sağlayabilmektedir. Orleans diğer actor model platform’larının aksine virtual actor abstraction’ı ile reliability ve distributed resource management gibi bir çok complexity’i kendisi handle edip, developer’a herhangi bir ek distributed system problem’leri çıkartmamaktadır.

Ayrıca actor’ler içerisinde single-threaded execution context sunduğundan dolayı, concurrency gibi problemleri düşünmeden geliştirme yapabilmeye de olanak sağlamaktadır. Bunlara ek olarak Orleans tarafında cluster içerisine dynamically olarak node’lar eklenebilmektedir ve yükü bunlara otomatik olarak distribute edebilmektedir de.

Hello World

Dilerseniz konunun devamına hello world düzeyinde örnek bir proje ile devam edelim. Örneğimizi gerçekleştirirken bazı Orleans terimlerine de değiniyor olacağız. Öncelikle buraya tıklayarak, Visual Studio üzerine Microsoft Orleans Tools’u indirelim ve ardından kurulum işlemini gerçekleştirelim. Bu paket ile bir çok initialization işlemlerinden kurtulacağız ve bir kaç wrapper’a sahip olacağız.

“OrleansHelloWorld” isminde bir blank solution oluşturalım ve içerisine aşağıdaki gibi “HelloWorldGrainInterfaces” isminde bir Orleans Grain Interface Collection projesi ekleyelim.

Ekledikten sonra otomatik olarak oluşan “IGrain1” interface’ini “IHello” olarak güncelleyerek, aşağıdaki gibi düzenleyelim.

Peki nedir bu Grain dersek eğer, Orleans içerisindeki actor’ler, Grain olarak adlandırılmaktadır. Bunun dışında eklemiş olduğumuz “SayHello” method’una dikkat edersek eğer, Orleans implemente edilecek tüm method’ları async olarak istemektedir. Su sebeple task based olarak kodlama yapmamız gerekmektedir.

Şimdi ise concrete grain’i oluşturabilmek için solution içerisine, “HelloWorldGrains” isminde bir Orleans Grain Class Collection projesi ekleyelim ve ardından “HelloWorldGrainInterfaces” projesini referans olarak gösterelim. Projenin eklenmesinden sonra default olarak elen “Grain1” isimli class’ı, “HelloGrain” olarak güncelleyelim ve aşağıdaki gibi kodlayalım.

public class HelloGrain : Grain, IHello { public Task SayHello(string name) { return Task.FromResult($”Hello {name}”); } } }

Grain implementasyonu için “Grain” abstract class’ını ve oluşturmuş olduğumuz “IHello” interface’ini implemente ettik.

Şimdi sıra geldi grain’leri host edeceğimiz silo’yu oluşturmaya. Silo üzerinden self-hosted olarak oluşturmuş olduğumuz “HelloGrain” i active edip, invoke edeceğiz. Bunun için öncelikle “HelloWorld” isminde bir Orleans Dev/Test Host projesi oluşturalım.

Projenin oluşturulmasının ardından “HelloWorldGrainInterfaces” ve “HelloWorldGrains” projelerini referans olarak ekleyelim. “Program.cs” i açarsanız otomatik olarak Orleans tarafından, Orleans test silo host template’i geldiğini görebilirsiniz.

Template’e dikkat edersek, “OrleansHost” isminde kendi appdomain’ini oluşturuyor ve init kısmında ise “InitSilo” method’u ile, “OrleansHostWrapper” üzerinden silo’nun initializing işlemlerini gerçekleştiriyor.

Aşağıdaki kod satırlarına dikkat edersek eğer burada oluşturmuş olduğumuz grain’i, “GrainClient” üzerinden active edip invoke ediyoruz.

“HelloWorld” projesini çalıştıralım ve sonucuna bir bakalım.

İlk akış içerisinde dikkat edersek, en aşağıda “Successfully started Orleans silo ‘GOKGOKALP’ as a Primary node.” mesajını göreceğiz. Test silo host’unu kendi process’imiz üzerinde başlattığımız için, otomatik bir şekilde primary node olarak belirlemiştir. Akışın devamına baktığımızda ise:

Silo active olmasının ardından, “HelloGrain” i active edip invoke etmiştir. Bunun sonucunda ise “Hello Gökhan” mesaj’ını görebilmekteyiz.

Orleans’a giriş konusuna göre, umarım yeterli bilgiler paylaşabilmişimdir. Orleans üzerindeki çalışmalarım devam ediyor ve sonraki makalelerimde ise stateful bir grain nasıl tasarlanır, bir grain down olursa eğer leaf grain ile process kaldığı yerden nasıl devam edebilir gibi örnekleri gerçekleştirmeye çalışacağım.

Örnek projeye buradan erişebilirsiniz.

Ayrıca Orleans ile ilgili bazı örneklere, kendi github hesapları üzerinden de erişebilirsiniz.

https://github.com/dotnet/orleans

Takipte kalın…

Bu makale toplam (1253) kez okunmuştur.

21
0



Kategori: .NET Actor Programming Model Architectural

Yorumlar

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*