{"id":957,"date":"2016-11-14T22:35:03","date_gmt":"2016-11-14T20:35:03","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=957"},"modified":"2016-11-14T22:59:19","modified_gmt":"2016-11-14T20:59:19","slug":"masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\/","title":{"rendered":"MassTransit kullanarak RabbitMQ ile Messaging Altyap\u0131s\u0131 Olu\u015fturma"},"content":{"rendered":"<p>Merhaba arkada\u015flar.<\/p>\n<p>Bir s\u00fcredir sizlere messaging\u00a0sistemleri \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131mdan daha \u00f6nceki makalelerimde bahsetmi\u015ftim. Messaging konusundaki di\u011fer makalelerim \u00fczerinden sizlerden gelen feedback&#8217;ler do\u011frultusunda <strong>MQ<\/strong>(Messaging Queue) yap\u0131s\u0131 ile beraber bir <strong>ESB<\/strong>(Enterprise Service Bus) kullanarak, b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar\u0131 nas\u0131l daha iyi <strong>scale<\/strong> edebiliriz\u00a0konusundaki bilgilerimi sizlere aktarmaya \u00e7al\u0131\u015faca\u011f\u0131m.<\/p>\n<p>Bu makale kapsam\u0131ndaki konu ba\u015fl\u0131klar\u0131m\u0131z ise s\u0131ras\u0131yla a\u015fa\u011f\u0131daki gibi olacakt\u0131r.<\/p>\n<ol>\n<li>Messaging Architecture<\/li>\n<li>\u00d6rnek Senaryo<\/li>\n<li>ESB Nedir ve MassTransit&#8217;e Giri\u015f<\/li>\n<li>RabbitMQ ile MassTransit Implementasyonu<\/li>\n<\/ol>\n<p>Messaging concept&#8217;leri hakk\u0131nda di\u011fer makalelerimde de sizlere olabildi\u011fince bahsetmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131m i\u00e7in dilerseniz bu bilgileri hat\u0131rlamak ad\u0131na, Messaging Architecture&#8217;a genel bir bak\u0131\u015f atal\u0131m.<\/p>\n<h4>1) Messaging Architecture<\/h4>\n<p><a href=\"\/wp-content\/uploads\/2016\/11\/message-queue.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-961 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/11\/message-queue.png\" alt=\"message-queue\" width=\"623\" height=\"242\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/message-queue.png 623w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/message-queue-300x117.png 300w\" data-sizes=\"(max-width: 623px) 100vw, 623px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 623px; --smush-placeholder-aspect-ratio: 623\/242;\" \/><\/a><\/p>\n<p>Messaging yap\u0131lar\u0131 ile uygulamalar\u0131 <strong>loosely coupled<\/strong> olarak, <strong>asenkron<\/strong> bir \u015fekilde birbirleri ile ileti\u015fime ge\u00e7irebildi\u011fimizden daha \u00f6nceki konularda bahsetmi\u015ftim. Daha \u00e7ok\u00a0enterprise\u00a0d\u00fczeyde geli\u015ftirilen ve ihtiya\u00e7lar do\u011frultusunda birbirlerinden ba\u011f\u0131ms\u0131z platformlarda yer alan\u00a0uygulamalar, <strong>distributed<\/strong> bir \u015fekilde g\u00fcn\u00fcm\u00fczde \u00e7al\u0131\u015ft\u0131r\u0131lmaktad\u0131r. Messaging yap\u0131lar\u0131n\u0131n\u00a0tercih edilmesinin key point&#8217;i olarak,\u00a0<strong>scalability<\/strong>\u00a0ve <strong>flexibility<\/strong> diyebilirim en az\u0131ndan kendi ad\u0131ma.<\/p>\n<p>Scalability taraf\u0131ndan bakt\u0131\u011f\u0131m\u0131zda olaya b\u00fcy\u00fck verilerle \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z ortamlarda, bu verileri process eden uygulamay\u0131 <strong>single instance<\/strong> ve <strong>ayn\u0131 ortamda\u00a0<\/strong>host etmek yerine farkl\u0131 ortamdaki service&#8217;lere da\u011f\u0131tarak, distributed bir \u015fekilde i\u015flemleri hem daha h\u0131zl\u0131 hem de\u00a0daha az y\u00fckle\u00a0scale edebilmek\u00a0m\u00fcmk\u00fcn oluyor. Monolith\u00a0architecture&#8217;lar gibi her \u015feyi tek bir instance&#8217;a y\u00fckleyerek yapmak, b\u00fcy\u00fck \u00f6l\u00e7ekli enterprise uygulamalar i\u00e7in \u00e7ok efektif olmayacakt\u0131r.<\/p>\n<p>Messaging architecture basic concept olarak gayet basittir.\u00a0Message&#8217;lar\u0131 queue ya g\u00f6nderen bir adet client vard\u0131r ve <strong>Producer<\/strong> olarak adland\u0131r\u0131l\u0131r. Birde queue&#8217;daki message&#8217;lar\u0131 dinleyip, process eden bir uygulama vard\u0131r, buda <strong>Consumer<\/strong> olarak adland\u0131r\u0131l\u0131r. Messaging architecture implementasyon k\u0131s\u0131mlar\u0131nda ise referans olarak al\u0131nabilecek\u00a0<em><strong><a href=\"https:\/\/en.wikipedia.org\/wiki\/Enterprise_Integration_Patterns\" target=\"_blank\">Enterprise\u00a0Integration Patterns<\/a><\/strong><\/em> olarak adland\u0131r\u0131lan, \u00e7e\u015fitli pattern ve messaging channel&#8217;lar mevcuttur.\u00a0Biz ise ger\u00e7ekle\u015ftirecek oldu\u011fumuz \u00f6rne\u011fimizdeki ihtiya\u00e7dan dolay\u0131, messaging channel olarak <strong>Publish-Subscribe<\/strong> pattern&#8217;\u0131n\u0131 implemente edece\u011fiz.<\/p>\n<h4>2)\u00a0\u00d6rnek Senaryo<\/h4>\n<p>Messaging architecture ile ilgili concept&#8217;i genel olarak tazelememizin ard\u0131ndan, makale konusunda ger\u00e7ekle\u015ftirecek oldu\u011fumuz \u00f6rnek senaryomuza bir bakal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/11\/order-mq.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-963 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/11\/order-mq.jpg\" alt=\"order-mq\" width=\"1046\" height=\"395\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/order-mq.jpg 1046w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/order-mq-300x113.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/order-mq-1024x387.jpg 1024w\" data-sizes=\"(max-width: 1046px) 100vw, 1046px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1046px; --smush-placeholder-aspect-ratio: 1046\/395;\" \/><\/a><\/p>\n<p>Konunun daha iyi anla\u015f\u0131labilmesi i\u00e7in en \u00e7ok transactional i\u015flemlerin ger\u00e7ekle\u015fti\u011fi, e-commerce sistemlerindeki sipari\u015f olu\u015fturma\u00a0\u00f6rne\u011fini ger\u00e7ekle\u015ftirece\u011fiz.<\/p>\n<p>Bu tarz i\u015flemlerde genelde bir sipari\u015f olu\u015fur, kullan\u0131c\u0131ya bir e-mail g\u00f6nderilir ve faturaland\u0131rma gibi vb. servisler \u00e7al\u0131\u015f\u0131r. Biz ise ger\u00e7ekle\u015ftirecek oldu\u011fumuz \u00f6rnekte\u00a0yukar\u0131daki flowchart&#8217;a bakt\u0131\u011f\u0131m\u0131zda, producer g\u00f6revini \u00fcstlenecek olan bir Order UI olacak. Bu ekrandan d\u00fc\u015fen sipari\u015fler bir queue&#8217;ya aktar\u0131lacak. Bu queue&#8217;yu ise consume edecek olan bir OrderService olacak. OrderService ise gerekli order i\u015flemlerini ger\u00e7ekle\u015ftirecek. Bu aradaki iki uygulama, tamamen birbirlerinden ba\u011f\u0131ms\u0131z bir \u015fekilde haberle\u015feceklerdir.<\/p>\n<p>Makalenin 2. serisinde\u00a0yer vermeyi d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcm bir di\u011fer senaryoya de\u011finmek gerekirse, OrderService ilgili order i\u015flemini ger\u00e7ekle\u015ftirir ve sonra bir event f\u0131rlat\u0131r. Bu event ile ilgilenen herhangi bir XService, bu event&#8217;\u0131 yakalar ve ilgili i\u015flemlerini tamamlar. \u00d6rne\u011fin order i\u015flemi OrderService taraf\u0131ndan ger\u00e7ekle\u015ftirildikten sonra, ilgili kullan\u0131c\u0131ya bir bilgilendirme e-mail&#8217;\u0131 g\u00f6nderilebilmesi i\u00e7in, NotificationService&#8217;e bir event f\u0131rlat\u0131l\u0131r. NotificationService bu event&#8217;\u0131 yakalar ve ilgili e-mail g\u00f6nderim i\u015flemini ger\u00e7ekle\u015ftirir.<\/p>\n<p>Bu tarz n say\u0131da farkl\u0131 servis, birbirleri ile loosely coupled bir \u015fekilde haberle\u015febilmektedirler.<\/p>\n<h4>3)\u00a0ESB Nedir ve MassTransit&#8217;e Giri\u015f<\/h4>\n<p><a href=\"\/wp-content\/uploads\/2016\/11\/mt-logo.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-966 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/11\/mt-logo.png\" alt=\"mt-logo\" width=\"184\" height=\"200\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 184px; --smush-placeholder-aspect-ratio: 184\/200;\" \/><\/a><\/p>\n<p>Enterprise Service Bus (ESB) i\u00e7in genel olarak transport i\u015flemleri i\u00e7in bir gateway&#8217;dir diyebiliriz. ESB&#8217;nin g\u00f6revi asl\u0131nda high level olarak \u00f6z\u00fcnde, transport i\u015flemlerini\u00a0higher abstraction seviyesinde client api i\u00e7in halletmektedir.<\/p>\n<p>Olaya biraz daha anla\u015f\u0131l\u0131r bir bak\u0131\u015f a\u00e7\u0131s\u0131ndan da bakmak gerekirse, SOA mimarilerinin kolay ve reliable bir \u015fekilde uygulanabilmesi i\u00e7in i\u00e7erisinde bir \u00e7ok altyap\u0131sal fonksiyonlar\u0131 bar\u0131nd\u0131ran bir altyap\u0131 mimarisidir diyebiliriz. Bunlara ek olarak\u00a0distributed olan\u00a0uygulamalar\u0131 \u00e7al\u0131\u015ft\u0131rmay\u0131 ve\u00a0y\u00f6netebilmeyi de kolayla\u015ft\u0131rmaktad\u0131r.<\/p>\n<p>\u015euanda .Net stack&#8217;i alt\u0131nda pop\u00fcler olan NServiceBus ve MassTransit gibi ESB&#8217;ler mevcuttur. MassTransit open-source bir projedir ve bir \u00e7ok MQ sistemine deste\u011fi de bulunmaktad\u0131r. Makale i\u00e7eri\u011finde ger\u00e7ekle\u015ftirecek oldu\u011fumuz \u00f6rnekte MassTransit ile ilerleyece\u011fimiz i\u00e7in, dilerseniz sa\u011fl\u0131yor oldu\u011fu baz\u0131 benefit&#8217;lere bir bakal\u0131m.<\/p>\n<p><strong>MassTransit Benetifs:<\/strong><\/p>\n<ul>\n<li>Transport i\u015flemlerinin\u00a0complexity&#8217;sini gizler<\/li>\n<li>Multiple transport deste\u011fi sunar<\/li>\n<li>Build-in olarak i\u00e7erisinde retries policy&#8217;leri mevcuttur (ki MQ yap\u0131lar\u0131nda olmazsa olmaz bir yap\u0131d\u0131r)<\/li>\n<li>Failure management sa\u011flar<\/li>\n<li>MassTransit Test Framework paketi ile kolay unit testing sa\u011flar<\/li>\n<li>Message\u00a0\u00a0scheduling mevcuttur. (periodic ve publishing yap\u0131labilmektedir)<\/li>\n<li>Request\/Response pattern&#8217;lar\u0131n\u0131 destekler<\/li>\n<li>Verimlilik i\u00e7in kendisi exchange&#8217;leri y\u00f6netir<\/li>\n<\/ul>\n<p>gibi faydalar\u0131 bulunmaktad\u0131r. Bunlara ek olarak da message&#8217;lar\u0131 intercept edebilmeye de olanak sa\u011flamaktad\u0131r.<\/p>\n<h4>3)\u00a0RabbitMQ ile MassTransit Implementasyonu<\/h4>\n<p>Gerekli concept&#8217;lere g\u00f6z att\u0131ktan sonra, art\u0131k yava\u015f yava\u015f implementasyon i\u015flemlerine ge\u00e7ebiliriz. &#8220;LightMessagingCore.Boilerplate&#8221; isminde bo\u015f bir solution olu\u015fturarak, ilk ad\u0131m\u0131m\u0131z\u0131 atal\u0131m. Solution i\u00e7erisine &#8220;LightMessagingCore.Boilerplate.Common&#8221; isminde bir class library ekleyelim ve burada bus i\u00e7in configuration i\u015flemlerimizi ger\u00e7ekle\u015ftirmeye ba\u015flayal\u0131m.<\/p>\n<p>&#8220;MqConstants&#8221; isminde bir class ekleyelim ve a\u015fa\u011f\u0131daki gibi kodlayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true\">using System.Configuration;\r\n\r\nnamespace LightMessagingCore.Boilerplate.Common\r\n{\r\n    public class MqConstants\r\n    {\r\n        public static string RabbitMQUri =&gt; ConfigurationManager.AppSettings[\"RabbitMQUri\"];\r\n        public static string RabbitMQUserName =&gt; ConfigurationManager.AppSettings[\"RabbitMQUserName\"];\r\n        public static string RabbitMQPassword =&gt; ConfigurationManager.AppSettings[\"RabbitMQPassword\"];\r\n    }\r\n}<\/pre>\n<p>Tan\u0131mlam\u0131\u015f oldu\u011fumuz bu class&#8217;da, daha sonra ihtiya\u00e7 duyaca\u011f\u0131m\u0131z baz\u0131 property&#8217;leri ekledik. Burada kullanacak oldu\u011fumuz RabbitMQ broker&#8217;\u0131\u00a0i\u00e7in URI adresi, varsa credential bilgileri ve bir queue ismi yer almaktad\u0131r.<\/p>\n<p>MassTransit implementasyonuna ba\u015flamadan \u00f6nce hemen Nuget Package Manager \u00fczerinden a\u015fa\u011f\u0131daki gibi &#8220;MassTransit.RabbitMQ&#8221; paketini kural\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/11\/nuget-rabbit.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-971 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/11\/nuget-rabbit.jpg\" alt=\"nuget-rabbit\" width=\"736\" height=\"286\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/nuget-rabbit.jpg 736w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/nuget-rabbit-300x117.jpg 300w\" data-sizes=\"(max-width: 736px) 100vw, 736px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 736px; --smush-placeholder-aspect-ratio: 736\/286;\" \/><\/a><\/p>\n<p>Paket kurulumunu tamamlad\u0131ktan sonra art\u0131k ESB configuration&#8217;lar\u0131n\u0131 ger\u00e7ekle\u015ftirecek oldu\u011fumuz &#8220;BusConfigurator&#8221; class&#8217;\u0131n\u0131 a\u015fa\u011f\u0131daki gibi\u00a0kodlamaya ba\u015flayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true\">using System;\r\nusing MassTransit;\r\nusing MassTransit.RabbitMqTransport;\r\n\r\nnamespace LightMessagingCore.Boilerplate.Common\r\n{\r\n    public class BusConfigurator\r\n    {\r\n        private static readonly Lazy&lt;BusConfigurator&gt; _Instance = new Lazy&lt;BusConfigurator&gt;(() =&gt; new BusConfigurator());\r\n\r\n        private BusConfigurator()\r\n        {\r\n\r\n        }\r\n\r\n        public static BusConfigurator Instance =&gt; _Instance.Value;\r\n\r\n        public IBusControl ConfigureBus(\r\n    Action&lt;IRabbitMqBusFactoryConfigurator, IRabbitMqHost&gt; registrationAction = null)\r\n        {\r\n            return Bus.Factory.CreateUsingRabbitMq(cfg =&gt;\r\n            {\r\n                var host = cfg.Host(new Uri(MqConstants.RabbitMQUri), hst =&gt;\r\n                {\r\n                    hst.Username(MqConstants.RabbitMQUserName);\r\n                    hst.Password(MqConstants.RabbitMQPassword);\r\n                });\r\n\r\n                registrationAction?.Invoke(cfg, host);\r\n            });\r\n        }\r\n    }\r\n}<\/pre>\n<p>Singleton olarak tasarlad\u0131\u011f\u0131m\u0131z &#8220;BusConfigurator&#8221; class&#8217;\u0131 i\u00e7erisinde, &#8220;ConfigureBus&#8221; method&#8217;u ile MassTransit&#8217;in &#8220;IBusControl&#8221; interface&#8217;ini implemente eden bir RabbitMQ BusControl instance&#8217;\u0131 olu\u015fturuyoruz. Bu i\u015flem i\u00e7in ise &#8220;Bus.Factory.CreateUsingRabbitMq&#8221; method&#8217;unu call ederek, &#8220;IRabbitMqBusFactoryConfigurator&#8221; tipinde bir action olu\u015fturuyoruz ve i\u00e7erisinde RabbitMQ&#8217;ya connect olabilmek i\u00e7in gerekli olan host credential bilgilerini tan\u0131ml\u0131yoruz.<\/p>\n<p>Bir di\u011fer yandan\u00a0&#8220;registrationAction&#8221; parametresi ile ise &#8220;ConfigureBus&#8221; method&#8217;unu \u00e7a\u011f\u0131r\u0131rken ihtiya\u00e7 duyuldu\u011fu noktalarda, RabbitMQ bus&#8217;\u0131 i\u00e7in gerekli olan &#8220;queue name&#8221;, &#8220;endpoint&#8221; ve &#8220;consumer&#8221; gibi bilgileri veriyor olaca\u011f\u0131z.<\/p>\n<p>En basit haliyle &#8220;BusConfigurator&#8221; class&#8217;\u0131 \u015fimdilik bu kadar.<\/p>\n<blockquote><p><strong>Not<\/strong>: Makale i\u00e7erisinde ger\u00e7ekle\u015ftirecek oldu\u011fumuz \u00f6rne\u011fi, sonras\u0131nda lightweight bir messaging core boilerplate&#8217;i olarak github \u00fczerinden ilerletmeyi d\u00fc\u015f\u00fcn\u00fcyorum. En k\u0131sa zamanda bus configurator i\u00e7in <em>retries policy&#8217;leri<\/em>, <em>circuit breaker<\/em>, <em>rate limiter<\/em> vb. gibi \u00f6zellikleri de fluent bir \u015fekilde implemente etmeyi d\u00fc\u015f\u00fcn\u00fcyorum.<\/p><\/blockquote>\n<p>\u015eimdi producer ve consumer&#8217;\u0131n exchange i\u015flemi s\u0131ras\u0131nda kullanacak oldu\u011fu, messaging interface&#8217;lerini tan\u0131mlamaya ba\u015flayabiliriz. Bunun i\u00e7in \u00f6ncelikle solution \u00fczerine &#8220;LightMessagingCore.Boilerplate.Messaging&#8221; isminde bir class library daha ekleyelim.<\/p>\n<p>Library eklemeyi tamamlad\u0131ktan sonra i\u00e7erisine a\u015fa\u011f\u0131daki gibi &#8220;IOrderCommand&#8221; isminde bir interface tan\u0131mlayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true\">namespace LightMessagingCore.Boilerplate.Messaging\r\n{\r\n    public interface IOrderCommand\r\n    {\r\n        int OrderId { get; set; }\r\n        string OrderCode { get; set; }\r\n    }\r\n}<\/pre>\n<p>Olu\u015fturmu\u015f oldu\u011fumuz bu interface sadece &#8220;OrderId&#8221; ve &#8220;OrderCode&#8221; bilgilerini tutmaktad\u0131r.<\/p>\n<blockquote><p><strong>Not<\/strong>: Bu k\u0131s\u0131mda \u00f6nemli bir nokta bulunmaktad\u0131r. <strong>ESB<\/strong> olarak MassTransit kulland\u0131\u011f\u0131m\u0131z i\u00e7in, producer ve consumer&#8217;\u0131n <strong>ayn\u0131 messaging interface<\/strong>&#8216;ini\u00a0exchange ediyor olmalar\u0131 \u00f6nemlidir. Aksi takdirde producer&#8217;\u0131n queue&#8217;ya g\u00f6nderdi\u011fi message&#8217;lar\u0131, consumer consume edemeyecektir. Bunun sebebi ise MassTransit&#8217;in verimlili\u011fi artt\u0131rabilmek i\u00e7in exchange&#8217;leri kendisinin y\u00f6netmesidir.\u00a0Y\u00f6netim i\u015flemini ise MassTransit, interface&#8217;lere g\u00f6re ger\u00e7ekle\u015ftirmektedir. Bu konuya makalenin ilerleyen b\u00f6l\u00fcmlerinde g\u00f6rsel olarak de\u011finece\u011fim.<\/p><\/blockquote>\n<h4>3.1)\u00a0Producer&#8217;\u0131n Haz\u0131rlanmas\u0131<\/h4>\n<p>Producer k\u0131sm\u0131n\u0131 yani Order UI&#8217;\u0131 olu\u015fturabilmek i\u00e7in gerekli altyap\u0131m\u0131z haz\u0131r durumda. Solution \u00fczerine &#8220;LightMessagingCore.Boilerplate.OrderUI&#8221; isminde, template olarak ise empty se\u00e7ili bir \u00a0Asp.Net MVC projesi ekleyelim. Projenin ekleme i\u015fleminden sonra ise solution structure&#8217;\u0131n son hali a\u015fa\u011f\u0131daki gibi olacakt\u0131r.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/11\/messaging-solution-structure.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-978 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/11\/messaging-solution-structure.jpg\" alt=\"messaging-solution-structure\" width=\"380\" height=\"344\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/messaging-solution-structure.jpg 380w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/messaging-solution-structure-300x272.jpg 300w\" data-sizes=\"(max-width: 380px) 100vw, 380px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 380px; --smush-placeholder-aspect-ratio: 380\/344;\" \/><\/a><\/p>\n<p>Projeyi ekledikten sonra ise &#8220;Controllers&#8221; k\u0131sm\u0131na &#8220;OrderController&#8221; isminde, empty bir MVC controller&#8217;\u0131 ekleyelim.<\/p>\n<blockquote><p><strong>Not<\/strong>: &#8220;LightMessagingCore.Boilerplate&#8221; solution&#8217;\u0131 alt\u0131nda, sanki monolith architecture&#8217;a do\u011fru gidiyor gibi olabiliriz. Fakat ger\u00e7ek bir ortamda olu\u015fturmu\u015f oldu\u011fumuz &#8220;LightMessagingCore.Boilerplate.Common&#8221; ve ortak payla\u015fmam\u0131z gereken contract&#8217;\u0131n da oldu\u011fu &#8220;LightMessagingCore.Boilerplate.Messaging&#8221; library&#8217;lerini, nuget server&#8217;lar \u00fczerinden birer package olarak y\u00f6netebilmek m\u00fcmk\u00fcnd\u00fcr. Sonras\u0131nda ise producer ve consumer&#8217;lar monolithlikten \u00e7\u0131karak, birer microservice olarak geli\u015ftirilebilir.\u00a0Ben \u00f6rnek gere\u011fi tek bir solution \u00fczerinden ilerleyece\u011fim.<\/p><\/blockquote>\n<p>Art\u0131k projeye ilgili referanslar\u0131 eklemeye ba\u015flayabiliriz. &#8220;LightMessagingCore.Boilerplate.OrderUI&#8221; projesinin referans k\u0131sm\u0131na gelerek &#8220;LightMessagingCore.Boilerplate.Common&#8221;, &#8220;LightMessagingCore.Boilerplate.Messaging&#8221; library&#8217;lerini referans olarak ekleyelim\u00a0ve Nuget Package Manager \u00fczerinden de &#8220;MassTransit.RabbitMQ&#8221; paketini kural\u0131m.<\/p>\n<p>Referans ekleme i\u015flemlerinin ard\u0131ndan order model&#8217;ini olu\u015fturabiliriz. Order model&#8217;ine &#8220;LightMessagingCore.Boilerplate.Messaging&#8221; library&#8217;sinde olu\u015fturmu\u015f oldu\u011fumuz &#8220;IOrderCommand&#8221; interface&#8217;ini implemente edece\u011fiz. &#8220;Models&#8221; klas\u00f6r\u00fcne &#8220;OrderModel&#8221; isminde yeni bir class tan\u0131mlayal\u0131m ve &#8220;IOrderCommand&#8221; interface&#8217;ini a\u015fa\u011f\u0131daki gibi implemente edelim.<\/p>\n<pre class=\"lang:c# decode:true \">using LightMessagingCore.Boilerplate.Messaging;\r\n\r\nnamespace LightMessagingCore.Boilerplate.OrderUI.Models\r\n{\r\n    public class OrderModel : IOrderCommand\r\n    {\r\n        public string OrderCode { get; set; }\r\n\r\n        public int OrderId { get; set; }\r\n    }\r\n}<\/pre>\n<p>Implementasyon i\u015fleminden sonra ise &#8220;OrderController&#8221; a gelerek, &#8220;Index&#8221; action&#8217;\u0131 \u00fczerine sa\u011f t\u0131klay\u0131p yeni bir view ekleyelim. View ekleme i\u015flemi s\u0131ras\u0131nda bize kolayl\u0131k sa\u011flayabilmesi ad\u0131na <strong>template<\/strong> olarak &#8220;Create&#8221; ve <strong>model class<\/strong> olarak ise olu\u015fturmu\u015f oldu\u011fumuz &#8220;OrderModel&#8221; class&#8217;\u0131n\u0131 se\u00e7elim.<\/p>\n<p>View&#8217;\u0131n eklenmesinin ard\u0131ndan &#8220;Views&gt;Order&gt;Index.cshtml&#8221; path&#8217;ini takip edelim ve a\u015fa\u011f\u0131daki gibi g\u00fcncelleyelim.<\/p>\n<pre class=\"lang:c# decode:true \">@model LightMessagingCore.Boilerplate.OrderUI.Models.OrderModel\r\n\r\n@{\r\n    ViewBag.Title = \"Order Create\";\r\n}\r\n\r\n&lt;h2&gt;Order Create&lt;\/h2&gt;\r\n\r\n\r\n@using (Html.BeginForm())\r\n{\r\n    @Html.AntiForgeryToken()\r\n\r\n    &lt;div class=\"form-horizontal\"&gt;\r\n        &lt;h4&gt;Order&lt;\/h4&gt;\r\n        &lt;hr \/&gt;\r\n        @Html.ValidationSummary(true, \"\", new { @class = \"text-danger\" })\r\n        &lt;div class=\"form-group\"&gt;\r\n            @Html.LabelFor(model =&gt; model.OrderCode, htmlAttributes: new { @class = \"control-label col-md-2\" })\r\n            &lt;div class=\"col-md-10\"&gt;\r\n                @Html.EditorFor(model =&gt; model.OrderCode, new { htmlAttributes = new { @class = \"form-control\" } })\r\n                @Html.ValidationMessageFor(model =&gt; model.OrderCode, \"\", new { @class = \"text-danger\" })\r\n            &lt;\/div&gt;\r\n        &lt;\/div&gt;\r\n        &lt;div class=\"form-group\"&gt;\r\n            @Html.LabelFor(model =&gt; model.OrderId, htmlAttributes: new { @class = \"control-label col-md-2\" })\r\n            &lt;div class=\"col-md-10\"&gt;\r\n                @Html.EditorFor(model =&gt; model.OrderId, new { htmlAttributes = new { @class = \"form-control\" } })\r\n                @Html.ValidationMessageFor(model =&gt; model.OrderId, \"\", new { @class = \"text-danger\" })\r\n            &lt;\/div&gt;\r\n        &lt;\/div&gt;\r\n\r\n        &lt;div class=\"form-group\"&gt;\r\n            &lt;div class=\"col-md-offset-2 col-md-10\"&gt;\r\n                &lt;input type=\"submit\" value=\"Create\" class=\"btn btn-default\" \/&gt;\r\n            &lt;\/div&gt;\r\n        &lt;\/div&gt;\r\n    &lt;\/div&gt;\r\n}\r\n\r\n&lt;div&gt;\r\n    @Html.ActionLink(\"Back to List\", \"Index\")\r\n&lt;\/div&gt;\r\n\r\n&lt;script src=\"~\/Scripts\/jquery-1.10.2.min.js\"&gt;&lt;\/script&gt;\r\n&lt;script src=\"~\/Scripts\/jquery.validate.min.js\"&gt;&lt;\/script&gt;\r\n&lt;script src=\"~\/Scripts\/jquery.validate.unobtrusive.min.js\"&gt;&lt;\/script&gt;<\/pre>\n<p>\u0130lgili paketlerin ve view&#8217;\u0131n tamamlanmas\u0131n\u0131n ard\u0131ndan art\u0131k &#8220;OrderController&#8221; \u0131 kodlamaya devam edebiliriz. \u00a0&#8220;OrderController&#8221; \u0131 a\u015fa\u011f\u0131daki gibi kodlayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true\">using System;\r\nusing System.Configuration;\r\nusing System.Web.Mvc;\r\nusing LightMessagingCore.Boilerplate.Common;\r\nusing LightMessagingCore.Boilerplate.OrderUI.Models;\r\nusing MassTransit;\r\n\r\nnamespace LightMessagingCore.Boilerplate.OrderUI.Controllers\r\n{\r\n    public class OrderController : Controller\r\n    {\r\n        private readonly ISendEndpoint _bus;\r\n\r\n        public OrderController()\r\n        {\r\n            var busControl = BusConfigurator.Instance.ConfigureBus();\r\n            var sendToUri = new Uri($\"{MqConstants.RabbitMQUri}{ConfigurationManager.AppSettings[\"OrderQueueName\"]}\");\r\n\r\n            _bus = busControl.GetSendEndpoint(sendToUri).Result;\r\n        }\r\n\r\n        \/\/ GET: Order\r\n        public ActionResult Index(OrderModel orderModel)\r\n        {\r\n            if (orderModel.OrderId &gt; 0)\r\n                CreateOrder(orderModel);\r\n\r\n            return View();\r\n        }\r\n\r\n        private void CreateOrder(OrderModel orderModel)\r\n        {\r\n            _bus.Send(orderModel).Wait();\r\n        }\r\n    }\r\n}<\/pre>\n<p>Burada \u00f6ncelikle constructor \u00fczerinden &#8220;busControl&#8221; \u00fc initialize ediyoruz. Bu i\u015flem i\u00e7in common library&#8217;si \u00fczerinde olu\u015fturmu\u015f oldu\u011fumuz &#8220;BusConfigurator&#8221; class&#8217;\u0131n\u0131 kullan\u0131yoruz. Devam\u0131nda ise bir queue endpoint&#8217;i belirleyerek, &#8220;busControl&#8221; \u00fcn &#8220;GetSendEndpoint&#8221; method&#8217;una g\u00f6nderiyoruz. Bu i\u015flemin\u00a0ard\u0131ndan art\u0131k\u00a0t\u00fcm messaging i\u015flemleri, initialize etti\u011fimiz\u00a0&#8220;ISendEndpoint&#8221; i \u00fczerinden devam edecektir. &#8220;CreateOrder&#8221; method&#8217;una bakt\u0131\u011f\u0131m\u0131zda ise art\u0131k \u00e7ok straightforward bir hale geldi\u011fini g\u00f6rebiliriz. Art\u0131k tek yapmam\u0131z gereken bus \u00fczerindeki &#8220;Send&#8221; method&#8217;unu \u00e7a\u011f\u0131rarak, i\u00e7erisine ilgili &#8220;IOrderCommand&#8221; interface&#8217;ini implemente etmi\u015f model&#8217;i vermek yeterli olacakt\u0131r.<\/p>\n<p>Art\u0131k producer haz\u0131r durumdad\u0131r. Dilerseniz consumer k\u0131sm\u0131na ba\u015flamadan \u00f6nce &#8220;MqConstants&#8221; ve &#8220;OrderController&#8221; i\u00e7erisinde tan\u0131mlam\u0131\u015f oldu\u011fumuz key&#8217;leri, config\u00a0dosyas\u0131na a\u015fa\u011f\u0131daki gibi ekleyelim.<\/p>\n<pre class=\"lang:default decode:true\">&lt;add key=\"RabbitMQUri\" value=\"rabbitmq:\/\/localhost\/\"\/&gt;\r\n&lt;add key=\"RabbitMQUserName\" value=\"guest\"\/&gt;\r\n&lt;add key=\"RabbitMQPassword\" value=\"guest\"\/&gt;\r\n&lt;add key=\"OrderQueueName\" value=\"lightmessagingcore.boilerplate.order\"\/&gt;<\/pre>\n<blockquote><p><strong>Not<\/strong>: Bu makale kapsam\u0131nda RabbitMQ kurulumuna de\u011finmeyece\u011fim. <a href=\"https:\/\/gokhan-gokalp.com\/rabbitmq-nedir-ve-windowsa-kurulumu\/\" target=\"_blank\">Buradan<\/a> daha \u00f6nce yazm\u0131\u015f oldu\u011fum makaleye ula\u015farak,windows \u00fczerine kurulum bilgilerine eri\u015febilirsiniz veya docker \u00fczerine kurup, kullanabilirsiniz.<\/p><\/blockquote>\n<h4>3.2)\u00a0Consumer&#8217;\u0131n Haz\u0131rlanmas\u0131<\/h4>\n<p>Consumer\u00a0i\u00e7in solution \u00fczerine &#8220;LightMessagingCore.Boilerplate.OrderService&#8221; isminde bir console application ekleyelim. Bu k\u0131s\u0131m microservice yakla\u015f\u0131m\u0131nda olup, olduk\u00e7a lightweight tutmaya \u00e7al\u0131\u015faca\u011f\u0131z. Di\u011fer projelerde oldu\u011fu gibi buraya da &#8220;LightMessagingCore.Boilerplate.Common&#8221;, &#8220;LightMessagingCore.Boilerplate.Messaging&#8221; library&#8217;lerini referans olarak ekeyerek, Nuget Package Manager \u00fczerinden &#8220;MassTransit.RabbitMQ&#8221; paketini de dahil edelim.<\/p>\n<p>\u015eimdi &#8220;Program.cs&#8221; e gelelim ve burada bus control&#8217;\u00fc initialize edelim.<\/p>\n<pre class=\"lang:c# decode:true\">using System;\r\nusing LightMessagingCore.Boilerplate.Common;\r\nusing System.Configuration;\r\nusing MassTransit;\r\n\r\nnamespace LightMessagingCore.Boilerplate.OrderService\r\n{\r\n    class Program\r\n    {\r\n        static void Main(string[] args)\r\n        {\r\n            Console.Title = \"OrderService\";\r\n\r\n            var bus = BusConfigurator.Instance\r\n                .ConfigureBus((cfg, host) =&gt;\r\n                {\r\n                    cfg.ReceiveEndpoint(host, ConfigurationManager.AppSettings[\"OrderQueueName\"], e =&gt;\r\n                    {\r\n                        e.Consumer&lt;OrderCommandConsumer&gt;();\r\n                    });\r\n                });\r\n\r\n            bus.Start();\r\n\r\n            Console.WriteLine(\"Listening order command..\");\r\n            Console.ReadLine();\r\n        }\r\n    }\r\n}<\/pre>\n<p>Burada da common projesi i\u00e7erisinde\u00a0daha \u00f6nce olu\u015fturmu\u015f oldu\u011fumuz &#8220;BusConfigurator&#8221; class&#8217;\u0131n\u0131 kullanarak, yeni bir bus initialize ediyoruz. Bu sefer farkl\u0131 olarak initializing k\u0131sm\u0131nda bir action method kullan\u0131yoruz ve olu\u015fturuyor oldu\u011fumuz configuration&#8217;\u0131n message&#8217;lar\u0131 consume edece\u011fi endpoint&#8217;i, &#8220;ReceiveEndpoint&#8221; method&#8217;u ile set ediyoruz ve ard\u0131ndan endpoint&#8217;in hangi consumer arac\u0131l\u0131\u011f\u0131 ile consuming i\u015flemini ger\u00e7ekle\u015ftirece\u011fini belirliyoruz. Konuyu toplamak gerekirse bu k\u0131s\u0131m art\u0131k bu uygulaman\u0131n kendisine set edilen endpoint \u00fczerinden, &#8220;OrderCommandConsumer&#8221; type&#8217;\u0131 ile consume i\u015flemini ger\u00e7ekle\u015ftirece\u011fini g\u00f6steriyor.<\/p>\n<p>Dilerseniz \u015fimdi &#8220;OrderCommandConsumer&#8221; \u0131 a\u015fa\u011f\u0131daki gibi kodlayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true\">using System;\r\nusing System.Threading.Tasks;\r\nusing LightMessagingCore.Boilerplate.Messaging;\r\nusing MassTransit;\r\n\r\nnamespace LightMessagingCore.Boilerplate.OrderService\r\n{\r\n    public class OrderCommandConsumer : IConsumer&lt;IOrderCommand&gt;\r\n    {\r\n        public async Task Consume(ConsumeContext&lt;IOrderCommand&gt; context)\r\n        {\r\n            var orderCommand = context.Message;\r\n\r\n            await Console.Out.WriteAsync($\"Order code: {orderCommand.OrderCode} Order id: {orderCommand.OrderId}\");\r\n\r\n            \/\/do something..\r\n        }\r\n    }\r\n}<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi bu k\u0131s\u0131mda olduk\u00e7a basit bir durumda. Tek yapmam\u0131z gereken \u015fey MassTransit i\u00e7erisinde bulunan &#8220;IConsumer&lt;T&gt;&#8221; interface&#8217;ini, ilgili contract&#8217;\u0131m\u0131z ile implemente etmektir. &#8220;Consume&#8221; method&#8217;u ile de consume i\u015flemlerini ger\u00e7ekle\u015ftirmektedir.<\/p>\n<h4>3.3)\u00a0Test<\/h4>\n<p>Evet consumer&#8217;da \u015fuan haz\u0131r durumdad\u0131r. Sizlerde fark ettiyseniz e\u011fer, MassTransit bir \u00e7ok konuda bizlere kolayl\u0131k ve h\u0131z sa\u011flamaktad\u0131r. Dilerseniz art\u0131k test i\u015flemlerine ge\u00e7ebiliriz. Bunun i\u00e7in solution ayarlar\u0131ndan multiple startup projects olarak, &#8220;OrderService&#8221; ve &#8220;OrderUI&#8221; projelerini se\u00e7elim ve start tu\u015funa basal\u0131m.<\/p>\n<p>Bu i\u015flemin ard\u0131ndan \u00f6ncelikle consumer g\u00f6revini g\u00f6recek olan &#8220;LightMessagingCore.Boilerplate.OrderService&#8221; projesi, a\u015fa\u011f\u0131daki gibi a\u00e7\u0131lacakt\u0131r.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/11\/order-service.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-986 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/11\/order-service.jpg\" alt=\"order-service\" width=\"499\" height=\"185\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/order-service.jpg 499w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/order-service-300x111.jpg 300w\" data-sizes=\"(max-width: 499px) 100vw, 499px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 499px; --smush-placeholder-aspect-ratio: 499\/185;\" \/><\/a><\/p>\n<p>Order service art\u0131k &#8220;IOrderCommand&#8221; interface&#8217;ine sahip message&#8217;lar\u0131, consume durumundad\u0131r. Consumer&#8217;\u0131n ve Producer&#8217;\u0131n initialize olmas\u0131yla beraber dilerseniz RabbitMQ Management ekran\u0131 \u00fczerinden, exchange&#8217;lere bir bakal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/11\/order-service-exchange.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-988 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/11\/order-service-exchange.jpg\" alt=\"order-service-exchange\" width=\"888\" height=\"598\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/order-service-exchange.jpg 888w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/order-service-exchange-300x202.jpg 300w\" data-sizes=\"(max-width: 888px) 100vw, 888px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 888px; --smush-placeholder-aspect-ratio: 888\/598;\" \/><\/a><\/p>\n<p>Biz her iki uygulamada da sadece queue name olarak &#8220;lightmessagingcore.boilerplate.order&#8221; set etmi\u015ftik.<\/p>\n<p>Makalenin \u00fcst k\u0131s\u0131mlar\u0131nda hat\u0131rlarsak MassTransit&#8217;in verimlilik i\u00e7in, exchange&#8217;leri kendisinin y\u00f6netti\u011finden bahsetmi\u015ftik. \u0130\u015fte bu noktada yukar\u0131daki g\u00f6rselde oldu\u011fu gibi &#8220;LightMessagingCore.Boilerplate.Messaging:IOrderCommand&#8221; isimli exchange&#8217;i olu\u015fturmu\u015ftur. Burada &#8220;IOrderCommand&#8221; contract&#8217;\u0131 ile gelen message&#8217;lar\u0131 otomatik olarak kendisi a\u015fa\u011f\u0131da bulunan queue&#8217;ya bind etmektedir.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/11\/order-service-exchange-queue.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-989 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/11\/order-service-exchange-queue.jpg\" alt=\"order-service-exchange-queue\" width=\"888\" height=\"598\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/order-service-exchange-queue.jpg 888w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/order-service-exchange-queue-300x202.jpg 300w\" data-sizes=\"(max-width: 888px) 100vw, 888px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 888px; --smush-placeholder-aspect-ratio: 888\/598;\" \/><\/a><\/p>\n<p>\u015eimdi &#8220;OrderUI&#8221; \u0131n oldu\u011fu tab&#8217;a gelelim ve a\u015fa\u011f\u0131daki gibi bir order create edelim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/11\/create-order.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-992 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/11\/create-order.jpg\" alt=\"create-order\" width=\"888\" height=\"598\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/create-order.jpg 888w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/create-order-300x202.jpg 300w\" data-sizes=\"(max-width: 888px) 100vw, 888px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 888px; --smush-placeholder-aspect-ratio: 888\/598;\" \/><\/a><\/p>\n<p>Create i\u015fleminin ard\u0131ndan &#8220;OrderService&#8221; ilgili message&#8217;\u0131 yakalay\u0131p, consume i\u015flemini a\u015fa\u011f\u0131daki gibi ger\u00e7ekle\u015ftirmi\u015ftir.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/11\/order-service-consume.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-993 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/11\/order-service-consume.jpg\" alt=\"order-service-consume\" width=\"499\" height=\"185\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/order-service-consume.jpg 499w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/order-service-consume-300x111.jpg 300w\" data-sizes=\"(max-width: 499px) 100vw, 499px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 499px; --smush-placeholder-aspect-ratio: 499\/185;\" \/><\/a><\/p>\n<p>Bu makale kapsam\u0131nda sizlerle service bus olarak MassTransit kullan\u0131p, RabbitMQ ile messaging i\u015flemlerini nas\u0131l ger\u00e7ekle\u015ftirebilece\u011fimizi ele ald\u0131k ve messaging architecture hakk\u0131ndaki temel bilgimizi tazeledik. Bir sonraki messaging serisinde ise reliability, fault management ve HA gibi konulara de\u011finmeyi d\u00fc\u015f\u00fcn\u00fcyorum.<\/p>\n<p>\u0130lgili projeye github hesab\u0131m \u00fczerinden a\u015fa\u011f\u0131dan eri\u015febilir,\u00a0sizlerde bu core library&#8217;nin geli\u015ftirilmesinde katk\u0131da bulunabilirsiniz. Takipte kal\u0131n.<\/p>\n<p><a href=\"http:\/\/github.com\/GokGokalp\/lightmessagingcore-boilerplate\" target=\"_blank\">http:\/\/github.com\/GokGokalp\/lightmessagingcore-boilerplate<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba arkada\u015flar. Bir s\u00fcredir sizlere messaging\u00a0sistemleri \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131mdan daha \u00f6nceki makalelerimde bahsetmi\u015ftim. Messaging konusundaki di\u011fer makalelerim \u00fczerinden sizlerden gelen feedback&#8217;ler do\u011frultusunda MQ(Messaging Queue) yap\u0131s\u0131 ile beraber bir ESB(Enterprise Service Bus) kullanarak, b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar\u0131 nas\u0131l daha iyi scale edebiliriz\u00a0konusundaki bilgilerimi sizlere aktarmaya \u00e7al\u0131\u015faca\u011f\u0131m. Bu makale&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">MassTransit kullanarak RabbitMQ ile Messaging Altyap\u0131s\u0131 Olu\u015fturma<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[68,285,152],"tags":[345,348,343,344,333,339,338,335,334,346,260,347,153,342,337,341,336,340],"class_list":["post-957","post","type-post","status-publish","format-standard","hentry","category-architectural","category-messaging","category-rabbitmq","tag-c-ile-messaging","tag-c-ile-microservice","tag-enterprise-service-bus-kullanimi","tag-enterprise-service-bus-nedir","tag-masstransit","tag-masstransit-c","tag-masstransit-c-kullanimi","tag-masstransit-kullanimi","tag-masstransit-nedir","tag-messaging-architecture","tag-microservice-nedir","tag-microservice-ornek","tag-rabbitmq","tag-rabbitmq-fault-management","tag-rabbitmq-ile-masstransit","tag-rabbitmq-reliability","tag-rabbitmq-ve-masstransit","tag-rabbitmq-ve-masstransit-c","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":false,"content":false,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>MassTransit kullanarak RabbitMQ ile Messaging Altyap\u0131s\u0131 Olu\u015fturma - 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\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MassTransit kullanarak RabbitMQ ile Messaging Altyap\u0131s\u0131 Olu\u015fturma - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2016-11-14T20:35:03+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-11-14T20:59:19+00:00\" \/>\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=\"14 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"MassTransit kullanarak RabbitMQ ile Messaging Altyap\u0131s\u0131 Olu\u015fturma\",\"datePublished\":\"2016-11-14T20:35:03+00:00\",\"dateModified\":\"2016-11-14T20:59:19+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\\\/\"},\"wordCount\":2384,\"commentCount\":9,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"keywords\":[\"c# ile messaging\",\"c# ile microservice\",\"enterprise service bus kullan\u0131m\u0131\",\"enterprise service bus nedir\",\"masstransit\",\"masstransit c#\",\"masstransit c# kullan\u0131m\u0131\",\"masstransit kullan\u0131m\u0131\",\"masstransit nedir\",\"messaging architecture\",\"MicroService nedir\",\"microservice \u00f6rnek\",\"RabbitMQ\",\"rabbitmq fault management\",\"rabbitmq ile masstransit\",\"rabbitmq reliability\",\"rabbitmq ve masstransit\",\"rabbitmq ve masstransit c#\"],\"articleSection\":[\"Architectural\",\"Messaging\",\"RabbitMQ\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\\\/\",\"name\":\"MassTransit kullanarak RabbitMQ ile Messaging Altyap\u0131s\u0131 Olu\u015fturma - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"datePublished\":\"2016-11-14T20:35:03+00:00\",\"dateModified\":\"2016-11-14T20:59:19+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MassTransit kullanarak RabbitMQ ile Messaging Altyap\u0131s\u0131 Olu\u015fturma\"}]},{\"@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=1774960998\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1774960998\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1774960998\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1774960998\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"MassTransit kullanarak RabbitMQ ile Messaging Altyap\u0131s\u0131 Olu\u015fturma - 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\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\/","og_locale":"tr_TR","og_type":"article","og_title":"MassTransit kullanarak RabbitMQ ile Messaging Altyap\u0131s\u0131 Olu\u015fturma - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2016-11-14T20:35:03+00:00","article_modified_time":"2016-11-14T20:59:19+00:00","author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"MassTransit kullanarak RabbitMQ ile Messaging Altyap\u0131s\u0131 Olu\u015fturma","datePublished":"2016-11-14T20:35:03+00:00","dateModified":"2016-11-14T20:59:19+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\/"},"wordCount":2384,"commentCount":9,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"keywords":["c# ile messaging","c# ile microservice","enterprise service bus kullan\u0131m\u0131","enterprise service bus nedir","masstransit","masstransit c#","masstransit c# kullan\u0131m\u0131","masstransit kullan\u0131m\u0131","masstransit nedir","messaging architecture","MicroService nedir","microservice \u00f6rnek","RabbitMQ","rabbitmq fault management","rabbitmq ile masstransit","rabbitmq reliability","rabbitmq ve masstransit","rabbitmq ve masstransit c#"],"articleSection":["Architectural","Messaging","RabbitMQ"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\/","url":"https:\/\/gokhan-gokalp.com\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\/","name":"MassTransit kullanarak RabbitMQ ile Messaging Altyap\u0131s\u0131 Olu\u015fturma - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"datePublished":"2016-11-14T20:35:03+00:00","dateModified":"2016-11-14T20:59:19+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/masstransit-kullanarak-rabbitmq-ile-messaging-altyapisi-olusturma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"MassTransit kullanarak RabbitMQ ile Messaging Altyap\u0131s\u0131 Olu\u015fturma"}]},{"@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=1774960998","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1774960998","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1774960998","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1774960998"},"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\/957","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=957"}],"version-history":[{"count":23,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/957\/revisions"}],"predecessor-version":[{"id":996,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/957\/revisions\/996"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=957"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=957"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=957"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}