Olay odaklı mimari (event-driven architecture) nedir?

Olay odaklı mimari (event-driven architecture) nedir?

Bir kuruluşun olayları veya önemli iş anlarını tespit etmesini ve bunlar üzerinde gerçek zamanlı olarak harekete geçmesini sağlayan bir yazılım tasarım modeli olan olay odaklı mimariyi inceleyeceğiz.
Elif Koç09 Ara 2022

İnceleyeğimiz mimari, yüksek düzeyde ölçeklenebilir uygulamalar üretmek için kullanılır, popüler, eşzamansız ve dağıtılmış bir mimari modeldir. 

Olay odaklı mimari, soyut bir kavram gibi görünebilir, ancak temeli çok basittir. Bir örnekle açıklamak gerekirse, trafik lambasında kırmızı yanmaktayken ışık yeşile döner (olay), taşıtımıza ivme kazandırırız (tepki). Trafik lambasında kırmızı ışık yanmaya devam ettiği sürece tepki vermeyiz. Vereceğimiz tepki mantığa göre belirlenir; trafik yasaları, varış noktası, trafik koşulları gibi. Olay odaklı bir sistemin özü budur. 

Olay odaklı mimari, servislerin bir sonraki görevlerine geçmeden önce yanıt beklemek zorunda olduğu geleneksel “request/response”(istek/yanıt) mimarisinin yerini almaktadır. 

Olay odaklı mimarinin akışı olaylar tarafından yürütülür ve olaylara yanıt vermek veya bir olaya yanıt olarak bazı eylemleri gerçekleştirmek üzere tasarlanmıştır. Olay odaklı mimariye genellikle asenkron/eşzamansız iletişim denir.

 

 

Senkron iletişim, gönderici ve alıcının bir sonraki görevlerine geçmek için birbirlerini beklemek zorunda olunması anlamına gelir. Örneğin bir telefon görüşmesi “istek/yanıt” mimarisine göre senkron(eşzamanlı) olarak kabul edilir. Biri sizi arar ve sizden bir şey yapmanızı ister. İstekte bulunan kişi, yanıtlayanın görevi tamamlamasını bekler ve ardından her iki taraf da telefonu kapatır. 

Asenkron, gönderici (sender) ve alıcının (receiver) bir sonraki görevlerine geçmek için birbirlerini beklemek zorunda olmadığı anlamına gelir.

Asenkron iletişim için metin mesajlaşması bir örnek olarak verilebilir. Mesajlaşmanın her iki tarafındaki katılımcıların, doğrudan canlı bağlantı/eşzamanlı mesajlar için bekleme ihtiyacını ortadan kaldırarak, sohbet mesajlarını kendi şartlarına göre başlatma, duraklatma ve devam ettirme özgürlüğüne sahip olduğu bir iletişim yöntemi, asenkron iletişime örnektir. 

Peki olay odaklı bir mimari nedir? Bu sorunun cevabını aşağıdaki iki görsel ile vermeye çalışalım.


 

 

Yukarıdaki iki görsel odaklı mimariye ilişkin iki farklı şemayı göstermektedir. Her iki görsel de aşağıdaki öğeleri içermektedir:

  • Olayları oluşturan veya tespit eden ve bunları olay yöneticisine (event broker) ileten olay üreticileri (producers),
  • Ara katman yazılımı (middleware) görevi gören ve alınan olayların asenkron filtrelenmesinden, işlenmesinden ve yönlendirilmesinden sorumlu olan olay yöneticileri (brokers),
  • Olayları alan ve bunlara göre hareket eden olay tüketicileri (consumers).
     

Olay odaklı mimariyi daha detaylı inceleyelim.

Olaylar aksiyonlardır. Kuruluşun içinde veya dışında herhangi bir şey olduğunda, bir olay olmuş olur. Bu olaylar herhangi bir şey olabilir: Bir müşterinin satın alması, bir depoda envanter güncellemesi, bir güvenlik ihlali girişimi, bir uygulamanın durumunda değişiklik gibi. 

Birçok olay zamana duyarlı veya kritik öneme sahiptir. Bu nedenle kuruluşlar altyapılarını bu olayları yakalama ve bunlara tepki verme etrafında inşa etmek ister. Eğer olaylar kuruluştaki tepkileri tetikliyorsa kuruluş olay odaklıdır. Dijital çağda olaylar önceden atanmış mantığa dayalı olarak olayları kaydeden, işleyen ve bunlara yanıt veren bilgi teknolojileri sistemleri tarafından ele alınmaktadır.

