﻿
{"id":21411,"date":"2021-04-20T08:45:34","date_gmt":"2021-04-20T08:45:34","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=21411"},"modified":"2021-07-11T08:32:33","modified_gmt":"2021-07-11T08:32:33","slug":"event-sourcing-nedir-haydi-gelin-hep-beraber-inceleyelim","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/event-sourcing-nedir-haydi-gelin-hep-beraber-inceleyelim\/","title":{"rendered":"Event Sourcing Nedir? Haydi Gelin Hep Beraber \u0130nceleyelim"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<blockquote><p>Bu i\u00e7eri\u011fimizde, bir veri \u00fczerinde meydana gelen t\u00fcm de\u011fi\u015fiklikleri kay\u0131t alt\u0131nda tutmam\u0131z\u0131 \u00f6neren ve b\u00f6ylece ilgili verinin sadece g\u00fcncel ham vaziyettinden ibaret tutulmas\u0131ndan ziyade o verinin s\u00fcre\u00e7te ya\u015fad\u0131\u011f\u0131 de\u011fi\u015fikliklerinde esas\u0131nda ilgili verinin bir par\u00e7as\u0131 oldu\u011funu savunan ve bundan kaynakl\u0131 kay\u0131t alt\u0131na al\u0131nmas\u0131n\u0131 s\u00f6yleyen Event Sourcing pattern&#8217;\u0131ndan bahsediyor olaca\u011f\u0131m.<\/p><\/blockquote>\n<p>Konuya dair i\u00e7eri\u011fimiz esas olarak tahminen d\u00f6rt par\u00e7a makaleden olu\u015facakt\u0131r. Bu ilk makalemizde Event Sourcing \u00fczerine detayl\u0131 teorik bir incelemede bulunacak; ikinci, \u00fc\u00e7\u00fcnc\u00fc ve d\u00f6rd\u00fcnc\u00fc makalelerde ise Event Sourcing&#8217;e dair farkl\u0131 t\u00fcrlerde pratiksel \u00e7\u00f6z\u00fcmler getirmeye \u00e7al\u0131\u015faca\u011f\u0131z.<\/p>\n<p>O halde ennn temelden mevzuya girelim ve <em>Event Sourcing Nedir?<\/em> sorusunu sorarak i\u00e7eri\u011fimizin seyrine ba\u015flayal\u0131m&#8230;<\/p>\n<h3>Event Sourcing Nedir?<\/h3>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-300x172.png\" alt=\"Event Sourcing Nedir? Haydi Gelin Hep Beraber \u0130nceleyelim\" width=\"300\" height=\"172\" class=\"alignleft size-medium wp-image-21415\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-300x172.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim.png 594w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>\u015eimdi biraz bilenlere hitap ediyor olsakta benim \u00e7ok sevdi\u011fim bir oyundan bahsederek ba\u015flamak istiyorum. Satran\u00e7! Satran\u00e7 \u00e7ok g\u00fczel oyun de\u011fil mi? G\u00f6rme ve mant\u0131k duyular\u0131n\u0131n bir araya gelip ortaya analitik bir sonu\u00e7 \u00e7\u0131kard\u0131\u011f\u0131 nadir sanatsal oyunlardan biri&#8230;<\/p>\n<p>E\u011fer satranc\u0131 biliyorsan\u0131z, elbet bir iki turnuvas\u0131n\u0131 izlemi\u015f yahut internetten bi ka\u00e7 el oyun atm\u0131\u015fl\u0131\u011f\u0131n\u0131z vard\u0131r kanaatindeyim. An\u0131msarsan\u0131z e\u011fer her iki durumda da satran\u00e7ta taraflar\u0131n yapt\u0131klar\u0131 hamleler kay\u0131t alt\u0131na al\u0131nmakta ve oyun nihayete vard\u0131\u011f\u0131nda bu kay\u0131tlar sayesinde nas\u0131l bir seyrin yap\u0131labildi\u011fi rahatl\u0131kla g\u00f6r\u00fclebilmektedir. Hatta bu hamlelerin kay\u0131t alt\u0131na al\u0131nmas\u0131 sayesinde oyunun herhangi bir T an\u0131na geri d\u00f6nebilmekte m\u00fcmk\u00fcnd\u00fcr. \u00d6yle de\u011fil mi?<\/p>\n<p>\u0130\u015fte satran\u00e7&#8217;ta ki bu hamleleri kaydetme durumu yaz\u0131l\u0131msal a\u00e7\u0131dan bir <em>Event Sourcing<\/em>&#8216;dir diyebiliriz. Olay\u0131 yaz\u0131l\u0131msal perspektiften yorumlad\u0131\u011f\u0131m\u0131zda her bir hamle bir Event&#8217;tir. Yani olayd\u0131r.<\/p>\n<p><strong>Peki event nedir?<\/strong><br \/>\nEvent, istek neticesinde olay\u0131n\/i\u015fin\/i\u015flemin ger\u00e7ekle\u015fmesi durumudur. \u00d6rne\u011fin; bir kullan\u0131c\u0131n\u0131n sistem \u00fczerinde hesap a\u00e7mas\u0131 yaz\u0131l\u0131msal a\u00e7\u0131dan &#8220;KullaniciOlusturuldu&#8221; \u015feklinde event olarak tan\u0131mlanabililir.<\/p>\n<blockquote><p><em style=\"color:green;\">Event&#8217;ler; olmu\u015f, bitmi\u015f olaylar\u0131 tarif ederler. Bundan dolay\u0131 isimlendirmelerde ge\u00e7mi\u015f zaman eki olmal\u0131d\u0131r!<\/p>\n<p style=\"font-size:11px;line-height:1.3;\">\u00d6RNE\u011e\u0130N; <br \/><s style=\"color:red;\">WhitePawnMove<\/s> | WhitePawnMoved\u2713<br \/><s style=\"color:red;\">BlackPawnMove<\/s> | BlackPawnMoved\u2713<br \/><s style=\"color:red;\">BlackPawnTake<\/s> | BlackPawnTaken\u2713<br \/><s style=\"color:red;\">KapiAciliyor<\/s> | KapiAcildi\u2713<br \/>vs&#8230;<\/p>\n<p><\/em><\/p><\/blockquote>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-1.png\" alt=\"Event Sourcing Nedir Haydi Gelin Hep Beraber \u0130nceleyelim\" width=\"151\" height=\"152\" class=\"alignleft size-full wp-image-21439\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-1.png 151w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-1-150x150.png 150w\" sizes=\"auto, (max-width: 151px) 100vw, 151px\" \/><\/a>Yine satran\u00e7 \u00f6rne\u011finden devam edersek e\u011fer her bir hamle bir olayd\u0131r. \u00c7\u00fcnk\u00fc yap\u0131lm\u0131\u015f, olmu\u015f, bitmi\u015ftir ve art\u0131k kay\u0131t alt\u0131na al\u0131nm\u0131\u015ft\u0131r. Yukar\u0131daki g\u00f6rsele g\u00f6z atarsan\u0131z e\u011fer oyun ba\u015flam\u0131\u015ft\u0131r. Bunu sa\u011fdaki tahtadan g\u00f6rebilmekteyiz. Hemen yan tarafa bu tahtan\u0131n T an\u0131ndaki bir g\u00f6rselini alal\u0131m ve olay seyrini a\u015fa\u011f\u0131daki gibi modelleyelim.<\/p>\n<table style=\"width:100%\">\n<thead>\n<tr>\n<th><\/th>\n<th colspan=\"3\" style=\"color:green;\">AGGREGATE\/MA\u00c7<\/th>\n<\/tr>\n<tr>\n<th><\/th>\n<th>Hamle Numaras\u0131<\/th>\n<th>Hamle<\/th>\n<th>Event<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td rowspan=\"6\" style=\"color:green;\">PROJECTION<\/td>\n<td style=\"color:blue;font-size:10px;\">1<\/td>\n<td style=\"color:purple;font-size:10px;\">Beyaz Piyon Bir Ad\u0131m \u00d6ne<\/td>\n<td style=\"color:red;font-size:10px;\">WhitePawnMoved<\/td>\n<\/tr>\n<tr>\n<td style=\"color:blue;font-size:10px;\">2<\/td>\n<td style=\"color:purple;font-size:10px;\">Siyah Piyon Bir Ad\u0131m \u00d6ne<\/td>\n<td style=\"color:red;font-size:10px;\">BlackPawnMoved<\/td>\n<\/tr>\n<tr>\n<td style=\"color:blue;font-size:10px;\">3<\/td>\n<td style=\"color:purple;font-size:10px;\">Beyaz Piyon Bir Ad\u0131m \u00d6ne<\/td>\n<td style=\"color:red;font-size:10px;\">WhitePawnMoved<\/td>\n<\/tr>\n<tr>\n<td style=\"color:blue;font-size:10px;\">4<\/td>\n<td style=\"color:purple;font-size:10px;\">Siyah Piyon Bir Ad\u0131m \u00d6ne<\/td>\n<td style=\"color:red;font-size:10px;\">BlackPawnMoved<\/td>\n<\/tr>\n<tr>\n<td style=\"color:blue;font-size:10px;\">5<\/td>\n<td style=\"color:purple;font-size:10px;\">Beyaz Piyon Siyah Piyonu Yer<\/td>\n<td style=\"color:red;font-size:10px;\">BlackPawnTaken<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Dikkat ederseniz bu satran\u00e7 oyununun tamam\u0131 bu hamlelerin b\u00fct\u00fcn\u00fcnden meydana gelmektedir. Yani yap\u0131lan de\u011fi\u015fiklikler\/olaylar\/hamleler tekil olarak oyunu yans\u0131tmamakta, bir b\u00fct\u00fcn olarak o oyunu temsil etmektedirler. \u0130\u015fte bu yaz\u0131l\u0131msal s\u00fcre\u00e7lerde bir veri i\u00e7inde ge\u00e7erlidir. <\/p>\n<blockquote><p><em>Yaz\u0131l\u0131msal s\u00fcre\u00e7lerde, bir veri \u00fczerinde yap\u0131lan de\u011fi\u015fiklerin t\u00fcm\u00fc o veriyi temsil etmektedir. Yani veri, salt olarak son de\u011fi\u015fikli\u011fin yap\u0131ld\u0131\u011f\u0131 hali olarak de\u011fil daha fazlas\u0131n\u0131 ifade etmektedir. Bu durumu i\u00e7eri\u011fimizin ileriki sat\u0131rlar\u0131nda daha da net bir \u015fekilde izah ediyor olaca\u011f\u0131m&#8230;<\/em><\/p><\/blockquote>\n<p>Ayr\u0131ca dikkat ederseniz her bir meydana gelen hamle s\u0131ra numaras\u0131yla i\u015faretlenmektedir. Bu durumda da istenilen hamleye h\u0131zl\u0131ca geri d\u00f6n\u00fc\u015f yap\u0131labilir ve oyuna oradan devam edilebilir. Bunu, yaz\u0131l\u0131msal a\u00e7\u0131dan bir veri i\u00e7inde ger\u00e7ekle\u015ftirebiliriz. \u0130lgili verinin s\u00fcre\u00e7te ya\u015fad\u0131\u011f\u0131 de\u011fi\u015fiklikleri kay\u0131t alt\u0131nda tutarsak e\u011fer herhangi bir T zaman\u0131ndaki halini h\u0131zl\u0131ca \u00f6\u011frenebilir yahut geri d\u00f6nebiliriz. H\u0131\u0131 tabi bunu \u00f6nceki sat\u0131rlarda s\u00f6ylemi\u015ftim \ud83d\ude42 Olsun ziyan\u0131 yok! Lakin burada eklemem gereken bir husus var. O da \u015fu ki, diyelim ki satran\u00e7ta deneyimsiz bir oyuncunun hamlesini c\u00f6mert\u00e7e geri almas\u0131na m\u00fcsaade ediyorsunuz. Evet, satran\u00e7ta bu durum m\u00fcmk\u00fcnd\u00fcr ve hamle geri al\u0131nabilir. Ama yaz\u0131l\u0131msal a\u00e7\u0131dan bir verinin \u00fczerinde yap\u0131lan de\u011fi\u015fikli\u011fi herhangi bir T zamandaki haline geri d\u00f6nd\u00fcrmek istiyorsan\u0131z bu durumda yeni bir olayd\u0131r. Yani buradan <em>-bir olay ak\u0131\u015f\u0131ndan hi\u00e7bir olay silinemez!-<\/em> kan\u0131s\u0131n\u0131 \u00e7\u0131karabiliriz. Bu nedenle bu tarz bir durumu yaz\u0131l\u0131msal a\u00e7\u0131dan &#8216;ReversePreviousMoved&#8217; gibi isimde bir event&#8217;le kar\u015f\u0131layabiliriz..<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-2.png\" alt=\"Event Sourcing Nedir Haydi Gelin Hep Beraber \u0130nceleyelim\" width=\"701\" height=\"316\" class=\"aligncenter size-full wp-image-21452\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-2.png 701w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-2-300x135.png 300w\" sizes=\"auto, (max-width: 701px) 100vw, 701px\" \/><\/a><\/p>\n<p>Ve son olarak bir satran\u00e7 oyununa dair olan olaylar\u0131 ba\u015fka satran\u00e7tan ay\u0131rmak i\u00e7in buna &#8216;Ma\u00e7&#8217; diyoruz. De\u011fil mi? Yaz\u0131l\u0131msal a\u00e7\u0131dan bir veriye dair olabilecek t\u00fcm olaylar\u0131, di\u011fer verilerin olaylar\u0131na kar\u015f\u0131 ay\u0131rabilmek i\u00e7in bunlar\u0131 <strong><em>Aggregate<\/em><\/strong> olarak nitelendiriyoruz. Her bir event&#8217;e de <strong><em>Projection<\/em><\/strong> diyoruz.<\/p>\n<blockquote><p><em style=\"color:green;\"><strong>Aggregate<\/strong>, bir veriye ait olan ve birbiriyle ili\u015fkisel olaylar\u0131n meydana geldi\u011fi b\u00fct\u00fcnd\u00fcr. <strong>Projection<\/strong> ise bir verinin durumunu belirlemek i\u00e7in ger\u00e7ekle\u015ftirilen olaylard\u0131r.<\/em><\/p><\/blockquote>\n<p>T\u00fcm bunlardan yola \u00e7\u0131karak, yaz\u0131l\u0131m s\u00fcre\u00e7lerinde veriler \u00fczerindeki yap\u0131lan i\u015flemlerin\/olaylar\u0131n kay\u0131tlar\u0131nda kabul edece\u011fimiz \u00f6n prensipler \u015funlard\u0131r diyebiliriz;<\/p>\n<ul>\n<li>Olay ak\u0131\u015flar\u0131 yaln\u0131zca ileriye do\u011fru olmal\u0131d\u0131r. Yanl\u0131\u015f yaz\u0131lan yahut geri d\u00f6n\u00fclmesi gereken durumlarda &#8216;Update\/D\u00fczenleme&#8217; tarz\u0131 olaylardan \u00e7ok de\u011fi\u015fikli\u011fi ifade edecek olan &#8216;\u0130ptal&#8217; -> &#8216;Yeniden Olu\u015fturmak&#8217; gibi olaylar tasarlanmal\u0131d\u0131r.<\/li>\n<li>Herhangi bir olayla ilgili t\u00fcm veriler, bu veriler i\u00e7in mevcut bir i\u015f ihtiyac\u0131 olup olmad\u0131\u011f\u0131na bak\u0131lmaks\u0131z\u0131n saklanmal\u0131d\u0131r. \u0130deal olarak hi\u00e7bir veri at\u0131lmamal\u0131d\u0131r.<\/li>\n<\/ul>\n<h3>Yaz\u0131l\u0131m S\u00fcre\u00e7lerinde Event Sourcing Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>Yaz\u0131l\u0131m s\u00fcre\u00e7lerinde Event Sourcing&#8217;i anlayabilmek i\u00e7in geleneksel yaz\u0131l\u0131m geli\u015ftirme y\u00f6ntemini incelememiz gerekmektedir. Geleneksel yaz\u0131l\u0131m geli\u015ftirme y\u00f6nteminde, bir veri \u00fcretilir ve sonras\u0131nda herhangi bir saklama ortam\u0131nda depolan\u0131r. S\u00fcre\u00e7te bu veri \u00fczerinde yap\u0131lacak herhangi bir de\u011fi\u015fiklik(CRUD) do\u011frudan ilgili verinin bulundu\u011fu saklama ortam\u0131ndaki kopyas\u0131 \u00fczerinde ger\u00e7ekle\u015ftirilir. Yani her bir de\u011fi\u015fiklik ilgili verinin fiziksel olarak de\u011fi\u015fikli\u011fe u\u011framas\u0131na sebebiyet verecektir ve nihai olarak veri yap\u0131lan en son de\u011fi\u015fikli\u011fin etkisiyle  depolanmaya devam edecektir.<\/p>\n<p><em>Peki sizce bir veri bundan ibaret midir? Yani her \u015fey bir CRUD neticesinde oldu bitti midir?<\/em> De\u011fil dir! Dimi&#8230;<br \/>\nBuna \u015f\u00f6yle bir \u00f6rnek verebiliriz. Misal bir i\u015f toplant\u0131s\u0131 planlad\u0131\u011f\u0131m\u0131z\u0131 d\u00fc\u015f\u00fcn\u00fcrsek&#8230;<\/p>\n<table>\n<thead>\n<tr>\n<th>Event<\/th>\n<th>CRUD<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u0130\u015f toplant\u0131s\u0131 x tarihine planland\u0131<\/td>\n<td style=\"font-size:10px;\">Bu bir <span style=\"color:red;\">insert<\/span>&#8216;dir<\/td>\n<\/tr>\n<tr>\n<td>\u0130\u015f toplant\u0131s\u0131 y tarihine de\u011fi\u015ftirildi<\/td>\n<td style=\"font-size:10px;\">Bu bir <span style=\"color:red;\">update<\/span>&#8216;dir<\/td>\n<\/tr>\n<tr>\n<td>\u0130\u015f toplant\u0131s\u0131 z tarihine de\u011fi\u015ftirildi<\/td>\n<td style=\"font-size:10px;\">Bu da bir <span style=\"color:red;\">update<\/span>&#8216;dir<\/td>\n<\/tr>\n<tr>\n<td>\u0130\u015f toplant\u0131s\u0131 iptal edildi<\/td>\n<td style=\"font-size:10px;\">Ve bu da bir <span style=\"color:red;\">update<\/span>&#8216;dir<\/td>\n<\/tr>\n<tr>\n<td>\u0130\u015f toplant\u0131s\u0131 w tarihine planland\u0131<\/td>\n<td style=\"font-size:10px;\">Ve bu da bir <span style=\"color:red;\">insert<\/span>&#8216;dir<\/td>\n<\/tr>\n<tr>\n<td>\u0130\u015f toplant\u0131s\u0131 tamamland\u0131<\/td>\n<td style=\"font-size:10px;\">Veeee bu da bir <span style=\"color:red;\">update<\/span>&#8216;dir<\/td>\n<\/tr>\n<tr>\n<td>\u0130\u015f toplant\u0131s\u0131na kat\u0131lanlar\u0131n yorumlar\u0131 al\u0131nd\u0131<\/td>\n<td style=\"font-size:10px;\">Veeee bu da bir <span style=\"color:red;\">insert<\/span>&#8216;dir<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Yani dikkat ederseniz bir veri i\u00e7in her \u015feyin CRUD&#8217;dan ibaret olmad\u0131\u011f\u0131n\u0131 anl\u0131yoruz! Veri CRUD&#8217;dan daha fazlas\u0131d\u0131r. Yukar\u0131daki i\u015f toplant\u0131s\u0131na dair olan veri bu eventlerin b\u00fct\u00fcn\u00fcyle bir anlam kazanmakta de\u011fil midir? ve esas\u0131nda bu veri a\u015fa\u011f\u0131daki event&#8217;lerden ibarettir diyebilir miyiz?<\/p>\n<ul style=\"line-height:1.7;\">\n<li style=\"font-size:12px;\">MeetingRegistered<\/li>\n<li style=\"font-size:12px;\">MeetingDateChanged<\/li>\n<li style=\"font-size:12px;\">MeetingDateChanged<\/li>\n<li style=\"font-size:12px;\">MeetingCancelled<\/li>\n<li style=\"font-size:12px;\">MeetingRegistered<\/li>\n<li style=\"font-size:12px;\">MeetingCompleted<\/li>\n<li style=\"font-size:12px;\">MeetingAddedComment<\/li>\n<\/ul>\n<p>Haliyle verilerin anlam\u0131 birden fazla event toplam\u0131ysa klasik yakla\u015f\u0131mlardaki gibi saklama ortamlar\u0131nda veriyi tutmaktan ziyade bu event&#8217;leri tutmak daha mant\u0131kl\u0131d\u0131r.<\/p>\n<blockquote><p><em style=\"color:purple;\">Event Sourcing pattern&#8217;\u0131, verilerin son durumlar\u0131n\u0131 tutmaktan ziyade, verilerin son durumlar\u0131n\u0131 etkileyen olaylar zincirinin kaydedilmesini ve gerekti\u011fi taktirde istemci taraf\u0131ndan sorgu g\u00f6nderilip verinin son durumuna dair sistemdeki var olan t\u00fcm event&#8217;lar\u0131n bilgilerini birle\u015ftirilerek istemciye sunulmas\u0131n\u0131 \u00f6nerir.<\/em><\/p><\/blockquote>\n<h3>Geleneksel Yakla\u015f\u0131m vs Event Sourcing \u00d6rneklendirmesi<\/h3>\n<p>\u015eimdi geleneksel yakla\u015f\u0131m ile Event Sourcing aras\u0131ndaki fark\u0131 ortaya net koyabilmek i\u00e7in teorik bir \u00f6rneklendirme \u00fczerinden seyredelim.<\/p>\n<p><span style=\"color:gray;font-size:10px;\">Not : Bu senaryo https:\/\/ademcatamak.medium.com\/event-sourcing-6683f3f28b5d adresindeki makaleden al\u0131nt\u0131lanm\u0131\u015ft\u0131r.<\/span><\/p>\n<table>\n<thead>\n<tr>\n<th colspan=\"2\">SENARYO<\/th>\n<\/tr>\n<tr>\n<th colspan=\"2\" style=\"font-size:10px;text-align:left;\">\nGeli\u015ftirilen bir uygulamada kullan\u0131c\u0131ya dair &#8216;Ad&#8217;, &#8216;Soyad&#8217;, &#8216;\u015eifre&#8217;, &#8216;EPosta&#8217;, &#8216;EPostaOnayland\u0131&#8217; vs. gibi bilgilerin tutuldu\u011funu d\u00fc\u015f\u00fcnelim.<br \/>\nVe bu uygulama \u00fczerinde s\u0131ras\u0131yla a\u015fa\u011f\u0131daki olaylar\u0131n cereyan etti\u011fini varsayal\u0131m;<\/p>\n<ul style=\"line-height:1.7;font-size:11px;\">\n<li>Kullan\u0131c\u0131 e-posta ve \u015fifre bilgisi ile hesap a\u00e7t\u0131<\/li>\n<li>Kullan\u0131c\u0131 ad ve soyad\u0131n\u0131 g\u00fcncelledi<\/li>\n<li>Kullan\u0131c\u0131 e-posta hesab\u0131n\u0131 onaylad\u0131<\/li>\n<\/ul>\n<\/th>\n<\/tr>\n<tr>\n<th style=\"witdh:50%;\">Geleneksel Yakla\u015f\u0131m<\/th>\n<th style=\"witdh:50%;\">Event Sourcing<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"color:green;font-size:11px;\">Geleneksel yakla\u015f\u0131m ile kullan\u0131c\u0131 verileri depoland\u0131\u011f\u0131nda a\u015fa\u011f\u0131daki gibi bir \u00e7al\u0131\u015fma sergilenecektir.<\/td>\n<td style=\"color:green;font-size:11px;\">Event Sourcing ile kullan\u0131c\u0131 verileri depoland\u0131\u011f\u0131nda a\u015fa\u011f\u0131daki gibi bir \u00e7al\u0131\u015fma sergilenecektir.<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\" style=\"color:gray;font-size:11px;\">Kullan\u0131c\u0131 e-posta ve \u015fifre bilgisi ile hesap a\u00e7t\u0131<\/td>\n<\/tr>\n<tr>\n<td>\nT1<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-3-300x46.png\" alt=\"Event Sourcing Nedir Haydi Gelin Hep Beraber \u0130nceleyelim\" width=\"300\" height=\"46\" class=\"aligncenter size-medium wp-image-21504\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-3-300x46.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-3.png 700w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>\n<\/td>\n<td>\nT1<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-6-300x48.png\" alt=\"Event Sourcing Nedir Haydi Gelin Hep Beraber \u0130nceleyelim\" width=\"300\" height=\"48\" class=\"aligncenter size-medium wp-image-21508\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-6-300x48.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-6-1024x164.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-6-768x123.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-6.png 1288w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\" style=\"color:gray;font-size:11px;\">Kullan\u0131c\u0131 ad ve soyad\u0131n\u0131 g\u00fcncelledi<\/td>\n<\/tr>\n<tr>\n<td>T2<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-4-300x65.png\" alt=\"Event Sourcing Nedir Haydi Gelin Hep Beraber \u0130nceleyelim\" width=\"300\" height=\"65\" class=\"aligncenter size-medium wp-image-21505\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-4-300x65.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-4.png 700w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>\n<\/td>\n<td>T2<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-7.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-7-300x76.png\" alt=\"Event Sourcing Nedir Haydi Gelin Hep Beraber \u0130nceleyelim\" width=\"300\" height=\"76\" class=\"aligncenter size-medium wp-image-21511\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-7-300x76.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-7.png 700w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\" style=\"color:gray;font-size:11px;\">Kullan\u0131c\u0131 e-posta hesab\u0131n\u0131 onaylad\u0131<\/td>\n<\/tr>\n<tr>\n<td>T3<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-5-300x61.png\" alt=\"Event Sourcing Nedir Haydi Gelin Hep Beraber \u0130nceleyelim\" width=\"300\" height=\"61\" class=\"aligncenter size-medium wp-image-21506\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-5-300x61.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-5.png 700w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>\n<\/td>\n<td>T3<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-8.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-8-300x86.png\" alt=\"Event Sourcing Nedir Haydi Gelin Hep Beraber \u0130nceleyelim\" width=\"300\" height=\"86\" class=\"aligncenter size-medium wp-image-21514\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-8-300x86.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-8.png 700w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere&#8230; \u00d6nceki sat\u0131rlarda da de\u011findi\u011fimiz gibi art\u0131k Event Sourcing ile verilerimizin herhangi bir T zaman\u0131ndaki durumunu tekrar elde etmek m\u00fcmk\u00fcn bir haldedir diyebiliriz.<\/p>\n<h3>Event Sourcing &#038; CQRS &#8211; Veri Sorgulamas\u0131 Nas\u0131l Yap\u0131l\u0131r?<\/h3>\n<p>Haliyle art\u0131k \u015fu kan\u0131ya vard\u0131k ki, istemciden gelen &#8216;Command&#8217; istekleri neticesinde verileri yukar\u0131daki gibi event olarak kaydedece\u011fiz. Fakat bu event&#8217;ler belirli \u015fartlara g\u00f6re sorgulanabilir yap\u0131lar olmad\u0131\u011f\u0131ndan dolay\u0131 istemciden gelen &#8216;Query&#8217; isteklerine kar\u015f\u0131l\u0131k farkl\u0131 bir veritaban\u0131ndan sonu\u00e7 d\u00f6nmemiz gerekecektir. \u0130\u015fte b\u00f6yle bir durumda <a href=\"https:\/\/www.gencayyildiz.com\/blog\/cqrs-pattern-nedir-mediatr-kutuphanesi-ile-nasil-uygulanir\/\" rel=\"noopener\" target=\"_blank\">CQRS pattern<\/a>&#8216;\u0131 Event Sourcing ile uygulayarak muhte\u015fem ikiliyi sahneye s\u00fcrebiliriz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-9.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-9-300x167.png\" alt=\"Event Sourcing Nedir Haydi Gelin Hep Beraber \u0130nceleyelim\" width=\"300\" height=\"167\" class=\"alignleft size-medium wp-image-21525\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-9-300x167.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2021\/04\/Event-Sourcing-Nedir-Haydi-Gelin-Hep-Beraber-Inceleyelim-9.png 762w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>Yandaki \u015femay\u0131 incelerseniz e\u011fer &#8216;Query&#8217; ve &#8216;Command&#8217; isteklerini farkl\u0131 veritabanlar\u0131n da kar\u015f\u0131layacak ve i\u015flem ger\u00e7ekle\u015ftirece\u011fiz. E\u011fer ki bir event olu\u015fturulacaksa bunu &#8216;Command B\u00f6lgesi&#8217;nde oldu\u011fu gibi Event Sourcing olarak depolayaca\u011f\u0131z. Bunun i\u00e7in MSSQL gibi farkl\u0131 veritabanlar\u0131 yahut farkl\u0131 tasar\u0131mlar kullanabiliriz. Amma velakin \u00f6zellikle sonraki yaz\u0131lar\u0131mda de\u011finece\u011fim &#8216;Event Store&#8217; ad\u0131nda bir teknolojiyi kullanarak, uygulamadaki event&#8217;leri rahatl\u0131kla depolayabilecek ve y\u00f6netebilece\u011fiz. Velhas\u0131l, event olarak depolanan bu veriler ayn\u0131 zamanda bir kuyruk sistemiyle(misal RabbitMQ) &#8216;Query&#8217;lerin depoland\u0131\u011f\u0131 veritaban\u0131na(Query Store) yans\u0131t\u0131l\u0131rlar. Yans\u0131t\u0131l\u0131rlar \u00e7\u00fcnk\u00fc gelen &#8216;Command&#8217;ler ile &#8216;Query&#8217;ler aras\u0131ndaki tutars\u0131zl\u0131\u011f\u0131 ancak bu \u015fekilde ortadan kald\u0131rabiliriz. \u0130\u015fte bu i\u015flem &#8216;Projection B\u00f6lgesi&#8217;nde ge\u00e7erlidir. &#8216;Query B\u00f6lgesi&#8217;nde ise gerekli sorgulamalar ger\u00e7ekle\u015ftirilerek sonu\u00e7 istemciye d\u00f6nd\u00fcr\u00fclecektir.<\/p>\n<blockquote><p><em style=\"color:orange;\">Bir veri, veri sat\u0131r\u0131 olarak de\u011fil de, bu sat\u0131r\u0131 olu\u015fturacak event&#8217;lerin toplam\u0131 olarak ifade edilirse bize Eventual Consistency(Nihai Tutarl\u0131l\u0131k) bir yap\u0131 sunabilir.<\/em><\/p><\/blockquote>\n<h3>Event Sourcing&#8217;in Avantajlar\u0131 Nelerdir?<\/h3>\n<p>Event Sourcing&#8217;in geleneksel yakla\u015f\u0131ma nazaran a\u015fa\u011f\u0131da s\u0131ralad\u0131\u011f\u0131m\u0131z \u00fczere bir tak\u0131m avantajlar\u0131 vard\u0131r.<\/p>\n<ul>\n<li><em><strong>\u0130zlenebilirli\u011fi ve tarihsel bazda yeniden \u00fcretimi kolayla\u015ft\u0131r\u0131r<\/strong><\/em><br \/>\n\u0130zlenebilirlik, kay\u0131tl\u0131 event&#8217;leri analiz ederek mevcut sistem durumunun nas\u0131l bu hale geldi\u011fini ad\u0131m ad\u0131m anlayabilece\u011fimiz anlam\u0131na gelir. Bu \u00f6zellik b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalarda gayet kullan\u0131\u015fl\u0131l\u0131k sergilemektedir.\n<\/li>\n<li><em><strong>Hatalar\u0131n onar\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r<\/strong><\/em><br \/>\nYukar\u0131da bahsetti\u011fimiz izlenebilirlik \u00f6zelli\u011fi sayesinde ge\u00e7mi\u015fteki herhangi bir T an\u0131na d\u00f6nebilme yahut o andaki veriyi olu\u015fturabilme imkan\u0131na sahip oldu\u011fumuz i\u00e7in, bir hata bulundu\u011fu taktirde i\u015f verilerimizi do\u011frudan bir araya yeniden getirebilir ve onar\u0131m tamamland\u0131ktan sonra verilerimizi tazeleyebiliriz. Geleneksel yakla\u015f\u0131mda ise bu tarz hata durumlar\u0131n\u0131n onar\u0131lmas\u0131 olduk\u00e7a maliyetli ve zahmetli olmaktad\u0131r.\n<\/li>\n<li><em><strong>G\u00fc\u00e7l\u00fc performans sa\u011flanabilir<\/strong><\/em><br \/>\nAggregate nesnesi i\u00e7erisindeki t\u00fcm event&#8217;ler derlenerek elde edilen veri herhangi bir depolama ihtiyac\u0131 hissedilmeksizin haf\u0131zada\/bellekte olu\u015fturulabilir\/tutulabilir.\n<\/li>\n<li><em><strong>Veri analizi ve di\u011fer sistemleri kullanmak kolayd\u0131r<\/strong><\/em><br \/>\nEvent Sourcing&#8217;de veriler esas itibariyle bir event olduklar\u0131ndan dolay\u0131 bu veriler \u00fczerinde analizler yapmak olduk\u00e7a kolay olacakt\u0131r.\n<\/li>\n<\/ul>\n<h3>Event Sourcing&#8217;in Dezavantajlar\u0131 Nelerdir?<\/h3>\n<p>Elbet her yap\u0131lanmada oldu\u011fu gibi Event Sourcing&#8217;de de a\u015fa\u011f\u0131daki gibi dezavantajlar vard\u0131r.<\/p>\n<ul>\n<li><strong><em>Geli\u015ftirme ve geli\u015ftirici d\u00fc\u015f\u00fcncesini de\u011fi\u015ftirmek<\/em><\/strong><br \/>\nSan\u0131r\u0131m dezavantajlar aras\u0131ndaki en bariz olan\u0131 bu olsa gerek \ud83d\ude42 En nihayetinde Event Sourcing pattern&#8217;\u0131 bir geli\u015ftirici taraf\u0131ndan uygulanmal\u0131d\u0131r ve geleneksel mimarilere yatk\u0131n olanlar\u0131n h\u0131zl\u0131 bir \u015fekilde kavrayabilece\u011fi anatomiye sahip bir pattern de\u011fildir! Bu durumda, sindirebilirlik a\u00e7\u0131s\u0131ndan bir nebze zorluk \u00e7\u0131karabilmektedir.\n<\/li>\n<li><strong><em>Olgun ve genel kabul g\u00f6rm\u00fc\u015f bir yol\/yordam\/tasar\u0131m olmamas\u0131<\/em><\/strong><br \/>\nEvent Sourcing&#8217;i uygulayabilmek i\u00e7in belli ba\u015fl\u0131 teknolojiler e\u015fli\u011finde tasar\u0131mlar sunulmaktad\u0131r. Amma velakin her ne olursa olsun genel kabul g\u00f6rm\u00fc\u015f bir mimarisel tasar\u0131mdan hala s\u00f6z edememekteyiz ve bunun yan\u0131nda bir\u00e7ok noktada kendi ki\u015fisel kararlar\u0131n\u0131zla anl\u0131k yarat\u0131c\u0131 \u00e7\u00f6z\u00fcmler uygulaman\u0131z gerekebilmektedir.\n<\/li>\n<li><strong><em>Performans t\u00fcketimi<\/em><\/strong><br \/>\n<em>Eee hoca! yukar\u0131da avantajlar\u0131ndan bahsederken &#8216;G\u00fc\u00e7l\u00fc performans sa\u011flayabilir&#8217; dedi\u011fin halde nas\u0131l oluyor da &#8216;Performans t\u00fcketimi&#8217; dezavantaj olabiliyor?<\/em> diye s\u00f6ylenmeyin \ud83d\ude42 Elbet performansa dair getirileri olan bu tasar\u0131m\u0131n belli durumlara istinaden g\u00f6t\u00fcr\u00fcleride olabilir. Misal olarak, veri okuma durumlar\u0131nda geleneksel y\u00f6nteme nazaran Event Sourcing performans k\u0131yaslamalar\u0131nda daha yava\u015f sonu\u00e7 verebilir. \u00c7\u00fcnk\u00fc, Event Sourcing yap\u0131sal olarak talep edilen veriyi, veriyle ilgili event&#8217;lerin d\u00f6k\u00fcm\u00fc olarak elde eder ve bu d\u00f6k\u00fcmden veriyi olu\u015fturmaya \u00e7al\u0131\u015f\u0131r. Ee haliyle bu durumda verinin olu\u015fturma s\u00fcrecinin, verinin haz\u0131r olarak tutuldu\u011fu geleneksel y\u00f6nteme k\u0131yasla daha yava\u015f sonu\u00e7 verece\u011fi a\u015fikard\u0131r.\n<\/li>\n<\/ul>\n<p>Evet&#8230; B\u00f6ylece Event Sourcing&#8217;e dair teorik olarak sa\u011flam temeller att\u0131k kanaatindeyim. \u0130\u00e7eri\u011fimizin ilk paragraflar\u0131nda bahsedildi\u011fi \u00fczere art\u0131k pratik \u00e7al\u0131\u015fmalar\u0131 sonraki devam niteli\u011findeki yaz\u0131lar\u0131m\u0131za ay\u0131ral\u0131m kanaatindeyim. Hem bu s\u00fcre zarf\u0131nda sizler bu i\u00e7eri\u011fi okuyup sindirirken, bende di\u011fer i\u00e7erikleri klavyeye al\u0131yor olaca\u011f\u0131m \ud83d\ude42<\/p>\n<p>O halde sonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere diyelim&#8230;<br \/>\n\u0130lgilenenlerin bol bol faydalanmas\u0131 dile\u011fiyle..<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<div style=\"font-size:11px;\">\n<h6>Kaynaklar<\/h6>\n<p>https:\/\/ademcatamak.medium.com\/event-sourcing-6683f3f28b5d<br \/>\nhttps:\/\/www.codeproject.com\/Articles\/872089\/Event-Sourcing-Overview<br \/>\nwww.ahmetkucukoglu.com\/event-sourcing-nedir\/\n<\/p><\/div>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde, bir veri \u00fczerinde meydana gelen t\u00fcm de\u011fi\u015fiklikleri kay\u0131t alt\u0131nda tutmam\u0131z\u0131 \u00f6neren ve b\u00f6ylece ilgili verinin sadece g\u00fcncel ham vaziyettinden ibaret tutulmas\u0131ndan ziyade o verinin s\u00fcre\u00e7te ya\u015fad\u0131\u011f\u0131 de\u011fi\u015fikliklerinde esas\u0131nda ilgili verinin bir&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":21525,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2739,12,153,3573],"tags":[4221,4217,4219,4220,4218,4222,4223,4225,4226,4227,4224],"class_list":["post-21411","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-c-sharp-c","category-design-pattern","category-microservices","tag-aggregate-nedir","tag-event-sourcing","tag-event-sourcing-aggregate","tag-event-sourcing-aggregate-nedir","tag-event-sourcing-nedir","tag-event-sourcing-projection","tag-event-sourcing-projection-nedir","tag-event-store","tag-eventual-consistency","tag-nihai-tutarlilik","tag-projection-nedir"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/21411","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=21411"}],"version-history":[{"count":120,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/21411\/revisions"}],"predecessor-version":[{"id":22217,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/21411\/revisions\/22217"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/21525"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=21411"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=21411"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=21411"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}