Event Driven Design Mimarisi Nedir
Olayları yöneterek bağımsızlığı yakalayın
Olay Odaklı Tasarım: Yazılım Geliştirmede Bir Adım Önde Olmak
Yazılım geliştirme sürecinde, olay odaklı tasarım (Event Driven Design) giderek daha fazla popülerlik kazanmaktadır. Bu yazıda, olay odaklı tasarımın ne olduğunu, nasıl çalıştığını ve gerçek dünya örnekleriyle nasıl uygulandığını detaylı bir şekilde inceleyeceğiz.
Giriş
Yazılım geliştirme dünyasında, olay odaklı tasarımın önemi giderek artmaktadır. Geleneksel, monolitik mimarilerin yerini alan bu yaklaşım, sistemlerin daha esnek, ölçeklenebilir ve dayanıklı olmasını sağlamaktadır. Bu yazıda, olay odaklı tasarımın temel prensiplerini, avantajlarını ve nasıl uygulandığını ele alacağız.
Neden Olay Odaklı Tasarım?
Yazılım geliştirme süreçleri gün geçtikçe karmaşıklaşıyor ve iş gereksinimleri hızla değişiyor. Bu bağlamda, geleneksel programlama yaklaşımlarıyla başa çıkmak zorlaşıyor. İşte bu noktada, olay odaklı tasarımın önemi ortaya çıkıyor.
- Dinamik iş süreçleri ile başa çıkma
- Modüler ve bağımsız bileşenler
- Gerçek zamanlı tepki
- Değişen koşullara anında uyum
- Hata izleme ve sorun giderme kolaylığı
Olay Odaklı Tasarım Nedir?
Olay odaklı tasarım, bir yazılım sisteminin işlevselliğini olaylar ve olayların tetiklediği tepkiler etrafında organize etme yaklaşımıdır. Bu yaklaşım, sistemdeki farklı bileşenlerin birbirleriyle bağımsız bir şekilde iletişim kurmasını ve işbirliği yapmasını sağlar. Olaylar, sistemin farklı bileşenleri arasında iletişim kurmak için kullanılır ve bu sayede sistem daha esnek hale gelir.
Peki Nasıl ? Çetrefilli terimler, cümlelerin ardında Event Driven Design(EDD) nasıl çalışır ? Temelde konu bir olay üzerine bir servisin aksiyon alma işlemidir, Örneğin E-Ticaret sistemi geliştiriyorsunuz, haliyle kullanıcılarınız var. Her bir kullanıcı kayıt olduğunda bu kullanıcıya indirim kuponu tanımlamak istiyorsunuz. Bu gereksinim Monolith tasarımda kişinin kayıt olmasının ardından discount/payment servisinin ilgili assign metotunun call edilmesi ile gerçekleşirken (senkron), Olay güdümlü tasarımda UserService kullanıcıyı kayıt ettikten sonra bunu duyurmak için bir DomainEvent fırlatır. İlgili Listener’lar ise bu olay karşısında kendi aksiyonlarını gerçekleştirirler (Asenkron).
Yani yukarıda ki örnekte UserService ve DiscountService direkt olarak iletişim halinde olmadığı gibi Her servis kendi yükümlüğünü yerine getirmenin ardından bunu İlan ederler ve ilgili servislerde kendi aksiyonlarını alırlar
Olay Odaklı Tasarımın Temel Prensipleri
Olay odaklı tasarımın temel prensipleri şunlardır:
- Asenkron İletişim: Olay odaklı sistemlerde, iletişim asenkron bir şekilde gerçekleşir. Bileşenler birbirleriyle doğrudan iletişim kurmak yerine olaylar aracılığıyla haberleşirler.
- Esneklik ve Ölçeklenebilirlik: Olay odaklı tasarım, sistemdeki bileşenlerin bağımsızlığını ve esnekliğini artırır. Bu sayede sistem, ihtiyaç duyulduğunda kolayca ölçeklenebilir.
- Gerçek Zamanlı Tepki: Olaylar, gerçek zamanlı olarak tetiklenir ve sistem bu olaylara hızlı bir şekilde tepki verebilir.
Olay Odaklı Tasarımın Avantajları
Olay odaklı tasarımın birçok avantajı bulunmaktadır. Bunlardan bazıları şunlardır:
- Esneklik: Sistem, yeni gereksinimlere kolayca uyum sağlayabilir.
- Ölçeklenebilirlik: Sistem, artan yük altında kolayca ölçeklenebilir.
- Modülerlik: Olay odaklı sistemler, farklı bileşenler arasında net bir sınırlama sağlar ve sistemdeki değişikliklerin etkisini azaltır.
Olay Odaklı Tasarımın Uygulanması
Olay odaklı tasarımı uygularken Java Spring Boot projesi üzerinden kod örnekleri vereceğim gibi Spring Boot ve Rabbit MQ kullanacağım.
Örnek Senaryo : Bir E-Ticaret Sistemi Kullanıcı Kayıt Olduğu esnada Payment Servisinin Kullanıcıya İndirim Kuponu Tanımlaması
Öncelik olarak Diyagram üzerinden inceleyelim.

Diyagramda görüldüğü üzere Client’ın isteği doğrultusunda User Service kişinin kayıtını gerçekleştirdikten sonra, Servislerden bağımsız noktada ki Rabbit MQ ya bu durumu bildiriyor. bitti… işi bu kadar artık bundan sonra başka işi yoksa response’u hazırlayıp return edecek geri Client’a.
Eeee Kullanıcıya İndirim Kuponu tanımlanması nerede ? Asenkron da tabii ki, Payment Servisin bir kulağı da user-created adlı kuyrukta, mesaj dinliyor. Geldiği anda da kendi işini yerine getirecek.
Şimdi de son pekiştirme olarak kod örneği yapalım ve bu sona yaklaşalım.
Proje yapımız ve class larımız bu şekilde

İlgili Config Dosyasını Hazırlıyoruz

Ardından Publisher Sınıfımızı hazırlıyoruz

Bundan sonrası kafanızda canlanıyor olmalı, Config tamam, Event’i atmak için gereken Sınıfımız tamam, Geriye sadece İlgili noktada event’i atmak ve dinlemek kalıyor.

Şimdi de Payment Servisinin Bu Olayı Dinlemesi Gerekiyor.

Görüldüğü üzere @ RabbitListener Annotation ı ile ilgili kuyruğu dinleyerek mesajı aldık.
Sonlara doğru gelmişken çok fazla terim anlam kullandığımı fark ettim ve gündelik hayattan bir örnek ile noktalamak istiyorum. Event Driven nedir biliyor musunuz ? Siz Balkondasınız, Aileniz Mutfakta ve yemek hazırlıyor. kulağınız salonda, Bir ses duydunuz… ‘Yemek Hazırrrr!’ hemen balkonda ki Geniş masayı hazırlamaya başladınız.
Gördüğünüz üzere Bir olay sonrası dinleme ile haberiniz olduğu bir konuda aksiyon aldınız. İşte tam olarak budur.
Yazının sonuna geldiğimizde, buraya kadar okuduğunuz için çok teşekkür ederim. Umarım bu yazı sizlere aradığınızı katmıştır. Başka bir yazıda görüşmek üzere…
Destek olmak için Github Adresimi ve Linkedin Profilimi ziyaret edebilirsiniz.
Şimdiden Teşekkürler, iyi çalışmalar.