Akka ile Reactive, Concurrent ve Distributed Uygulamalar
Son zamanların popüler kütüphanesi Akka, başlıktan da anlaşıldığı üzere reactive, concurrent ve distributed uygulamalar geliştirmek için oluşturulmuş bir kütüphane. Resmi olarak Java ve Scala dilleri için geliştirilen bu kütüphanenin .NET gibi ortamlara port edilmiş versiyonlarını da kullanmak mümkün. Bu yazıda Akka ile beraber concurrent mekanizmalar, paralel hesaplamalar ve dağıtık mimarilerde efektif iş yapma gibi konulardan bahsedip Akka ile ilgili bazı temel noktalara değineceğiz.
Terminoloji
Akka’ya başlamadan önce bazı terminolojileri, konsept ve kavramları bilmek faydalı olacaktır. Bunlar;
- Sync ve Async
- Reactive
- Blocking, Non Blocking
- Concurrency, Deadlock
Akka
Akka temelde concurrent haberleşmelerde, dağıtık sistemlerde, message-driven, event-driven modele sahip Scala ile yazılmıs bir JVM toolkit’tir. Bir framework değildir var olan uygulamalara/projelere kolayca adapte edilebilir.
Akka actor model ile birlikte tüm haberleşme(sistemler/threadler/uygulamalar) altyapısını soyutlayarak çok basite indirger. Yaptığı soyutlama ile concurrent uygulamalar ve paralel hesaplamalar gibi zor modelleme işlemlerini oldukça kolaylaştırmaktadır. Basite indiger cümlesinden kastımız ise basit işler yapmak değil, zor ve karmaşık olan işlemleri soyutlayarak sizi sadece uygulamanızın logic’i ile uğraşmanızı sağlamasıdır.
Örneğin Java’da Thread’leri yönetmek zordur. Core Java içerisinde benim en çok önem verdiğim konulardan biri Thread’lerdir. Java bize zengin bir API sunmasına rağmen Thread yönetimi karmaşık ve zordur. Dağıtık mimarileri gerçekleyebilmek, ölçeklenebilir sistemler ile birlikte failure durumlarında sistemin çalışmasını sürdürebilir durumda olması, concurrent gibi konular gerçekten zor ve kafa yorulması gereken konulardır. Akka bize bu konuda yardımcı olacağını vaad ediyor.
Akka, Scala ile yazılmış olmasına rağmen JVM üzerinde koştuğu için Java ile de birlikte çalışabiliyor. Bu sayede Java biliyor iseniz Scala, Scala biliyor iseniz Java öğrenmek zorunda kalmayacaksınız.
Son zamanlarda Java ve/veya Scala ile Play/Akka kullanarak high performance, scalable uygulamalar yazmak oldukça çekici geliyor. Veri büyüdükçe veriye erişim ve kullanma zorlaşacağından dolayı gelecekte eş zamanlı işler yapabilen, reactive olan ve concurrent olabilen tüm ürün/araç vs daha önemli olacaktır.
Actors
Akka, concurrent’i sağlayabilmek için Actor Model’ini implemente eder. Yaptığı soyutlama ile Thread’lerin oluşturulması, zamanlanması, Thread’ler arası haberleşme, mesajlaşma, senkronize olma durumları basite indirgenir. Actor model’de herşey bir actor’dur. Actor, kendisine gelen uyarı/event/message için local decision yapabilir(hesaplama, persist, ws call vs), farklı actor’ler oluşturabilir, geri mesaj gönderebilir, mesajı ignore edebilir. Actor based bir sistem içerisinde tüm soyutlamalar yapılır.
Herhangi bir Actor, bilinen bir objeden farklı değildir. Kabaca mesaj alır/verir. Bunu yaparken ise actor ile sistem arasında bir katman oluşturulur, bu katman ile birlikte tüm kompleks karmaşıklık Akka toolkit tarafından soyutlanır.
Actor’lerin belli başlı karekteristikleri/davranışları vardır;
- Asenkron olarak iletişimi sağlar, method call ile değil.
- Kendi state’ini kendisi düzenler/günceller.
- Child actor oluşturabilir.
- Diğer bir actor ile konuşabilir.
- Kendini durdurabilir.
Actor modelinin çözdüğü belli başlı problemler var. Bunların başında geleneksel OOP mantığında bulunan bir takım kısıtlamalar gelir. OOP’de obje(adı O1 olsun) üzerinden methodA adında bir method çağrılır. methodA da O2 objesi üzerinden methodB methodunu çağırır. Bu durumda O1 üzerindeki methodA methodunun çalışıp sonlanması için O2 üzerindeki methodB methodunun da çalışıp sonlanması gerekir. Design pattern kavramında ki loose coupling/tightly coupling programlama seviyesine kadar inmiş olur.
Pure OOP ile zaten karmaşık ve zor olan yapı multi-thread olan uygulamalar ile yönetilmesi oldukça zor olan yapılara doğru evriliyorlar. Akka ise Actor model ile birlikte bu işi kolaylaştırır. En basit anlatımı ile her actor birbiri ile mesaj göndererek iletişime geçer. OOP da ise lock mekanizmaları, senkronize bloklar vs tonla yönetilmesi gereken iş vardır.
Akka ile örnek olması açısından aynı yapıya bakalım.
1 Comment
Samet
6 Haziran 2017 at 15:14Hım, ben bunu iyice bir araştırayım. Teşekkürler yazı için.