Olay Kaynak Kavramları
Olay kaynaklama, modern yazılım mimarisinde, özellikle C# ve .NET Core uygulamalarında sıklıkla kullanılan güçlü fakat karmaşık bir modeldir. Olay kaynaklamayı nasıl uygulayacağınızı tam olarak anlamak için, Derek Comartin'in CodeOpinion.com üzerindeki videosunda açıkladığı önemli ilkeleri gözden geçireceğiz: "Event Sourcing Core Concepts".
Olay mağazası kavramlarını, alan odaklı tasarımı veya olay kaynaklı sistemlerin nasıl inşa edileceğini daha iyi anlamak istiyorsanız, doğru yerdesiniz. Başlayalım!
Olay Kaynaklamaya Giriş
Başlangıçta (0:00), Derek, olay kaynaklama ve ilişkili temel kavramlar etrafındaki karışıklığı tartışıyor. Olay kaynaklamanın yalnızca "mevcut durumu yakalamak" olmadığını, olayları saklamak olduğunu — alan modelinizde meydana gelen her değişikliği yalnızca ekli bir günlükte kaydetmek olduğunu tanımlar.
Bu şekilde, sisteminizin durum değişikliklerinin tam bir geçmişi korunur. Sadece son durumu kalıcı hale getirmek yerine, meydana gelen iş mantığını yansıtan olayları kalıcı hale getirirsiniz.
Olaylar: İş Gerçeklerini Yakalamak
0:33'te, Derek bir olayın gerçekte ne olduğunu açıklar. Bir olay, sistem içinde zaten gerçekleşmiş bir şeyi — bir iş gerçeğini — temsil eder. Örneğin, bir "Ürün Alındı" olayı alınan miktarı ve tarihi içerebilir.
Derek, olayları sakladığınızda, bunların geçmiş zamanı yansıtan bir isimlendirme kuralı kullanılarak adlandırılmaları gerektiğini vurgular, örneğin "Ürün Gönderildi" veya "Envanter Düzenlendi" gibi. Bir olay şeması üzerinde, "public Guid Id", "public string Name" ve zaman damgaları gibi alanlar olabilir.

Her olayın, sadece ekli bir depolama sisteminde bir olay akışına olay eklediğinizde önem taşıyan benzersiz bir tanımlayıcıya sahip olması gerekir.
Olay Akışları: Olayları Düzenlemek
2:02'de, Derek olay akışlarına geçiş yapar. Bir ilişkisel veritabanı tablosu ile karşılaştırma yapar, ancak olay kaynaklamada, bir alan nesnesi ile ilgili olan tüm olayların (örneğin bir envanter öğesi) aynı olay akışına ait olduğunu açıklar.
Her olay akışı, genellikle "public Guid Id" ve "string Name" ile tanımlanan belirli bir varlıkla ilişkilidir. Örneğin, SKU ABC123 olan bir ürün, alım veya gönderim gibi kalıcı olayları içeren kendi akışına sahip olur.
Derek, bunları modellediğinizde alan odaklı tasarım kavramlarından ödünç alarak, aggregate kökleri ve alan nesneleri açısından düşünmenizi önerir.
Yaşam döngüsünü — ister kısa ömürlü ister uzun ömürlü — modellemek, akışların sayısını ve boyutunu optimize etmeye yardımcı olur. Bu, karmaşık sistemlerde performansı artırmak için kritiktir.
Projeksiyonlar ve Okuma Modelleri
4:12'de, Derek projeksiyonları ve okuma modelini tanıtır. Olay kaynaklı sisteminiz olayları yakaladığından, sadece mevcut durumu değil, 'Mevcut envanter miktarı nedir?' gibi soruları yanıtlamak için olayları yeniden oynatmanız gerekir.
Okuma modelleri oluşturmak için, akıştan olayları işlersiniz. Örneğin, "private void Apply(Event e)" veya benzeri bir yöntem kullanarak, her olay türü için olay işleyicileri aracılığıyla stoku artırır veya azaltırsınız.
Derek, bir doküman veritabanı veya bir ilişkisel veritabanında nasıl bir okuma modeli oluşturulacağını örneklendirir — belki bir projeksiyon sadece el altındaki miktarı gösterirken, diğeri gönderim geçmişini gösterir.
Bu komut sorgusu sorumluluk ayrımını (CQRS) yansıtır: yazma işlemlerini (komutlar) okuma işlemlerinden (sorgular) ayırma.
Yazma Modelleri için Projeksiyonlar
6:48'de, Derek yazma tarafında da projeksiyonları nasıl uygulayacağınızı gösterir. Bu, eylemleri gerçekleştirmeden önce doğrulamak için kritiktir.
Bir komut işleyicisinde, ürünleri göndermeden önce yeterli miktarın mevcut olduğunu doğrulamanız gerekir. Derek, gerekli durumu yeniden oluşturmak için "private void Apply(List
"public int Version" gibi alanlar, akışın evrimini takip etmeye yardımcı olur, nihai tutarlılığı sağlar.