Sistem tasarımındaki olaylar ortak özelliklere sahiptir:

  • Olaylar “bir şey” olduğunun kaydıdır.
  • Değişmezler, değiştirilemezler ve silinemezler.
  • Olaylar, süresiz olarak kalıcı olabilirler. Sonsuza kadar saklanabilir ve erişilebilirler.
  • Sınırsız sayıda tüketilebilirler. Bir olayın bir hizmet tarafından kaç kez işlenebileceği konusunda bir sınır yoktur.
     

Bir olayın sadece bir eylem/aksiyon olduğunu göz önünde bulundurmak önemlidir. Olay odaklı mimariler olay bildirimlerini (event notification) işler. Olay bildirimi, bir eylemin gerçekleştirildiğini onaylayan bir mesajdır. Bildirim, eylemin basit bir onayı olabilir veya alt sistemlerin iş mantığını uygulamak için kullandığı olay hakkında ek veriler içerebilir. Örneğin bir satın alma bildirimi, müşterinin kimliğini, satın alma toplamını, satın alma tarihini ve bir CRM’nin (customer relationship management/müşteri ilişkileri yönetimi) müşterinin profilini oluşturmak ve ihtiyaç duyulabilecek gelecekteki ürünlerin tahmini için kullanılan diğer ölçümleri içerebilir. Sistemde işlenen olay bildirimi veya mesajı olduğundan, olay odaklı mimari, mesaj odaklı mimari olarak da adlandırılmaktadır. 
 

Olay odaklı mimari; olayları ayrıştırılmış bir mimari aracılığıyla kaydetmek, iletmek ve işlemek için oluşturulmuş bir sistem tasarım uygulamasıdır. Bu, sistemlerin bilgi paylaşmak ve görevleri gerçekleştirmek için birbirleri hakkında bilgi sahibi olmalarına gerek olmadığı anlamına gelir.

Decoupling, olaya odaklı mimarinin bir bileşenidir ve API’ler (application programming interface/uygulama programlama arayüzü) gibi veri paylaşımı için kullanılan diğer yöntemlere göre büyük bir avantaj sunar. Bir API çağrısı gönderirken, uygulamanın düzgün biçimlendirilmiş bir istek gönderebilmesi için bağımlılıkları ve parametreleri bilmesi gerekir. Devam etmeden önce yanıtı bekler. Bu aynı zamanda, veri aktarımı için her zaman bir istek ve yanıt olacağı anlamına gelir. 

Decoupling ile bir olay üreticisi (event producer), sonrasında ne olduğunu bilmesine gerek kalmadan bildirimini gönderir ve nereye gideceğine karar vermek için onu olay yönlendiricisine (event broker) yönlendirir. Event broker, wifi router gibi düşünülebilir; internetten veri alır ve gerçek zamanlı olarak ihtiyacı olan farklı cihazlara dağıtır. Tüketiciler (consumers), talep etmeye gerek kalmadan işleme alınacak olayı alırlar. Olayı tüketen her servis kendi başına çalışır, yani olaylar eş zamansız olarak işlenir.

Olay üreticileri (event producers), olay yönlendiricisi (event router) ve olay tüketicileri (event consumers) arasındaki olay verilerinin akışı, olay kanalı olarak bilinir. Temel olarak bir üretici, broker’a yönlendirilen olayları yaratır. Broker’dan gelen bu olaya tüketici reaksiyon gösterir ve yürüteceği işlemleri gerçekleştirir. 

 

 

Olay odaklı mimariyi örneklendirelim.

Olay odaklı mimari bir organizasyonun olaya tepkisini nasıl tanımladığıdır. Bir çevrimiçi mağazanın olay odaklı mimariyi nasıl içselleştirebileceğine bakalım.
 

 

