İ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.
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.
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:
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:
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ı 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:
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).
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.
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.
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.
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).
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:
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.
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 ü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.
Ö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.