{"id":156,"date":"2022-11-27T17:07:00","date_gmt":"2022-11-27T17:07:00","guid":{"rendered":"http:\/\/blog.firatyasar.com\/?p=156"},"modified":"2023-03-19T17:09:51","modified_gmt":"2023-03-19T17:09:51","slug":"software-design-patterns-part-ii","status":"publish","type":"post","link":"https:\/\/blog.firatyasar.com\/?p=156","title":{"rendered":"Software Design Patterns &#8211; Part II"},"content":{"rendered":"\n<h1 id=\"cabd\">Event-Driven Architecture<\/h1>\n\n\n\n<p id=\"e2a1\">Bu mimari, asenkron \u00e7al\u0131\u015fan ve y\u00fcksek \u00f6l\u00e7eklendirilebilir uygulamalarda kullan\u0131lan bir yap\u0131d\u0131r. Y\u00fcksek bir adaptasyon yetene\u011fine sahiptir ve k\u00fc\u00e7\u00fckten b\u00fcy\u00fc\u011fe ve kar\u0131\u015f\u0131k yap\u0131l\u0131 uygulamalar i\u00e7in kullan\u0131lmaktad\u0131r.<br>\u0130ki ana topolojiden olu\u015fur: Mediator ve Broker.<\/p>\n\n\n\n<p id=\"94c0\"><strong>Mediator Topolojisi<\/strong><\/p>\n\n\n\n<ul><li>Birden fazla ad\u0131ma sahip olan olaylar (events) i\u00e7in kullan\u0131l\u0131r ve bu olay\u0131n i\u015flenmesi i\u00e7in belirli bir seviyede y\u00f6netime ihtiya\u00e7 duyar.<\/li><li>4 ana bile\u015fene sahiptir: event queue (olay kuyru\u011fu), event mediator, event channels ve event processors.<\/li><li>Olay ak\u0131\u015f\u0131, client (istemci)\u2019\u0131n olay kuyru\u011funa bir olay g\u00f6ndermesi ile ba\u015flar ve bu kuyruk, olay\u0131&nbsp;<em>event mediator\u2019<\/em>a ta\u015f\u0131r. Sonras\u0131nda&nbsp;<em>event mediator<\/em>&nbsp;ilk olay\u0131 al\u0131r ve&nbsp;<em>event channel<\/em>&nbsp;(olay kanal\u0131)\u2019a ilave asenkron olaylar g\u00f6ndererek s\u00fcrecin her ad\u0131m\u0131n\u0131n \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131n\u0131 y\u00f6netir.&nbsp;<em>Event processors<\/em>&nbsp;(Olay i\u015fleyiciler), olay kanallar\u0131n\u0131 dinler,&nbsp;<em>event mediator<\/em>\u2019dan olaylar\u0131 al\u0131r ve olay\u0131 i\u015flemek i\u00e7in spesifik i\u015f mant\u0131\u011f\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r.<\/li><li>Olaya dayal\u0131 mimarinin, bir d\u00fczineden ba\u015flay\u0131p y\u00fczlerce olay kuyru\u011funa sahip olmas\u0131 yayg\u0131n bir durumdur. A\u015fa\u011f\u0131daki desen, olay kuyru\u011fu bile\u015fenlerinin uygulanmas\u0131n\u0131 belirlemez. Bu bir mesaj kuyru\u011fu da olabilir veya web servis u\u00e7 noktas\u0131 da olabilir.<\/li><li><em>Event mediator<\/em>, ilk olay\u0131n yer ald\u0131\u011f\u0131 ad\u0131mlar\u0131n y\u00f6netilmesinden sorumludur.<\/li><li><em>Event mediator<\/em>, asl\u0131nda ilk olay\u0131 i\u015flemek i\u00e7in ihtiya\u00e7 duyulan i\u015f mant\u0131\u011f\u0131n\u0131 uygulamaz. Aksine sadece ilk olay\u0131 i\u015flemek i\u00e7in gerekli ad\u0131mlar\u0131 bilir.<\/li><li>Olay kanallar\u0131 hem mesaj kuyru\u011fu (event queue) hem mesaj ba\u015fl\u0131klar\u0131 (event topics) olabilir. Mesaj ba\u015fl\u0131klar\u0131 mediator topolojisinde yayg\u0131n bir \u015fekilde kullan\u0131l\u0131r. Bu sayede olaylar\u0131n i\u015flenmesi birden fazla olay i\u015fleyicisi taraf\u0131ndan ger\u00e7ekle\u015ftirilebilir.<\/li><li>Olay i\u015fleyiciler, bir uygulamada veya bir sistemde belirli bir g\u00f6revi yerine getiren ba\u011f\u0131ms\u0131z ve kendi kendine yeten yap\u0131lard\u0131r.<\/li><li>Unutulmamas\u0131 gereken bir nokta da her olay i\u015fleyici sadece bir i\u015fi yapmal\u0131d\u0131r ve bu i\u015fi tamamlarken de di\u011fer olay i\u015fleyicilere bel ba\u011flamamal\u0131d\u0131r.<\/li><li>En basit ve en yayg\u0131n kullan\u0131lan \u00f6rnekler&nbsp;<strong>Spring Integration, Apache Camel&nbsp;<\/strong>veya&nbsp;<strong>Mule ESB<\/strong>&nbsp;gibi a\u00e7\u0131k kaynak yap\u0131lard\u0131r.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*9FWhMk7odmIUQo-k-2jPUA.png\" alt=\"\"\/><\/figure>\n\n\n\n<p id=\"2ac2\"><strong>Broker Topolojisi<\/strong><\/p>\n\n\n\n<ul><li>Broker topolojisinde, mediator topoljisinin aksine ortada herhangi bir&nbsp;<em>event mediator<\/em>&nbsp;bulunmaz. Mesaj ak\u0131\u015f\u0131 t\u00fcm olay i\u015fleyiciler aras\u0131nda bir zincir yap\u0131s\u0131nda da\u011f\u0131t\u0131l\u0131r. Bu topoloji, basit bir olay i\u015fleme ak\u0131\u015f\u0131 (simple event processing flow) istedi\u011fimizde ve merkezi bir olay y\u00f6netiminin istenmedi\u011fi zamanlarda kullan\u0131l\u0131r.<\/li><li>\u0130ki ana bile\u015fenden olu\u015fur: broker (arac\u0131) ve event processor (olay i\u015fleyici).<\/li><li>Her olay i\u015fleyici, bir olay\u0131n i\u015flenmesinden sorumludur ve yeni ger\u00e7ekle\u015ftirilen bir aksiyonu belirten bir olay\u0131 yay\u0131nlar. Baz\u0131 zamanlarda bir olay, bir olay i\u015fleyici taraf\u0131ndan yay\u0131nlansa dahi ba\u015fka bir olay i\u015fleyici taraf\u0131ndan al\u0131nmayabilir. Bu durum, bir uygulama geli\u015ftirildi\u011finde veya ileriye y\u00f6nelik fonksiyonellik, bir uzant\u0131 sa\u011flan\u0131laca\u011f\u0131nda yayg\u0131n olarak kullan\u0131l\u0131r.<\/li><li>En basit anlat\u0131m\u0131yla broker topolojisi, bir i\u015f fonksiyonunu ger\u00e7ekle\u015ftiren olaylar zinciridir.<\/li><li>Bu topolji bayrak yar\u0131\u015f\u0131na benzer. Bayrak yar\u0131\u015f\u0131nda ko\u015fucu bir sopa ta\u015f\u0131r ve belirli bir mesafe ko\u015ftuktan sonra bunu di\u011fer ko\u015fuyuca verir. Ve bu yar\u0131\u015f bitene kadar bu \u015fekilde devam eder. Bir ko\u015fucu sopay\u0131 di\u011fer ko\u015fuyuca verdikten sonra yar\u0131\u015f\u0131 biter. Bu broker topolojisinde de ayn\u0131d\u0131r. Bir olay i\u015fleyici, bir olay\u0131 i\u015fleyip verdikten sonra bu olaya bir daha dahil olmaz.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img src=\"https:\/\/miro.medium.com\/v2\/resize:fit:1400\/1*SFbZ2lUnVP71RQM7KJ_bgg.png\" alt=\"\"\/><\/figure>\n\n\n\n<p id=\"bd41\">Olaya dayal\u0131 mimarinin uygulanmas\u0131 g\u00f6rece karma\u015f\u0131kt\u0131r. Bunun ana nedeni ise asenkron da\u011f\u0131t\u0131lm\u0131\u015f yap\u0131d\u0131r. Bu yap\u0131 uyguland\u0131\u011f\u0131nda, bir\u00e7ok mimari problemle kar\u015f\u0131la\u015f\u0131l\u0131r. Uzaktan i\u015fleme kullan\u0131labilirli\u011fi, cevaplanabilirlik eksiklikleri ve broker\/mediator hatalar\u0131nda broker\u2019\u0131n olaya yeniden ba\u011flanmas\u0131 mant\u0131\u011f\u0131nda problemlerle kar\u015f\u0131la\u015fl\u0131r. Bu mimarinin en zorlay\u0131c\u0131 y\u00f6nleririnden baz\u0131lar\u0131; bu mimarinin olu\u015fturulmas\u0131, bak\u0131m\u0131 ve olay i\u015fleyici bile\u015fenlerinin kontraktlar\u0131n\u0131n y\u00f6netilmesidir.<\/p>\n\n\n\n<p id=\"81c6\"><em>De\u011ferlendirme k\u0131sm\u0131 okudu\u011fum kitapta 6 ana ba\u015fl\u0131k alt\u0131nda toplan\u0131yor. Bu \u015fekildeki anlat\u0131m ho\u015fuma gitti\u011fi i\u00e7in ben de ayn\u0131 yap\u0131da de\u011ferlendirme k\u0131sm\u0131n\u0131 olu\u015fturdum.<\/em><\/p>\n\n\n\n<p id=\"6aab\">Olaya Ba\u011fl\u0131 Mimarinin De\u011ferlendirilmesi;<\/p>\n\n\n\n<ul><li><strong>\u00c7eviklik<\/strong>: Y\u00fcksek<br>&#8211; Olay i\u015fleyiciler tek ama\u00e7l\u0131 ve tamamen di\u011fer olay i\u015fleyicilerden ba\u011f\u0131ms\u0131z oldu\u011fu i\u00e7in, de\u011fi\u015fiklikler izole bir \u015fekilde ve di\u011fer bile\u015fenleri etkilemeden yap\u0131labilir.<\/li><li><strong>Da\u011f\u0131t\u0131m Kolayl\u0131\u011f\u0131:<\/strong>&nbsp;Y\u00fcksek<br>&#8211; Broker topolojisinin da\u011f\u0131t\u0131m\u0131, mediator topolojisine g\u00f6re daha kolayd\u0131r. Event mediator bile\u015fenleri birbirlerine s\u0131k\u0131 bir \u015fekilde ba\u011fl\u0131d\u0131r. Bir olay i\u015fleyicide de\u011fi\u015fiklik yap\u0131lmak istendi\u011finde event mediator\u2019da da de\u011fi\u015fiklik yap\u0131lmas\u0131 gerekir. Bu da iki bile\u015fenin de deployment\u2019\u0131n\u0131n yap\u0131\u0131lmas\u0131 ile sonu\u00e7lan\u0131r.<\/li><li><strong>Testedilebilirlik<\/strong>: D\u00fc\u015f\u00fck<br>&#8211; Test etmek zor olmasa da olay \u00fcretecek test ara\u00e7lar\u0131na veya test \u00fczerine \u00f6zelle\u015fmi\u015f m\u00fc\u015fteriye ihtiya\u00e7 duyar. Asenkron yap\u0131n\u0131n do\u011fas\u0131 gere\u011fi de test yapmak zordur.<\/li><li><strong>Performans<\/strong>: Y\u00fcksek<br>&#8211; Asenkron kabiliyetlerinden dolay\u0131 y\u00fcksek bir performans\u0131 vard\u0131r.<\/li><li><strong>\u00d6l\u00e7eklenebilirlik<\/strong>: Y\u00fcksek<br>&#8211; Her olay i\u015fleyici birbirinden ayr\u0131 bir \u015fekilde \u00f6l\u00e7eklendirilebilir.<\/li><li><strong>Geli\u015ftirme kolayl\u0131\u011f\u0131<\/strong>: D\u00fc\u015f\u00fck<br>&#8211; Mimarinin asenkron do\u011fas\u0131ndan \u00f6t\u00fcr\u00fc geli\u015ftirme biraz karma\u015f\u0131k olabilmektedir. Kontraktlar\u0131n yarat\u0131lmas\u0131 ve bunun yan\u0131nda da ileri seviyede bir hata y\u00f6netimine de ihtiya\u00e7 duyar.<\/li><\/ul>\n\n\n\n<p id=\"55a3\">Yaz\u0131m\u0131n devam\u0131nda&nbsp;<a href=\"https:\/\/medium.com\/p\/1b244dd3dfea\">Mikro\u00e7ekirdek Mimari (Mikrokernel Architecture)<\/a>\u2019den bahsedece\u011fim.<\/p>\n\n\n\n<p id=\"5157\">Kaynak\u00e7a: Software Architecture Patterns \u2014 Mark Richards<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Event-Driven Architecture Bu mimari, asenkron \u00e7al\u0131\u015fan ve y\u00fcksek \u00f6l\u00e7eklendirilebilir uygulamalarda kullan\u0131lan bir yap\u0131d\u0131r. Y\u00fcksek bir adaptasyon yetene\u011fine sahiptir ve k\u00fc\u00e7\u00fckten b\u00fcy\u00fc\u011fe ve kar\u0131\u015f\u0131k yap\u0131l\u0131 uygulamalar i\u00e7in kullan\u0131lmaktad\u0131r.\u0130ki ana topolojiden olu\u015fur: Mediator ve Broker. Mediator Topolojisi Birden fazla ad\u0131ma sahip olan olaylar (events) i\u00e7in kullan\u0131l\u0131r ve bu olay\u0131n i\u015flenmesi i\u00e7in belirli bir seviyede y\u00f6netime ihtiya\u00e7 duyar.\u2026 <span class=\"read-more\"><a href=\"https:\/\/blog.firatyasar.com\/?p=156\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":148,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/posts\/156"}],"collection":[{"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=156"}],"version-history":[{"count":1,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/posts\/156\/revisions"}],"predecessor-version":[{"id":157,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/posts\/156\/revisions\/157"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=\/wp\/v2\/media\/148"}],"wp:attachment":[{"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=156"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=156"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.firatyasar.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=156"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}