Bir e-ticaret sitesinde, bir müşterinin ödeme bilgilerini göndermesi sık görülen ve kritik bir eylemdir:

 

  1. Kullanıcı arayüzü, “Ödeme Gönderildi” olayını oluşturur ve olay yönlendiricisi (event router), olayın meta verilerine dayalı olarak, bildirimi ödeme sistemine yönlendirmeyi bilir. Meta veri; veri hakkındaki veridir. Veri setinin ya da kaynağın ne zaman, kim tarafından, nasıl oluşturulduğuna dair bilgileri tutar.
  2. Ödeme gönderildi bildirimi alındıktan sonra, ödeme sistemi olayı işler ve başarılı veya başarısız olduğunu gösteren bir “Ödeme İşlendi” olayı oluşturur. Olay yönlendiricisi (event router), durumu müşteriye göstermek ve sonraki adımları talep etmek üzere, kullanıcı arayüzüne gönderir. 
  3. Ödemenin başarısız olması durumunda kullanıcı arayüzü ayrıntıları güncellemek için formu yeniden açabilir. Ödeme başarılı olursa, kullanıcı arayüzü sonuçlanan sipariş ayrıntılarını ve beklenen teslimat tarihini görüntüleyebilir.

 

Olay odaklı mimari modelleri (patterns)

Bir olay odaklı mimari modeli, olay üreticilerinin (event producers), yönlendiricilerin (routers) ve tüketicilerin birlikte nasıl çalıştığını belirler. Olay odaklı mimaride iki yaygın model vardır: Yayıncı(publisher)/abone (subscriber) ve olay akışı (event streaming).
 

Publisher (yayıncı)/subscriber (abone) iletişim modeli: Olay odaklı mimari esas olarak publish/subscribe iletişim modeli aracılığıyla gerçekleştirilir. Publish/subscribe, farklı sistem bileşenlerinin birbirleriyle eşzamansız (asenkron) olarak etkileşime girmesine izin veren esnek bir mesajlaşma modelidir.

 

Üreticiler yayıncı olarak, aboneler  ise tüketici olarak düşünülebilir. 
 

Event streaming (olay akışı) mimarisi: Bu yaklaşımda olaylar bir günlüğe yazılır ve tüm tüketiciler ilgili olayları tanımlamak için günlüğü okuyabilir. Tüketiciler akışın herhangi bir bölümünden okuyabilir, böylece geçmiş olayları tekrar oynatabilirler.

Olay işleme modelleri: Olayları tüketiciye ulaştıktan sonra işlemek için benzersiz yaklaşımlar bulunmaktadır: Basit olay işleme (simple event processing), karmaşık olay işleme (complex event processing), olay akışı işleme (event stream processing) gibi.

  • Basit olay işleme: Tüketiciler, e-ticaret sitesi örneğindeki gibi, her olayı alındığı gibi işler.
  • Karmaşık olay işleme: Tüketiciler, olay verilerindeki kalıpları algılamak için bir dizi olayı işler.
  • Olay akışı işleme: Veri akışı platformları olayları alır ve verileri dönüştüren ve tüketen işlemcileri akışa almak için bir işlem hattı (pipeline) oluşturur.

 

Olay odaklı mimarinin avantajları nelerdir?

Bir web veya mobil uygulama oluşturmak için kullanılan araçlar, uygulamalar veya servislerin kombinasyonu olarak adlandırılan “tech stack”lerin yanıt verme hızını, esnekliğini geliştirmek isteyen kuruluşlar için birçok avantaj sağlar. Bu avantajlar: Decoupling (ayrıştırma), immutability (değişmezlik), persistability (kalıcılık), scalability (ölçeklenebilirlik), real-time workflows (gerçek zamanlı iş akışları), simplified auditing (basitleştirilmiş denetim).

 

  • Decoupling (ayrışma): Servislerin, birlikte çalışabilmek amacıyla diğer servislerin varlığını bilmesine gerek yoktur. Yalnızca olaylar hakkında bilgi sahibi olmaları gerekir ve event broker, gereken olayları gereken sistemlere devreder. Decoupling, olay odaklı mimariyi mikroservislere bağlamak için doğal bir uyum haline getirir.
  • Immutability (değişmezlik): Olaylar oluşturulduktan sonra değiştirilemez, bu sayede bir servisin diğer servislerin ileride tüketeceği bilgileri değiştirmesi veya kaldırması riski olmaksızın, bir olay birden fazla servisle paylaşılabilir.
  • Persistability (süreklilik): Geleneksel modellerde, servis 2 kapalı ise, servis 1’in servis 2’ye yönelik isteği geri dönerek hatalara sebep olur. Broker, olayı almak için servis 2 tekrar çevrimiçi olana kadar olayı devam ettirebilir. Bu, tek bir arıza noktasını önler ve dayanıklılığı artırır. 
  • Scalability (ölçeklenebilirlik): Farklı tüketicilerde, birden fazla eylemi tetiklemek için bir olay kullanılabilir, bu da paralel görev yürütülmesini sağlar ve performansı artırır.
  • Real-time workflows (gerçek zamanlı iş akışları): Olay odaklı mimari kullanılan sistemlerde satın alma işlemleri, canlı sohbet mesajları gibi görev açısından kritik sayılabilecek etkileşimli olaylar gerçekleştiğinde, gerçek zamanlı veya gerçek zamanlıya yakın olacak şekilde yanıtlamayı destekler. Bu yaklaşım, müşterilere her zaman ihtiyaç duydukları anda destek ve bilgilerin sağlanmasını mümkün kılar
  • Basitleştirilmiş denetim (simplified auditing): Olay yönlendiricisinin bilgi akışı için ara katman (middleware) yazılımı rolü, denetim ve uyumluluk sürecini basitleştirir. Tüm kuruluş için bu merkezi noktadan veri erişim izinleri ayarlanabilir. Ayrıca, olaylar değişmez (immutable) olduğundan veriler asla değiştirilemez veya kaldırılamaz. Bu da güvenilir bir denetim izi oluşturur. 

 

 

