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

.NET Core Ortamında ‘Event Store’ İle Event Sourcing Yapılanması

event store

Merhaba,

Bir önceki Basit Bir Event Sourcing Uygulaması Geliştirelim başlıklı makalemizde Event Sourcing pattern’ının nasıl gerçekleştirilebildiğine pratiksel olarak bir örnek vermeye çalışmıştık. İlgili makalede ele alınan örnekten de görüldüğü üzere uygulamada gerçekleştirilen ‘event’lerin in-memory’de depolanması yerine daha yönetilebilir bir vaziyette olması için veritabanında yahut bu amaçla geliştirilmiş özel tool’lar da tutulması daha elverişli olacak kanaatindeyiz. Dolayısıyla bu içeriğimizde Event Sourcing pattern’ını uygulayabilmek için geliştirilmiş olan ‘Event Store’ tool’unu sizlerle tanıştıracak ve birçok nimetinden haberdar olup, istifade ediyor olacağız.

Event Store Nedir?

Event Store, Event Sourcing için geliştirilmiş olan event’leri depolamamızı sağlayan ve bununla birlikte ‘Read/Query’ veritabanlarına kayıt atabilmek için dahili bir ‘Message Broker’ hizmeti sağlayan Open Source bir veritabanıdır. HTTP ve TCP protokollerini desteklemektedir.

Hangi Protokolü Tercih Edilmelidir?

TCP, HTTP’ye nazaran daha hızlı olacağından dolayı tercih edilebilir. Özellikle event eklendiği zaman subscribe olan consumer’larla zamansal açıdan 2|3 kat daha hızlı iletişim kurulabilmektedir. Bu fark yüksek performanslı ortamlarda daha da kendini gösterecektir.

Event Store Kurulumu Nasıl Yapılır?

Event Store’u ister PC’nize isterseniz de Docker ortamına kurabilirsiniz. Bizler bu içeriğimizde Docker’ı tercih edeceğiz.

Docker
Event Store’u Docker ortamında ayağa kaldırabilmek için aşağıdaki komuttu çalıştırabilirsiniz.

docker run --name eventstore-node -it -p 2113:2113 -p 1113:1113 eventstore/eventstore:release-5.0.9

Bu şekilde Dockerize edilen Event Store sunucusuna ileride bağlantı sağlanmaya çalışıldığı zaman aşağıdaki hata kaçınılmaz olacaktır.
Hatanın metinsel hali:

EventStore.ClientAPI.Exceptions.RetriesLimitReachedException: Item Operation ReadStreamEventsForwardOperation

Bu hatanın kaynağı ilgili sunucunun dahili bir SSL sertifikası olmamasından kaynaklanmaktadır. İlgili hatayı aşabilmek için öncelikle gerçek sertifika kullanılmalıdır. Bunun için Event Store’u kullanacağınız uygulamaya aşağıdaki içeriğe sahip Dockerfile dosyasını oluşturunuz.

FROM eventstore/eventstore:release-5.0.8
RUN apt-get update -y \
  && apt-get install -y openssl \
  && openssl req -x509 -sha256 -nodes -days 3650 -subj "/CN=eventstore.org" -newkey rsa:2048 -keyout eventstore.pem -out eventstore.csr \
  && openssl pkcs12 -export -inkey eventstore.pem -in eventstore.csr -out eventstore.p12 -passout pass: \
  && openssl pkcs12 -export -inkey eventstore.pem -in eventstore.csr -out eventstore.pfx -passout pass: \
  && mkdir -p /usr/local/share/ca-certificates \
  && cp eventstore.csr /usr/local/share/ca-certificates/eventstore.crt \
  && update-ca-certificates \
  && apt-get autoremove \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

Ardından powershell’den ilgili dizine odaklanarak aşağıdai image’i oluşturunuz.

docker build -t eventstore/eventstore:with-cert-local --no-cache .

Son olarak aşağıdaki gibi bir container’ı ayağa kaldırınız.

docker run --name EventStore -it -p 1113:1113 -p 1115:1115 -p 2113:2113 -e EVENTSTORE_CERTIFICATE_FILE=eventstore.p12 -e EVENTSTORE_EXT_SECURE_TCP_PORT=1115 eventstore/eventstore:with-cert-local

Bu şekilde ayağa kaldırılan container’da artık hata almayacağız. Yazımızın devamında bağlantı kurmaya çalışacağımız container bu olacaktır. Ayrıca bu ayarlardan sonra artık TCP client’ı olarak aşağıdaki connection string’i kullanmamız gerekecektir.
"ConnectTo=tcp://localhost:1115;DefaultUserCredentials=admin:changeit;UseSslConnection=true;TargetHost=eventstore.org;ValidateServer=false"

Event Store Admin UI Tanıtımı

Event Store container’ı ayağa kaldırdıktan sonra http://localhost:2113/ adresi üzerinden Admin UI’a erişebilirsiniz. Kullanıcı adı admin, şifre changeit‘tir.

Şimdi sırasıyla Admin UI’da ki sayfaları incelemeye başlayalım.

.NET Core İle Event Store Kullanımı

Nihai olarak,
Event Sourcing pattern’ı uygulayabilmek için veriler üzerindeki değişiklikleri ifade edecek olan event’leri depolayabilmek için kullanacağımız Event Store tool’unu detaylıca incelemiş bulunmaktayız. Haliyle bu bilgiler temelinde sonraki makalemizde Event Store’u kullanarak Event Sourcing’e dair pratiksel bir örnek gerçekleştiriyor olacağız. O halde sonraki makalemizde görüşmek üzere diyelim…

İlgilenenlerin faydalanması dileğiyle…
İyi çalışmalar…

Not : Örnek kod dosyalarını indirmek için buraya tıklayınız.

Mobil sürümden çık