Yazılım Mimarileri ve Tasarım Desenleri Üzerine

Asp.NET Core + Event Store İle Event Sourcing Uygulaması(Örneklendirme)

Merhaba,

Önceki, .NET Core Ortamında ‘Event Store’ İle Event Sourcing Yapılanması başlıklı makalemde Event Sourcing yapılanması için Event Store ile yapılması gereken temel ayarlardan ve bağlantı konfigürasyonlarından bahsetmiştik. Bu içeriğimizde ise bir Asp.NET Core uygulamasında belirlediğimiz bir senaryoya istinaden Event Store tool’unun eşliğinde Event Sourcing örneklendirmesi gerçekleştireceğiz. Haliyle hiç vakit kaybetmeksizin direkt olarak içeriğimizin temeli olan senaryoyu ele alarak konuya giriş yapalım.

Senaryo

Örneklendirmede ele alacağımız senaryo bir sistemdeki kullanıcı(Users) davranışları üzerine olacaktır. Bir kullanıcı datası üzerinde varsayım olarak oluşabilecek tüm event’ler aşağıdaki tabloda listelenmiştir.

Açıklama Event
Kullanıcı eklendiğinde UserCreated
Kullanıcı adı değiştirildiğinde UserNameChanged
Kullanıcı email’i onaylandığında UserEmailApproved

Başlarken

Yapısal olarak Event Sourcing için bir data üzerindeki tüm etkinliklerin kayıt altında tutulduğu bir pattern olduğunu önceki makalelerimizde uzun uzadıya konuşmuştuk. Haliyle şimdi bu pattern’ı uygularken yaptığımız girizgahtan da belli olduğu üzere data üzerindeki etkinliklerin kaydını Event Store tool’un da tutacak ve böylece ‘Write Data Store’ olarak ilgili veritabanını kullanacağız. ‘Read Data Store’ olarak kullanılacak olan veritabanındaki güncellemeyi ise Messaging ile gerçekleştireceğiz ve bu işlemi de muhtemelen bir sonraki makalemizde ele alıyor olacağız.

Görsel Kaynağı : https://subscription.packtpub.com/book/application_development/9781786469342/7/07lvl1sec43/event-sourcing-and-cqrs
Esasında görüldüğü üzere Event Sourcing, CQRS pattern ile birlikte tam bir uyumluluk sergilemekte olan bir yapılandır. ‘Write Data Store’ olarak herhangi bir veritabanı yahut sağlayıcı kullanılabilir. Biz burada oldukça etkili olan Event Store tool’unu tercih ediyoruz. Amma velakin bir event geldiği taktirde bu yeniliği anlık olarak ‘Read Data Store’ veritabanına yansıtılması elzemdir. Aksi taktirde büyük bir veri tutarsızlığı söz konusu olabilir. Bu konuya da yukarıda da bahsedildiği üzere sonraki makalemizde değinmiş olacak olsakta, bu makalemizin ileriki satırlarında ufaktan temas etmiş olacağız…


Velhasıl, örneklendirmede eşlik edebilmeniz için hali hazırda oluşturulmuş bir Asp.NET Core – API uygulaması açınız ve içerisine EventStore.Client kütüphanesini yükleyiniz. Ardından geliştirilmeye hazır bir adet ‘UsersController’ isminde controller oluşturunuz. Evet, artık bu kadarı kafidir. Yavaştan event sourcing pattern’ını geliştirmeye başlayabiliriz.

Uygulama Geliştirme

Bu makalede belli başlı bir event sourcing stratejisi gösterilecektir. Tabi ki de bu strateji özelleştirilebilir yahut daha farklı stratejilerde bir tasarım ortaya koyulabilir. Ayrıca adım adım geliştirme süreçlerinde isteğiniz ya da ihtiyacınız doğrultusunda öncelik sıralamasını değiştirebilirsiniz. Misal, bizler aşağıda öncelikle event’lerin geliştirilmesinden başlayacağız. Sizler isterseniz öncelikle exception sınıflarını geliştirebilir yahut ‘Aggregate’(yazımızın devamında ne işe yaradığı anlatılacaktır) sınıfını ele alabilirsiniz. Yeter ki olağan olsun 🙂

Evet, bu satırlara sağ salim ulaşabildiyseniz eğer hedeflenen event sourcing yapılanmasını başarıyla inşa etmişsiniz demektir 🙂 Şimdi sıra geliştirilen bu uygulamayı test etmeye gelmiştir.

Uygulamayı Çalıştırma ve Test Etme

Uygulamayı derleyip çalıştırdığımızda ‘Startup.cs’ dosyasında yaptığımız konfigürasyonlara istinaden Event Store’a bağlantı gerçekleştirilmekte, dolayısıyla bu bağlantı ilgili tool’un ‘Connections’ kısmında aşağıdaki gibi görülebilmektedir.

Velhasıl, şimdi geliştirdiğimiz API’da ki ‘UsersController’a Postman üzerinden sırasıyla istekler gönderelim ve gerçekleştirilen event’lere istinaden mevcudiyetteki datanın üzerindeki gelişimi ‘GetData’ action’ına istek göndererek gözlemleyelim. Nihayetindeki bu gözlem esasında ‘Read Data Store’a izafen veriye dair süreçteki değişimi görmemiz için faydalı olacaktır.

Şimdi son olarak 100 id değerine sahip kullanıcı data’sının tüm süreçte yaşadığı değişimleri görebilmek için elimizdeki tüm event’leri hem API hem de Event Store üzerinden okuyalım.

API Event Store

Yukarıdaki görsellere göz atarak event sourcing’in esasında bir veri için ne kadar anlamlı pattern olduğunu görebilmektesiniz. Nihayetinde elimizdeki kullanıcı verisinin şu anki durumunu, zahiri olarak gördüğümüzden daha çok süreçte geçirdiği evrelerden ibaret bir bütün olduğunu görebilmekteyiz.

Evet… Böylece bu içeriğimizde de event sourcing inşasını güzel bir yapılanmayla ele almış bulunuyoruz. Bir sonraki içeriğimizde muhtemelen, messaging yapılanmasından istifade ederek ‘Read Data Store’ olarak seçtiğimiz herhangi bir NoSQL veritabanına(MongoDB yahut Couchbase) event’ları işlemeyi ele alıyor olacağız.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Not : Örnek uygulamayı indirebilmek için buraya tıklayınız.

Exit mobile version