Bir olayın consume edilmesi ne anlama gelmektedir?

Olay tüketicisi (event consumer) olaya tepki verir. Bir olay tüketicisi, bir veri tabanını veya iş panosunu güncellemek kadar basit veya olayın bir sonucu olarak yeni  iş süreçlerini gerçekleştirecek kadar karmaşık olabilir. Bir olayın tüketilmesine dair bazı örnekler:

  • Veritabanı güncelleme,
  • Olay verilerine dayalı olarak e-posta veya SMS kullanarak uyarı gönderme,
  • Yeni bir uygulama çalışmasına başlamak,
  • Web sayfalarını dinamik olarak güncellemek için Web 2.0 bileşenleriyle etkileşim kurmak.
  •  

Olay odaklı mimaride event source ne anlama gelmektedir?

Olay kaynağı, olayları olay işleme (event processing) sistemine gönderir. Bu kaynaklar bir veya birden fazla event processing’e bir veya birden fazla olay gönderebilir.

 

Olay odaklı mimariler ve mikroservisler nelerdir?

Modern mikroservis tasarımları, reaktif ve olaya dayalıdır ve belirli görevleri gerçekleştirmek için oluşturulmuştur. Bu görevler genellikle bir olayın meydana gelmesine dayanır. Gevşek bir şekilde bağlanırlar (loosely connected) ve güncellenmesi ve bakımı kolaydır. Bakımı kolay ve uyarlanabilir uygulamalar oluşturmak için olaya dayalı mikroservisler kullanılabilir. 

 

Asenkron olarak birbirleriyle etkileşime girmesi gereken çok sayıda mikroservisimiz olduğunu düşünelim. Servislerin ölçeklenebilir olması, birbirine bağlı olmamasını ve bağımsız olarak sürdürülebilmesini isteyebiliriz. Mikroservislerin diğer servislerin tüketebileceği olaylar oluşturmasını da isteyebiliriz. Olay odaklı mikroservisler burada devreye girer. Olay odaklı bir mikroservis mimarisindeki mikroservis, bazı önemli eylemler gerçekleştiğinde veya kayda değer bir durum gerçekleştiğinde bir olayı yayınlar. Örneğin, bir siparişin durumu değiştirildiğinde bir servis, verilerini değiştirir. Bu olaylara diğer mikroservisler tarafından abone olunduğunu bilelim. 

 

Hem Linkedln hem de Netflix’in olaya dayalı, asenkron iletişim mimarisi kullandığı bilinmelidir. Olay odaklı mikroservisler, birçok servisi kapsayan ticari işlemleri yürütmek için kullanılabilir.

 

İki servis düşünelim: Bildirim ve kullanıcı. Bildirim servisinin, bildirim tablosunun sahibi olduğunu ve kullanıcı servisinin, kullanıcı tablosunun sahibi olduğunu varsayalım. Bildirim servisinin "Yeni" bildirim durumu ile bir bildirim oluşturduğunu ve "Bildirim Oluşturuldu" uyarısı yayınladığını varsayalım. Bu olay e-posta servisi tarafından tüketilecek, bildirim durumu "İşleniyor" olarak değiştirilecek ve bir "Bildirim Gönder" uyarısı yayınlanacaktır. Bildirim servisi daha sonra "Bildirim Gönder" olayını tüketir ve bildirim durumunu "İşlendi" olarak değiştirir. Bu, olaya dayalı hizmetlerin eşzamansız (asenkron) olarak nasıl çalıştığına dair basit bir örnektir.