Bu pratik uygulama, yeni olayları işlerken iş mantığını zorlamaya yardımcı olur, sisteminizin yalnızca geçerli durum geçişleri üzerinde hareket etmesini sağlar.
Abonelikler: Yeni Olaylara Reaksiyon Gösterme
8:01'de, Derek aboneliklerden bahseder. Abonelikler, olay tüketicilerinin yeni olayları dinlemelerine ve tepki vermelerine olanak tanır.
Örneğin, bir projektör bir olay akışına abone olabilir ve bir "Ürün Gönderildi" olayı gördüğünde bir okuma modelini güncelleyebilir. Alternatif olarak, bir yayımcı olayları dinleyebilir ve bunları RabbitMQ veya Kafka gibi harici sistemlere yayınlayarak başka hizmetlerle entegre edebilir.

Derek, verilerin ayrı olay sistemleri arasında dağıtımını sağlarken, nihai tutarlılığı koruyarak, iç modelleri güncellemeye yönelik abonelikleri açıklar.
Bu, olay güdümlü mimarinin bir başka önemli faydasını gösterir: hizmetleriniz sonunda tutarlı kalır ancak bağımsız olarak ölçeklenebilir.
Temel Kavramların Özeti
9:21'de, Derek temel kavramları özetler:
Olaylar, gerçekleri yakalar.
Olay akışları olayları varlık tarafından düzenler.
Projeksiyonlar, akışları sorgulanabilir okuma modellerine veya harekete geçirilebilir yazma modellerine dönüştürür.
- Abonelikler, hizmetlerin tepki vermesine ve gerektiği gibi güncellenmesine olanak tanır.
Olayları yalnızca eklenebilir bir günlükte kalıcı olarak sakladığınızı, bir denetim izi tuttuğunuzu ve gerektiğinde olayları yeniden oynattığınızı vurgular.
Anlık Görüntüler ve Optimizasyon
9:39'da, Derek anlık görüntüleme konusunu ele alır. Genellikle olay kaynaklama ile birlikte tartışılsa da, anlık görüntülerin, temel bir gereklilikten ziyade bir performans optimizasyonu olduğunu açıklar.
Anlık görüntüler, yalnızca ekli bir günlük aracılığıyla tam tarihçe mevcut olsa da periyodik olarak kısmi bir durumu kaydederek tüm olayların yeniden oynatma yükünü azaltır.
Ana Ayrım: Olay Kaynaklama ve Olay Güdümlü Mimari
10:00'da, Derek yaygın bir yanlış anlamaya karşı uyarır: olay kaynaklama ve olay güdümlü mimari farklıdır! Kafka gibi araçlar veri dağıtımına yardımcı olur, ancak gerçek olay kaynaklama, değiştirilmez bir denetim izi olarak alan olaylarını kaydetmeye odaklanır.
Bu ayrımı anlamak, olay kaynaklamayı karmaşık sistemlerinize entegre ettiğinizde çok önemlidir.
Sonuç
Derek Comartin'in videosunu izledikten sonra, olay kaynaklamanın yalnızca son durumu değil, her değişikliği bir olay olarak kaydetmekle ilgili olduğu açıktır. Yalnızca ekli bir depolama sisteminde olayları saklayarak, bir denetim izi sağlayan, olayları sorgulama esnekliği sunan ve komut sorgusu sorumluluk ayrımı için güçlü destek sunan zengin bir olay şeması oluşturursunuz.
İster C# olay kaynaklama ve .NET Core ile ister başka bir platformda çalışıyor olun, Derek'in temel kavramlar, olay işleyiciler, özel setler, korumalı setler ve modellerinizde olayları "private void Apply()" gibi uygulama konularındaki yapısal açıklaması inanılmaz derecede değerlidir.
Dayanıklı bir alan modeli inşa etme, depolama sisteminizi iyileştirme veya nihai tutarlılık gibi birçok faydası olan karmaşık modeller oluşturma konularında çalışıyorsanız, Derek'in yaklaşımını incelemek bir zorunluluktur. Daha fazla bilgilendirici video için YouTube kanalına göz atın.

