Article Image
Article Image
read

Actor model nedir?

Bilgisayar bilimlerindeki actor, eş zamanlı hesaplamayı ele alan kavramsal bir modeldir. Actorlarda, sistem bileşenlerinin birbiri ile nasıl etkileşime girmesi gerektiğine ilişkin bazı genel kurallar tanımlanmıştır. Bu modeli kullanan en ünlü dil Erlang‘dır.

Actor

Actor, eş zamanlı hesaplamanın en temel birimidir. Actor bir mesajı alır ve o mesaja dayalı çeşitli hesaplamalar yapar. Bu düşünce object-oriented dillerde sahip olduğumuz şeylere çok benzer. Bir obje, mesaj alır (ki bu object-orientedteki fonksiyon çağrısına denk gelir) ve hangi mesajı aldığına (fonksiyonun yaptığı işe göre) bağlı olarak bir şeyler yapar.

Temel fark, actorlerin birbirlerinden tamamen izole olması ve memoryi asla paylaşmamasıdır. Ayrıca bir actorün başka bir actor tarafından hiçbir zaman değiştirilemediği özel durumların da olduğunu belirtmek gerekir.

Yalnız öküz, çifte koşulmaz

Yani tek bir actor ile actor modeli çalışmaz. Bu yüzden sisteme birlikte girmeleri gerekiyor. Actor modelinde her şey bir actordür ve bir actorün başka actore mesaj gönderebilmesi için actorlerin adreslerinin olması gerekir.

Her Actor’ün bir posta kutusu var

Birden çok actor aynı anda çalışabilse de bir actorün mesajları sadece sıralı olarak işleyebileceğini anlamak önemlidir. Bu aynı actore 3 mesaj gönderirseniz bir seferde 1 mesajı işleyebileceğiniz anlamına geliyor. Bu 3 mesajın aynı anda yürütülmesi için 3 actor oluşturmanız ve her birine bir mesaj göndermeniz gerekir. Mesaj actore asynchronous olarak gönderilir. Actor o sırada başka bir mesajı işliyorsa gönderilen mesaj actorün posta kutusuna kaydedilir.

Actor'ler, asynchronous mesajlar göndererek birbirleriyle iletişim kurar. Bu mesajlar, işlenene kadar diğer actor'lerin posta kutularında saklanır.

Bir actor ne yapar?

Actor bir mesaj aldığı zaman 3 şeyden birini yapar.

  1. Daha fazla actor yaratabilir.
  2. Diğer actorlere mesaj gönderebilir.
  3. Bir sonraki mesajda ne yapacağını söyleyebilir.

İlk iki madde oldukça basittir fakat sonuncusu ilginçtir.

Daha önce bir actorün özel durumlarının olduğundan bahsetmiştim. Bu madde, özel durumun alacağı bir sonraki mesaj için actorün nasıl davranacağını tanımlar. Yani actorlerin özel durumlarını nasıl değiştirebileceğinden bahseder. (Biz buna actorlerde mutasyon diyoruz)

Hesap makinesi gibi davranan bir actor sisteminden bahsedelim. Ve başlangıç durumunda actorün statei basitçe sayı olan 0 olsun. Bu aktör orjinal durumunu değiştirmeden add(1) mesajı aldığında alacağı bir sonraki mesaj için state 1 olarak değişecek.

Hata toleransı

Erlang "let it crash" yani “çökmesine izin ver” felsefesini tanıttı. Bu düşünce defansif bir programlamaya ihtiyaç olmadan, olabilecek tüm sorunları öngörmeye çalışarak bunları handle etmeyle uğraşmamak için ortaya çıktı. Çünkü basitçe her başarısız noktayı düşünmenin bir yolu yoktur.

Scala’da basit bir aktor modeli oluşturalım

akka.actor.Actor, classından miras alarak receive methodu olan yeni bir actor classı oluşturalım.

Bunun için ilk olarak yeni bir SBT projesi oluşturup Akka için gerekli bağımlılıklari build.sbt dosyamıza ekleyelim.

name := "Create Actor #1"
version := "1.0"
scalaVersion := "2.10.0"
resolvers += "Typesafe Repository" at "http://repo.typesafe.com/typesafe/releases/"
libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.1.2"

Ardından “hello” mesajını aldığında cevap verebilen bir actor tanımlayalım.

import akka.actor.Actor
import akka.actor.ActorSystem
import akka.actor.Props

class HelloActor extends Actor { 
  def receive = {
    case "hello" => println("hello back at you")
    case _ => println("huh?") }
}

object Main extends App {
  // an actor needs an ActorSystem
  val system = ActorSystem("HelloSystem") // create and start the actor
  val helloActor = system.actorOf(Props[HelloActor], name = "helloactor")
  
  // send the actor two messages
  helloActor ! "hello"
  helloActor ! "how are you?"
  // shut down the system
  system.shutdown
}

Bunu Hello.scala olarak projemize kaydedelim. Ve sbt run ile çalıştıralım.

[info] Running Main
  hello back at you
  huh?  

Kodu inceleyelim

Sırayla kodun açıklamasını yapalım.

  • import adımları actor için gerekli bağımlılıkları yüklüyor. Burada Actor, ActorSystem ve Probs, actor oluşturmamız için gerekli bağımlılıklar.
  • Actor modelimize HelloActor ismini verdik.
  • HelloActor, alınan mesajın içeriğine göre yapacağı işleri belirleyen receive methoduna sahip
  • HelloActor, hello mesajını alırsa "hello back at you" mesajını diğer tüm mesajlarda "huh" mesajını ekrana yazdırır.
  • Main objesi HelloActorü test etmek için yaratılmıştır.
  • Mainde bir şeyler başlatmak için ActorSysteme ihtiyaç duyulmaktadır. ActorSystem argüman olarak bir isim alır, bu yüzden sisteme anlamlı bir isim verdik. İsim yalnızca [a-zA-Z0-9] karakterlerini alan bir kelimeden oluşur. “-“ yada boşluk gibi karakterler gelemez.
  • Actorler oluşturulduğunda otomatik olarak (asynchronous olarak) başlatılır, bu nedenle herhangi bir run veya start yöntemini aramanıza gerek yoktur.
  • Mainde oluşturulan 2 actore, hello ve how are you? mesajı gönderilir.
  • helloActor, println ifadelerini çalıştırarak iletilere yanıt verir.
  • Daha sonra ActorSystem kapatılır.

İlk actorünüzü oluşturmanız için gereken her şey bu kadar.

Eğer anlamadığınız bir yer var ise alt kısımdaki disqus’a yorum yapabilirsiniz.

İçerikte herhangi bir eksiklik veyahut yanlış olduğunu düşündüğünüz bir kısım var ise mail atmaktan çekinmeyin.

Blog Logo

Abdullah Velioglu


Published

Image

A Snowball Effect

A Personal Blog For Abdullah

Back to Overview