Olay odaklı mikroservisler duyarlı uygulamaların geliştirilmesine de yardımcı olur. Bunu bir örnekle açıklayalım. Az önce bahsettiğimiz bildirim servisini düşünelim. Yeni bir bildirim oluşturulduğunda ve kuyrukta depolandığında, bildirim servisinin kullanıcıyı bilgilendirmesi gerektiğini, uygulamaya erişmeye çalışan ve işlenen bildirimleri bilen birkaç eşzamanlı kullanıcının olduğunu varsayalım. Olay odaklı modelde tüm uyarılar uygun kullanıcıya iletilmeden önce kuyruğa alınır. Bu durumda kullanıcının bildirim (e-posta, kısa mesaj vb.) işlenirken beklemesi gerekmez. Bildirim eşzamansız olarak işlenirken kullanıcı uygulamayı kullanmaya devam edebilir. Uygulamanızı bu şekilde uyumlu ve gevşek bir şekilde birleştirebilirsiniz.

 

Olay odaklı mimariyi etkinleştirmek için temel araçlar nelerdir?

Olay üretiricileri ve tüketicileri arasındaki veri alışverişi mantığı farklı olay işleme platformları yardımıyla yürütülebilir. Bu platformlardan bazıları: Apache Kafka, Pulsar, ActiveMQ, Redis.

  • Apache Kafka: Olay akışlarını gerçek zamanlı olarak yayınlamaya, depolamaya, işlemeye ve abone olmaya imkan tanıyan popüler bir akış platformudur. Kafka subscriber/publisher işlevselliğini ölçeklenebilir, hataya dayanıklı ve güvenli bir şekilde sağlayarak günde trilyonlarca olayın işlenmesine olanak tanır. Bulutta veya kendi yerinde depolanabillir.
  • Pulsar: Dağıtılmış publish/subscribe mesajlaşması için kullanılan Apache ailesine dayalı bir sistemdir. Mesaj kuyruğu sistemi olarak tasarlanan Pulsar, son sürümlerinde olay akışı fonksiyonalitesine de sahip olmuştur. Yüksek düzeyde ölçeklenebilir olan sistem esnek mesajlaşma modellerine olanak tanır. Ölçeklenebilirlik; bir sistemin uygulama ve sistem işleme taleplerindeki değişikliklere yanıt olarak performans ve maliyette artış veya azalma yeteneğinin ölçüsüdür.
  • ActiveMQ: Esnek, açık kaynaklı bir mesaj aracısıdır. Birden çok producer ve consumer arasındaki konular üzerinden publisher ve subscriber mesajlaşmasının fonksiyonalitesini sağlar. ActiveMQ’nun karmaşık yapılara yerleştirilmesi nispeten kolaydır, sistem güvenilirlik ve yüksek verim gösterir. 
  • Redis: Veritabanı ve mesaj broker olarak kullanılan, açık kaynaklı, bellek veri deposudur. Verilerin bellekte bulunması, düşük gecikme süresi ve yüksek verimli veri erişimi sağlar. Çünkü geleneksel veri tabanlarının aksine Redis kullanıldığında diske ulaşıma gerek yoktur. Redis, milyonlarca isteğin işlenmesini sağlayan publisher/subscriber uygulamaları için popüler bir seçimdir.

 

Özetle; olay odaklı mimari çevik işletmelere güç sağlar. Olay odaklı mimari işleri için önemli olan olayları hızlı bir şekilde ele almak isteyen kuruluşlar için verimlilik ve esneklik sunan sistem tasarımına yönelik güçlü bir yaklaşımdır. Paralel yürütme, veri çoğaltma, birlikte çalışılabilirlik gibi use case-leri kolaylıkla sağlar. Olay odaklı mimari, olayların anında yanıtları tetiklediği, çevikliği artırdığı ve müşteri ihtiyaçlarını karşılamak için ölçeklendiği olay odaklı bir organizasyon elde etmek için merkezi bir yöntemdir.


 

Kaynaklar

Miuul topluluğunun bir parçası ol!

Abone ol butonuna tıklayarak Miuul'dan pazarlama ve haber içerikleri almayı onaylıyorum.