{"id":3789,"date":"2021-07-17T22:02:20","date_gmt":"2021-07-17T20:02:20","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=3789"},"modified":"2021-07-17T22:03:40","modified_gmt":"2021-07-17T20:03:40","slug":"how-should-my-event-be-designed-some-thoughts-on-event-based-systems","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/","title":{"rendered":"Event&#8217;im Nas\u0131l Olmal\u0131? Event-Based Sistemler Hakk\u0131nda Baz\u0131 D\u00fc\u015f\u00fcnceler"},"content":{"rendered":"<p>Bildi\u011fimiz gibi yaz\u0131l\u0131m geli\u015ftirme, \u00f6zellikle g\u00fcn\u00fcm\u00fcz ihtiya\u00e7lar\u0131 kar\u015f\u0131s\u0131nda kolay kolay bitmiyor. Yaz\u0131l\u0131m\u0131 geli\u015ftirmenin yan\u0131 s\u0131ra, onun s\u00fcrekli ayakta ve tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fabilmesini sa\u011flayabilmekte en b\u00fcy\u00fck sorun ve sorumluluklar\u0131m\u0131zdan bir tanesi. Tahmin edebilece\u011fimiz gibi bu gibi ihtiya\u00e7larda zamanla bizleri <strong>microservice mimarilerine<\/strong>, <strong>event-based sistemlere<\/strong>, <strong>distributed ortamlara<\/strong> do\u011fru y\u00f6neltmektedir.<\/p>\n<p>Makaleye ba\u015flamadan \u00f6nce \u015funu unutmamal\u0131y\u0131z ki her ne olursa olsun bu mimariler ve pattern&#8217;ler, tek bir at\u0131\u015fta t\u00fcm problemlerimizi \u00e7\u00f6z\u00fcmleyecek bir g\u00fcm\u00fc\u015f kur\u015fun de\u011fildir. Kendi do\u011frular\u0131m\u0131z\u0131 i\u00e7erisinde oldu\u011fumuz business context&#8217;e g\u00f6re belirlememiz gerekmektedir.<\/p>\n<p>Se\u00e7imlerimizi e\u011fer olabildi\u011fince do\u011fru bir \u015fekilde ger\u00e7ekle\u015ftirebilirsek gayet g\u00fczel i\u015fler ba\u015farabiliriz. Aksi bir durumda ise ge\u00e7mi\u015f tecr\u00fcbelerime dayanarak s\u00f6yleyebilirim ki se\u00e7imlerimizin getirece\u011fi baz\u0131 sorunlar\u0131 \u00e7\u00f6zmeye \u00e7al\u0131\u015f\u0131yorken kendimizi bulabiliriz.<\/p>\n<p>Bu makale kapsam\u0131nda ise event-based sistemler \u00fczerinde \u00e7al\u0131\u015f\u0131rken, event&#8217;lerimizi nas\u0131l \u015fekillendirebilece\u011fimiz hakk\u0131ndaki baz\u0131 d\u00fc\u015f\u00fcncelerimi sizlerle payla\u015fmak istiyorum.<\/p>\n<h2>Amac\u0131m\u0131z<\/h2>\n<p>\u00d6ncelikle <strong>event<\/strong> kullan\u0131m\u0131ndaki baz\u0131 ama\u00e7lar\u0131m\u0131z\u0131 hat\u0131rlayal\u0131m. Ben k\u0131saca &#8220;modularity&#8221; diyerek ele almak istiyorum.<\/p>\n<p>Gerek mod\u00fcllerin farkl\u0131 ekipler taraf\u0131ndan geli\u015ftirilebilmesi, gerekse de ba\u011f\u0131ms\u0131z deployment ve scale edilebilmesi gibi modularity, her anlam\u0131yla i\u00e7erisinde oldu\u011fumuz sistemin <strong>complexity&#8217;sini<\/strong> ve <strong>coupling&#8217;ini<\/strong> b\u00f6lebilmemize olanak sa\u011flamaktad\u0131r. Event&#8217;ler ise bu ama\u00e7lar\u0131m\u0131za ula\u015fmaya \u00e7al\u0131\u015f\u0131rken yararlanabilece\u011fimiz en temel yap\u0131 ta\u015flar\u0131m\u0131zdan birisidir.<\/p>\n<p>Microservice mimarisi a\u00e7\u0131s\u0131ndan uygulamalar\u0131m\u0131z\u0131 m\u00fcmk\u00fcn oldu\u011funda k\u00fc\u00e7\u00fck, decoupled par\u00e7alar halinde design ederiz. Event&#8217;leri ise bu uygulamalar aras\u0131ndaki ileti\u015fimi, <strong>non-blocking<\/strong> ve <strong>asynchronous<\/strong> olarak sa\u011flayabilmek i\u00e7in kullan\u0131r\u0131z. B\u00f6ylece bir uygulama kendi domain context&#8217;i i\u00e7erisindeki i\u015fleri tamamlad\u0131ktan sonra, bir ba\u015fka domain context i\u00e7erisindeki i\u015flerin de <strong>ba\u011f\u0131ms\u0131z<\/strong> olarak tamamlanabilmesine olanak tan\u0131maktad\u0131r. Ba\u011f\u0131ms\u0131z olmak, birazdan de\u011finece\u011fimiz buradaki kilit noktam\u0131z.<\/p>\n<h2>Ne Olabilir?<\/h2>\n<p>Unutmamal\u0131y\u0131z ki problemlerimize \u00e7\u00f6z\u00fcm getiren her bir y\u00f6ntemin, beraberinde getirdi\u011fi baz\u0131 farkl\u0131 problemleri de olabiliyor. Ayn\u0131 durum event&#8217;leri design ederken alaca\u011f\u0131m\u0131z kararlarda da mevcut.<\/p>\n<p>K\u00fc\u00e7\u00fck ve decoupled olarak design etti\u011fimiz uygulamalar\u0131m\u0131za daha \u00e7ok \u00f6zellikler eklemeye ba\u015flad\u0131\u011f\u0131m\u0131zda veya domain s\u0131n\u0131rlar\u0131m\u0131z\u0131\/implementasyon y\u00f6ntemimizi do\u011fru se\u00e7emedi\u011fimizde, uygulamalar\u0131m\u0131z distributed olarak <strong>coupled\/ba\u011f\u0131ml\u0131<\/strong> bir hale gelmeye ba\u015fl\u0131yor. K\u0131sacas\u0131 <strong>distributed monolith<\/strong>&#8216;e do\u011fru giden bir yolculukta kendimizi bulabiliriz.<\/p>\n<figure id=\"attachment_3796\" aria-describedby=\"caption-attachment-3796\" style=\"width: 2041px\" class=\"wp-caption aligncenter\"><a href=\"\/wp-content\/uploads\/2021\/05\/distributed-monolith.jpg\"><img decoding=\"async\" class=\"wp-image-3796 size-full lazyload\" data-src=\"\/wp-content\/uploads\/2021\/05\/distributed-monolith.jpg\" alt=\"\" width=\"2041\" height=\"1201\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/05\/distributed-monolith.jpg 2041w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/05\/distributed-monolith-300x177.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/05\/distributed-monolith-1024x603.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/05\/distributed-monolith-768x452.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/05\/distributed-monolith-1536x904.jpg 1536w\" data-sizes=\"(max-width: 2041px) 100vw, 2041px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2041px; --smush-placeholder-aspect-ratio: 2041\/1201;\" \/><\/a><figcaption id=\"caption-attachment-3796\" class=\"wp-caption-text\">https:\/\/sebiwi.github.io\/assets\/images\/comics\/2018-09-10-distributed-monolith.jpg<\/figcaption><\/figure>\n<h2>\u0130simlendirme<\/h2>\n<p>G\u00fcnl\u00fck hayat\u0131m\u0131zda bir konunun daha anla\u015f\u0131labilir olabilmesi i\u00e7in nas\u0131l olabildi\u011fince spesifik olmaya \u00e7al\u0131\u015f\u0131yorsak, event&#8217;leri isimlendirirken de olabildi\u011fince spesifik olmaya \u00e7al\u0131\u015fmal\u0131y\u0131z. Generic event isimlendirmelerinden ka\u00e7\u0131nmak, di\u011fer tak\u0131mlar taraf\u0131ndan kullan\u0131lacak olan event&#8217;lerin daha anla\u015f\u0131labilir olmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<p>\u00d6rne\u011fin a\u015fa\u011f\u0131daki gibi bir event&#8217;e sahip oldu\u011fumuzu d\u00fc\u015f\u00fcnelim.<\/p>\n<pre>public class ProductUpdatedEvent\r\n{\r\n    public Guid ProductId { get; set; }\r\n    public Guid ModifiedByUserId { get; set; }\r\n    public DateTime ModifiedOn { get; set; }\r\n}\r\n<\/pre>\n<p>Anl\u0131yoruz ki \u00fcr\u00fcn \u00fczerinde bir g\u00fcncelleme i\u015flemi ger\u00e7ekle\u015ftirildi. Peki bu i\u015flem nas\u0131l bir i\u015flemdi? Yeni bir resim mi eklendi yoksa \u00fcr\u00fcn a\u00e7\u0131klamas\u0131 m\u0131 de\u011fi\u015ftirildi?<\/p>\n<p>Belki burada ger\u00e7ekle\u015ftirilen spesifik bir aksiyon, bir ba\u015fka domain i\u00e7erisinde bulunan farkl\u0131 bir aksiyonun da ger\u00e7ekle\u015ftirilebilmesini sa\u011flayacakt\u0131r.<\/p>\n<p>K\u0131sacas\u0131 kar\u0131\u015f\u0131kl\u0131klara yer vermemek i\u00e7in olabildi\u011fince event&#8217;leri isimlendirirken spesifik olmam\u0131z veya tak\u0131mlar aras\u0131 baz\u0131 kavramlar \u00fczerinde anla\u015fm\u0131\u015f olmam\u0131z gerekmektedir.<\/p>\n<h2>Event&#8217;im Nas\u0131l Olmal\u0131?<\/h2>\n<p>Bu sorunun maalesef tek bir cevab\u0131, y\u00f6ntemi bulunmamaktad\u0131r. Tamamen i\u00e7erisinde \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131z <strong>domain&#8217;e<\/strong>, <strong>boundery&#8217;lerine<\/strong> ve ihtiya\u00e7lar\u0131n\u0131za g\u00f6re de\u011fi\u015fiklik g\u00f6stermektedir. Event i\u00e7eri\u011fini, boundery&#8217;lerini design etmek \u00e7o\u011fu zaman kafa kar\u0131\u015ft\u0131r\u0131c\u0131 olabildi\u011fi gibi overengineer edilebilmeye de olduk\u00e7a a\u00e7\u0131k konular.<\/p>\n<p>Event i\u00e7eri\u011fini design ederken &#8220;<em>Fat Events<\/em>&#8220;, &#8220;<em>Thin Events<\/em>&#8220;, &#8220;<em>Delta Events<\/em>&#8220;, &#8220;<em>Notification Events<\/em>&#8220;, &#8220;<em>Event-carried State Transfer<\/em>&#8221; gibi birbirlerine benzeyen kavramlarla kar\u015f\u0131la\u015fabilirsiniz. Ben \u00e7ok fazla kafa kar\u0131\u015f\u0131kl\u0131l\u0131\u011f\u0131na yer vermeden, event i\u00e7eri\u011fini design ederken faydalanabilece\u011fimiz iki basit y\u00f6ntemden bahsetmek istiyorum.<\/p>\n<h3>Thin Events<\/h3>\n<p>Bu yakla\u015f\u0131m ad\u0131ndan da anla\u015f\u0131labilece\u011fi \u00fczere i\u00e7erisinde id&#8217;ler d\u0131\u015f\u0131nda \u00e7ok fazla bilgi bar\u0131nd\u0131rmamaktad\u0131r. Mevcut domain i\u00e7erisinde ger\u00e7ekle\u015fmi\u015f olan bir aksiyondan, di\u011fer d\u0131\u015f sistemlerin de haberdar olabilmesini sa\u011flamaktad\u0131r.<\/p>\n<p>\u00d6rnek olarak daha \u00f6nceki <em><a href=\"https:\/\/gokhan-gokalp.com\/en\/implementation-of-choreography-based-saga-in-dotnet-microservices\/\" target=\"_blank\" rel=\"noopener\">makalemde<\/a><\/em> ele ald\u0131\u011f\u0131m e-ticaret senaryosunu ele alal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2021\/01\/saga-happy-path.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3714 lazyload\" data-src=\"\/wp-content\/uploads\/2021\/01\/saga-happy-path.jpg\" alt=\"\" width=\"822\" height=\"322\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/01\/saga-happy-path.jpg 822w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/01\/saga-happy-path-300x118.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/01\/saga-happy-path-768x301.jpg 768w\" data-sizes=\"(max-width: 822px) 100vw, 822px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 822px; --smush-placeholder-aspect-ratio: 822\/322;\" \/><\/a><\/p>\n<pre>public class OrderCreatedEvent\r\n{\r\n    public Guid OrderId { get; set; }\r\n    public Guid UserId { get; set; }\r\n    public Guid WalletId { get; set; }\r\n    public DateTime CreatedOn { get; set; }\r\n}\r\n<\/pre>\n<p>Order domain&#8217;i i\u00e7erisinde bir sipari\u015f olu\u015ftu\u011funda, &#8220;<em>OrderCreated<\/em>&#8221; ad\u0131nda bir event publish etti\u011fimizi d\u00fc\u015f\u00fcnelim.<\/p>\n<p>Order workflow&#8217;unun tamamlanabilmesi i\u00e7in bu de\u011fi\u015fim ile ilgilenen &#8220;<em>Stock<\/em>&#8220;, &#8220;<em>Payment<\/em>&#8221; gibi di\u011fer service&#8217;ler, bu event&#8217;i dinlemeli ve gerekli i\u015flemlerini tamamlamalar\u0131 gerekmektedir. Di\u011fer service&#8217;ler i\u015flemlerini tamamlayabilmeleri i\u00e7in yeterli data&#8217;ya sahip de\u011fillerse, bu \u00f6rnekte de\u011filler, event i\u00e7erisinde bulunan id&#8217;leri kullanarak ilgili domain&#8217;lerin resource <em>API<\/em>&#8216;lar\u0131ndan gerekli data&#8217;lar\u0131 elde etmeleri gerekmektedir.<\/p>\n<p>\u00d6rne\u011fin &#8220;<em>Payment<\/em>&#8221; service&#8217;i i\u00e7in \u00f6demenin ge\u00e7ekle\u015fece\u011fi c\u00fczdan\u0131n bilgileri veya &#8220;<em>Stock<\/em>&#8221; service&#8217;i i\u00e7in allocate edilecek olan \u00fcr\u00fcnlerin id&#8217;lerini d\u00fc\u015f\u00fcnebiliriz. Farkl\u0131 bir \u00f6rnek vermek gerekirse e\u011fer <strong>CQRS<\/strong> yakla\u015f\u0131m\u0131n\u0131 uyguluyor olabilir ve read-modellerini bu y\u00f6ntem ile sync tutuyor olabilir veya farkl\u0131 domain&#8217;ler kendi projection data&#8217;lar\u0131n\u0131 olu\u015fturuyor da olabilir.<\/p>\n<p>Uygulamas\u0131 ve ba\u015flamas\u0131 en basit y\u00f6ntemlerden birisidir. \u00d6zellikle publish etti\u011fimiz event&#8217;i dinleyen subscriber&#8217;lar\u0131n ilgili de\u011fi\u015fimden etkilenen data&#8217;n\u0131n <strong>en son g\u00fcncel hali<\/strong> ile \u00e7al\u0131\u015fmalar\u0131 kritik ise, thin events bu noktada olduk\u00e7a yararl\u0131 olacakt\u0131r.<\/p>\n<p>Bu yakla\u015f\u0131m\u0131n dezavantaj\u0131 ise, event-based sistemler ile b\u00f6lmeye ve azaltmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z <strong>coupling&#8217;i<\/strong>, sistemler aras\u0131nda farkettirmeden duruma g\u00f6re geri getirmektedir. \u00c7\u00fcnk\u00fc ilgili de\u011fi\u015fim ile ilgilenen subscriber, \u00e7al\u0131\u015fabilmesi i\u00e7in yeterli data&#8217;ya sahip de\u011filse ilgili data&#8217;y\u0131 elde edebilmek i\u00e7in ilgili domain&#8217;in resource <em>API<\/em>&#8216;lar\u0131na eri\u015fmesi gerekmektedir.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2021\/07\/order-created.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3814 lazyload\" data-src=\"\/wp-content\/uploads\/2021\/07\/order-created.jpg\" alt=\"\" width=\"601\" height=\"361\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/07\/order-created.jpg 601w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/07\/order-created-300x180.jpg 300w\" data-sizes=\"(max-width: 601px) 100vw, 601px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 601px; --smush-placeholder-aspect-ratio: 601\/361;\" \/><\/a><\/p>\n<p>E\u011fer ilgili resource&#8217;un <em>API<\/em>&#8216;\u0131 o anda \u00e7al\u0131\u015fm\u0131yor ise, de\u011fi\u015fim ile ilgilenen subscriber da i\u015flemini yerine getiremeyecektir. Ayr\u0131ca de\u011fi\u015fim ile ilgilenen ne kadar \u00e7ok subscriber varsa, bu subscriber&#8217;lar da ilgili resource&#8217;un <em>API<\/em>&#8216;\u0131na internal bir ek y\u00fck getirecektir.<\/p>\n<p>Sistem i\u00e7erisinde olu\u015fabilecek olan bu internal y\u00fck&#8217;\u00fc ve coupling&#8217;i minimum&#8217;a indirebilmek i\u00e7in ise her service, kendi projection data&#8217;lar\u0131na sahip olabilirler. B\u00f6ylelikle sistem i\u00e7erisindeki de\u011fi\u015fim ile ilgilenen subscriber&#8217;lar, herhangi bir ihtiya\u00e7 kar\u015f\u0131s\u0131nda ilgili resource&#8217;un <em>API<\/em>&#8216;\u0131n\u0131 sorgulamalar\u0131 gerekmeyecek ve publisher taraf\u0131nda olu\u015fabilecek failure durumlar\u0131ndan da etkilenmeyeceklerdir. Bulkhead isolation&#8217;a sahip olmak olarak da d\u00fc\u015f\u00fcnebiliriz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2021\/07\/order-created-with-p.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-3813 lazyload\" data-src=\"\/wp-content\/uploads\/2021\/07\/order-created-with-p.jpg\" alt=\"\" width=\"788\" height=\"374\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/07\/order-created-with-p.jpg 788w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/07\/order-created-with-p-300x142.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/07\/order-created-with-p-768x365.jpg 768w\" data-sizes=\"(max-width: 788px) 100vw, 788px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 788px; --smush-placeholder-aspect-ratio: 788\/374;\" \/><\/a><\/p>\n<p>Ne yaz\u0131k ki kula\u011fa her ne kadar g\u00fczel bir \u00e7\u00f6z\u00fcm gibi gelsede, bu \u00e7\u00f6z\u00fcm\u00fcn de sisteme getirece\u011fi <strong>technical<\/strong> <strong>complexity<\/strong> ve <strong>eventual\/data consistency <\/strong>de kabul edilmelidir. \u00c7\u00fcnk\u00fc ilgili service&#8217;lerin projection data&#8217;lar\u0131n\u0131 olu\u015fturabilmek ve consistent tutabilmek i\u00e7in, ilgili domain&#8217;lerde meydana gelen ilgili event&#8217;leri dikkatlice handle etmeleri gerekmektedir.<\/p>\n<h3>Fat Events<\/h3>\n<p>Bu yakla\u015f\u0131mda ise thin events&#8217;in aksine ilgili event sadece id&#8217;ler bar\u0131nd\u0131rmak yerine, di\u011fer subscriber&#8217;lar\u0131n da \u00e7al\u0131\u015fabilmesi i\u00e7in gerekli olan data&#8217;lar\u0131 da bar\u0131nd\u0131r\u0131r.<\/p>\n<p>\u00d6rne\u011fin &#8220;<em>OrderCreated<\/em>&#8221; event&#8217;inin a\u015fa\u011f\u0131daki gibi oldu\u011funu varsayal\u0131m.<\/p>\n<pre>public class OrderCreatedEvent\r\n{\r\n    public Guid OrderId { get; set; }\r\n    public List OderItems { get; set; }\r\n    public UserDTO User { get; set; }\r\n    public WalletDTO Wallet { get; set; }\r\n    public DateTime CreatedOn { get; set; }\r\n}\r\n\r\npublic class OrderItemDTO\r\n{\r\n    public Guid OrderItemId { get; set; }\r\n    public Guid ProductId { get; set; }\r\n    public string ProductName { get; set; }\r\n    public string SKU { get; set; }\r\n    public string Quantity { get; set; }\r\n    public decimal Price { get; set; }\r\n}\r\n\r\npublic class UserDTO\r\n{\r\n    public Guid UserId { get; set; }\r\n    public string Name { get; set; }\r\n    public string Surname { get; set; }\r\n    public string EmailAddress { get; set; }\r\n    public ShippingAddressDTO PreferredShippingAddress { get; set; }\r\n}\r\n\r\npublic class ShippingAddressDTO\r\n{\r\n    public string Address { get; set; }\r\n}\r\n\r\npublic class WalletDTO\r\n{\r\n    public Guid MasterpassWalletId { get; set; }\r\n    public Guid MasterpassCardId { get; set; }\r\n}\r\n<\/pre>\n<p>Bu senaryoda &#8220;<em>OrderCreated<\/em>&#8221; event&#8217;i i\u00e7erisinde di\u011fer subscriber&#8217;lar\u0131n da \u00e7al\u0131\u015fabilmesi i\u00e7in gerekli olan t\u00fcm data&#8217;lar bulunmaktad\u0131r. B\u00f6ylelikle di\u011fer subscriber&#8217;lar\u0131n gerekli data&#8217;lar\u0131 elde edebilmeleri i\u00e7in ilgili domain&#8217;lerin resource <em>API<\/em>&#8216;lar\u0131na eri\u015fmeleri veya projection data&#8217;lar\u0131na sahip olmalar\u0131 gerekmemektedir. K\u0131sacas\u0131 thin events&#8217;in aksine fat events, sistemler aras\u0131nda bir coupling yaratmak yerine daha iyi bir <strong>decoupling, availability<\/strong> sa\u011flamakta ve <strong>network latency<\/strong>&#8216;sini azaltmaktad\u0131r.<\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi fat events kullan\u0131m senaryolar\u0131na g\u00f6re olduk\u00e7a faydal\u0131 bir yakla\u015f\u0131md\u0131r. Fakat tahmin edebilece\u011fimiz gibi bu yakla\u015f\u0131m da kusursuz bir \u015fekilde gelmemektedir. \u00d6rne\u011fin bu event ile ilgilenen subscriber&#8217;lar\u0131n ilgili data&#8217;n\u0131n en son g\u00fcncel hali ile \u00e7al\u0131\u015fmalar\u0131 kritik ise, bu y\u00f6ntem \u00e7ok da ho\u015f olmayabilir. \u00c7\u00fcnk\u00fc event i\u00e7erisindeki herhangi bir data, herhangi bir zamanda <strong>outdated<\/strong> olmu\u015f olabilir.<\/p>\n<p>Ayr\u0131ca fat events&#8217;in publisher&#8217;a getirdi\u011fi <strong>contract dependency&#8217;sini<\/strong>\u00a0de g\u00f6rmezden gelemeyiz. Bu dependency ile event i\u00e7erisinden herhangi bir data&#8217;y\u0131 istenilen bir zamanda, \u00f6rne\u011fin &#8220;<em>Wallet<\/em>&#8221; objesini, emin olmadan kolay bir \u015fekilde silemeyiz.<\/p>\n<p>Ne kadar zor ve complex kararlar de\u011fil mi? Bir sorunu \u00e7\u00f6zebilmek i\u00e7in uygulad\u0131\u011f\u0131m\u0131z y\u00f6ntemin de sisteme getirdi\u011fi bir ba\u015fka sorunu g\u00f6r\u00fcp, ona da \u00e7\u00f6z\u00fcm sa\u011flamam\u0131z gerekmektedir.<\/p>\n<h3>\u00d6zetleyelim<\/h3>\n<p>Event-based sistemlerin bizlere sa\u011flad\u0131\u011f\u0131 modularity yetkinli\u011fi ile i\u00e7erisinde bulundu\u011fumuz business&#8217;\u0131n complexity&#8217;sini ve coupling&#8217;ini minimize edip, b\u00f6lebilmemize olanak sa\u011flamaktad\u0131r.<\/p>\n<p>Bu makale kapsam\u0131nda ise event-based yakla\u015f\u0131m\u0131n\u0131 i\u00e7erisinde bulundu\u011fumuz domain&#8217;e uygularken, event&#8217;lerimizi en basit halleriyle nas\u0131l design edebilece\u011fimizi tradeoff&#8217;lar\u0131 ile g\u00f6stermeye \u00e7al\u0131\u015ft\u0131m.<\/p>\n<p>Thin events mi yoksa fat events mi sorusuna yan\u0131t verebilmek a\u00e7\u0131k\u00e7as\u0131 olduk\u00e7a zor. Tamamen i\u00e7erisinde bulundu\u011fumuz domain context&#8217;ine, boundery&#8217;sine ve ihtiya\u00e7&#8217;a g\u00f6re de\u011fi\u015fiklilik g\u00f6stermektedir. Thin events g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi sisteme bir dezavantaj olarak runtime coupling&#8217;i getirirken, avantaj olarak ise subscriber&#8217;lar\u0131n ihtiya\u00e7 duyduklar\u0131 data&#8217;n\u0131n en g\u00fcncel hali ile \u00e7al\u0131\u015fmalar\u0131 kritik ise bu sorunu adreslemektedir. Ayr\u0131ca ba\u015flamas\u0131 ve uygulamas\u0131 olduk\u00e7a kolay olup, publisher&#8217;a herhangi bir contract dependency&#8217;si de eklememektedir.<\/p>\n<p>Fat events ise daha iyi bir decoupling ve availability sa\u011flamaktad\u0131r. Fakat fat events&#8217;in de publisher&#8217;a getirdi\u011fi dependency ve complexity gibi problemleri de kabul ediyor olmal\u0131y\u0131z.<\/p>\n<p>Peki ya siz hangi y\u00f6ntemi tercih ediyorsunuz?<\/p>\n<h3>Referanslar<\/h3>\n<p><a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/architecture\/guide\/architecture-styles\/event-driven?WT.mc_id=DT-MVP-5003382\">https:\/\/docs.microsoft.com\/en-us\/azure\/architecture\/guide\/architecture-styles\/event-driven?WT.mc_id=DT-MVP-5003382<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bildi\u011fimiz gibi yaz\u0131l\u0131m geli\u015ftirme, \u00f6zellikle g\u00fcn\u00fcm\u00fcz ihtiya\u00e7lar\u0131 kar\u015f\u0131s\u0131nda kolay kolay bitmiyor. Yaz\u0131l\u0131m\u0131 geli\u015ftirmenin yan\u0131 s\u0131ra, onun s\u00fcrekli ayakta ve tutarl\u0131 bir \u015fekilde \u00e7al\u0131\u015fabilmesini sa\u011flayabilmekte en b\u00fcy\u00fck sorun ve sorumluluklar\u0131m\u0131zdan bir tanesi. Tahmin edebilece\u011fimiz gibi bu gibi ihtiya\u00e7larda zamanla bizleri microservice mimarilerine, event-based sistemlere, distributed ortamlara&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">Event&#8217;im Nas\u0131l Olmal\u0131? Event-Based Sistemler Hakk\u0131nda Baz\u0131 D\u00fc\u015f\u00fcnceler<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":3833,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,505,68,457,285,368],"tags":[69,609,605,610,608,525,611,606,259,266,612,607],"class_list":["post-3789","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-net-core","category-architectural","category-dotnet","category-messaging","category-microservices","tag-cqrs","tag-distributed-monolith","tag-distributed-system","tag-domain-boundry","tag-event-driven-architecture","tag-event-based","tag-event-carried-state-transfer","tag-fat-events","tag-microservice","tag-microservice-architecture","tag-projection-data","tag-thin-events","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":true,"content":true,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Event&#039;im Nas\u0131l Olmal\u0131? Event-Based Sistemler Hakk\u0131nda Baz\u0131 D\u00fc\u015f\u00fcnceler - G\u00f6khan G\u00f6kalp<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Event&#039;im Nas\u0131l Olmal\u0131? Event-Based Sistemler Hakk\u0131nda Baz\u0131 D\u00fc\u015f\u00fcnceler - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2021-07-17T20:02:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-07-17T20:03:40+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/07\/how-should-my-events-be.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"Event&#8217;im Nas\u0131l Olmal\u0131? Event-Based Sistemler Hakk\u0131nda Baz\u0131 D\u00fc\u015f\u00fcnceler\",\"datePublished\":\"2021-07-17T20:02:20+00:00\",\"dateModified\":\"2021-07-17T20:03:40+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\\\/\"},\"wordCount\":3368,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2021\\\/07\\\/how-should-my-events-be.jpg\",\"keywords\":[\"CQRS\",\"distributed monolith\",\"distributed system\",\"domain boundry\",\"event driven architecture\",\"event-based\",\"Event-carried State Transfer\",\"fat events\",\"MicroService\",\"MicroService Architecture\",\"projection data\",\"thin events\"],\"articleSection\":[\".NET\",\".NET Core\",\"Architectural\",\"dotnet\",\"Messaging\",\"Microservices\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\\\/\",\"name\":\"Event'im Nas\u0131l Olmal\u0131? Event-Based Sistemler Hakk\u0131nda Baz\u0131 D\u00fc\u015f\u00fcnceler - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2021\\\/07\\\/how-should-my-events-be.jpg\",\"datePublished\":\"2021-07-17T20:02:20+00:00\",\"dateModified\":\"2021-07-17T20:03:40+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2021\\\/07\\\/how-should-my-events-be.jpg\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2021\\\/07\\\/how-should-my-events-be.jpg\",\"width\":1200,\"height\":675},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How Should My Event Be Designed? Some Thoughts on Event-Based Systems\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Event'im Nas\u0131l Olmal\u0131? Event-Based Sistemler Hakk\u0131nda Baz\u0131 D\u00fc\u015f\u00fcnceler - G\u00f6khan G\u00f6kalp","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/","og_locale":"tr_TR","og_type":"article","og_title":"Event'im Nas\u0131l Olmal\u0131? Event-Based Sistemler Hakk\u0131nda Baz\u0131 D\u00fc\u015f\u00fcnceler - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2021-07-17T20:02:20+00:00","article_modified_time":"2021-07-17T20:03:40+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/07\/how-should-my-events-be.jpg","type":"image\/jpeg"}],"author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"Event&#8217;im Nas\u0131l Olmal\u0131? Event-Based Sistemler Hakk\u0131nda Baz\u0131 D\u00fc\u015f\u00fcnceler","datePublished":"2021-07-17T20:02:20+00:00","dateModified":"2021-07-17T20:03:40+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/"},"wordCount":3368,"commentCount":0,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/07\/how-should-my-events-be.jpg","keywords":["CQRS","distributed monolith","distributed system","domain boundry","event driven architecture","event-based","Event-carried State Transfer","fat events","MicroService","MicroService Architecture","projection data","thin events"],"articleSection":[".NET",".NET Core","Architectural","dotnet","Messaging","Microservices"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/","url":"https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/","name":"Event'im Nas\u0131l Olmal\u0131? Event-Based Sistemler Hakk\u0131nda Baz\u0131 D\u00fc\u015f\u00fcnceler - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/#primaryimage"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/07\/how-should-my-events-be.jpg","datePublished":"2021-07-17T20:02:20+00:00","dateModified":"2021-07-17T20:03:40+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/#primaryimage","url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/07\/how-should-my-events-be.jpg","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2021\/07\/how-should-my-events-be.jpg","width":1200,"height":675},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/how-should-my-event-be-designed-some-thoughts-on-event-based-systems\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"How Should My Event Be Designed? Some Thoughts on Event-Based Systems"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/3789","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=3789"}],"version-history":[{"count":5,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/3789\/revisions"}],"predecessor-version":[{"id":3835,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/3789\/revisions\/3835"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media\/3833"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=3789"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=3789"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=3789"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}