Olaya Dayalı Programlama — Event Driven Programming

Wikipedia üzerinde bu mimarinin Türkçe isimlendirmeleri olarak şunlar listelenmiştir: olaya dayalı programlama, olay güdümlü programlama veya olay yönlendirmeli programlama.

Olaya Dayalı Programlama (ODP) yazılım sektöründe giderek daha sık kullanılan mimari yaklaşımlardan biridir. Adından anlaşılacağı gibi bu yaklaşımın temelinde olay yer almaktadır. ODP konusuna geçmeden önce birkaç terim üzerinde duralım.

Olay (Event) Nedir?

İngilizce olan event kelimesi dilimizde olay olarak karşılığını bulmuştur. Yazılım sektöründe alınan bir aksiyonun sistem üzerinde durum değişikliği yaratması olarak anlam kazanmıştır. Örneğin sistem üzerinde yeni bir ürün girdisinin yapılması Ürün Yaratıldı adında bir olay ile anlatılabilir.

Aksiyonların tamamlandığını, diğer bir deyişle olayın nihayete erdiğini temsil ettikleri için olay isimleri geçmiş zamanla biterler.

Olaya Dayalı Programlama Nedir?

Herhangi bir olay gerçekleştiği zaman, diğer bileşenlerin olayları takip ederek tepki vermesi ile sistemin görevlerini yerine getirecek şekilde tasarlanmasına Olaya Dayalı Programlama denir. ODP üç önemli bileşenden oluşur. Bunlar; yayımlayıcı (publisher), gözlemleyici (subscriber) ve mesaj sistemidir.

Yayımlayıcı aldığı aksiyona bağlı olarak, oluşan değişikliği sisteme bildiren bileşendir.

Gözlemleyici sistemde oluşabilecek bir olayı takip eden, olay gerçekleştiği zaman buna tepki veren bileşendir.

Mesaj sistemi, yayımlayıcların ve gözlemleyicilerin arasında yer alır. Bu iki bileşenin birbirinden izole olmasını sağlar. Yayımlayıcı oluşan olaya dair mesajını mesaj sistemine iletir. Gözlemleyici ise mesaj sistemi aracılığı ile değişiklikleri takip eder.

Event Sourcing ile Event Driven Programming (Olaya Dayalı Programlama) birbiri ile karıştırılmamalıdır. Event Sourcing’de verinin son hali yerine verinin durumunu etkileyen olayların kaydedilmesi gerekmektedir. Olaya Dayalı Programlama yönteminde ise olayların kaydedilmesi gereklilik değildir. Aksiyonlar yerine getirildikten sonra olaya ait mesajın mesajlaşma sistemine bildirilmesi yeterlidir.

Uygulama bazında kullanılabileceği gibi sistem bazında da bu yaklaşım kullanılabilir. Hangi ölçekte ODP yaptığınıza göre birkaç yeni terim hayatınıza girecektir.

- Domain Olayı (Domain Event)

Domain olayı, uygulama seviyesinde ODP yaklaşımının kullanılması durumunda karşımıza çıkan terimlerden biridir. Domain olayı, bir domain içinde olup biten aksiyonları temsil ederler ve dışarıdan (domainin dışından) gözlemlenemezler.

Örneğimizi Stok Yönetimi (Stock Management) konusu üzerinden verelim. Stok Yönetimi projesi üzerinde bir ürün oluştuğu zaman sıfır değeriyle stok oluşturduğumuzu düşünelim. Bu durumda akışımız aşağıdaki gibi olacaktır.

T1) Ürün yaratma isteği uygulamamıza erişir.

T2) Ürün yaratılıp veri saklama aracımıza (db, dosya, vb.) kaydedilir. Buna bağlı olarak Ürün Yaratıldı olayına ait mesaj mesajlaşma sistemine gönderilir.

T3) Ürün Yaratıldı olayını takip eden gözlemcilerden biri olan Stok Servisi, bu mesajın bir kopyasını üzerine alır.

T4) Stok Servisi, mesajdan faydalanarak sıfır değerli bir stok oluşturur ve Stok Yaratıldı olayını mesajlaşma sistemine iletir.

T5) Tepki verilecek bir olay kalmadığı zaman uygulamamız uygulamaya gelen isteğin cevabını verir.

Ürün yaratılması ve Stok yaratılması işlemi bağımlı işlemlerdir yani transactional olarak tamamlanırlar. Ürün Yaratıldı olayı bu sebeple dış dünyaya yayınlanmaz çünkü henüz domain içerisindeki işlemler tamamlanmamıştır. Stok Servisi kendi işlemlerini yürütürken bir hata alırsa veya sürecin uygun ilerlemediğine kanaat getirirse, yaratılan ürün kayıt edildiği ortamdan silinecektir. Eğer Ürün Yaratıldı bilgisi dış dünya ile paylaşılsaydı ve işlem başarılı bir şekilde tamamlanmasaydı, uygulama dış dünyaya yanlış bilgi vermiş olacaktı.

Domain olayları transaction tamamlanmadan önce oluşur. Yine domain olaylarına verilecek tepkiler transaction tamamlanmadan önce verilir.

- Entegrasyon Olayı (Integration Event)

Entegrasyon olayı, ODP yaklaşımının tüm sisteme yayılması durumunda karşımıza çıkar. Bir domain içerisinde meydana gelmiş ve sistemin geri kalanı için önem arz eden olayların sistemde belirmesidir.

Bir önceki örneğimizi geliştirelim ve entegrasyon olaylarını inceleyelim. Elimizde Stok Yönetimi projesinin yanı sıra bir de Ürün Yönetimi adında bir proje olduğunu düşünelim. Ürün Yönetimi uygulaması (ürün domaini, product domain) kendi üzerinde bir ürün yarattığı zaman, Stok Yönetimi uygulaması (stok domaini, inventory domain) ürünün Stok Yönetimi’ni ilgilendiren bilgilerini içeren bir kopyasını oluşturacaktır ve sıfır değerli stok üretecektir.

Yukarıdaki çizimde tüm sistemin ortak kullandığı bir mesajlaşma platformu görünmektedir. Bu platforma gönderilen olay mesajlarına entegrasyon olayı denir. Bir domain içerisinde olan olaylar buraya gönderilerek sitemin diğer parçalarının da kendini bu olaylara göre adapte etmesi beklenir.

Olaya Dayalı Programlama tekniğinde, sistem içerisindeki parçalar olabildiğince birbirinden izole edilir. Bu şekilde hem bakımı kolay, hem test edilmesi kolay, hem de geliştirmeye açık bir uygulama/sistem elde etmiş oluruz.

var software = ConvertFrom(caffeine)