﻿
{"id":19954,"date":"2020-12-19T18:38:53","date_gmt":"2020-12-19T18:38:53","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=19954"},"modified":"2020-12-19T22:29:45","modified_gmt":"2020-12-19T22:29:45","slug":"net-core-masstransit-kullanarak-rabbitmq-ile-messaging","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/net-core-masstransit-kullanarak-rabbitmq-ile-messaging\/","title":{"rendered":".NET Core &#8211; MassTransit Kullanarak RabbitMQ \u0130le Messaging"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>G\u00fcn\u00fcm\u00fczde geli\u015ftirilen bir\u00e7ok enterprise uygulama, ihtiya\u00e7lar do\u011frultusunda birbirinden ba\u011f\u0131ms\u0131z platformlarda, distributed bir \u015fekilde \u00e7al\u0131\u015fmaktad\u0131r. Bu yap\u0131lar\u0131n birbirleriyle olan ileti\u015fimleri genellikle Messaging yap\u0131lar\u0131 sayesinde gev\u015fek ba\u011fl\u0131l\u0131kla(loosely coupled) ve asenkron bir \u015fekilde ger\u00e7ekle\u015ftirilmekte ve b\u00f6ylece \u00f6l\u00e7eklenebilirlik(scalability) ve esneklik(flexibility) sa\u011flanmaktad\u0131r. Lakin g\u00fcn\u00fcm\u00fczde kullan\u0131lan bir\u00e7ok messaging yap\u0131lanmas\u0131ndan hangisini kullan\u0131rsan\u0131z kullan\u0131n; hata y\u00f6netimi, yeniden deneme, bekletme, transaction vs. gibi durumlarla kar\u015f\u0131 kar\u015f\u0131ya kal\u0131nmakta ve bu \u015fekilde distributed olan uygulamalar\u0131 \u00e7al\u0131\u015ft\u0131rmak ve y\u00f6netmek zorla\u015fmaktad\u0131r. \u0130\u015fte bu zorluklar\u0131n \u00fcstesinden gelmek ve y\u00f6netilebilirli\u011fi kolayla\u015ft\u0131rmak i\u00e7in bir <em>Enterprise Service Bus (ESB)<\/em> teknolojisi kullanmam\u0131z gerekmektedir. Bu duruma istinaden bu i\u00e7eri\u011fimizde, messaging yap\u0131s\u0131 olan RabbitMQ kuyruk sisteminin kullan\u0131ld\u0131\u011f\u0131 distributed sistemlerde, ESB teknolojisi olarak MassTransit Framework&#8217;\u00fcn\u00fc ele alacak, nas\u0131l ve ne ama\u00e7la kullan\u0131ld\u0131\u011f\u0131n\u0131 derinlemesine inceliyor olaca\u011f\u0131z.<\/p>\n<p>\u00d6ncelikle Enterprise Service Bus&#8217;un(ESB) ve MassTransit&#8217;in ne oldu\u011funu daha detayl\u0131 a\u00e7arak ba\u015flayal\u0131m.<\/p>\n<h3>Enterprise Service Bus (ESB) Nedir?<\/h3>\n<p>Servisler aras\u0131 entegrasyon sa\u011flayan komponentlerin b\u00fct\u00fcn\u00fcd\u00fcr diyebiliriz. Yani, bir sistemde bulunan birden \u00e7ok birbirinden ba\u011f\u0131ms\u0131z servisin, kendi aralar\u0131ndaki ileti\u015fimini ve etkile\u015fimini sa\u011flayan bir sistemdir. Temelde client API i\u00e7in servisler aras\u0131 ula\u015f\u0131m\/transport i\u015flemlerini daha y\u00fcksek abstraction seviyesinde \u00e7\u00f6zmek i\u00e7in kullan\u0131lmaktad\u0131r. B\u00f6ylece distributed olan uygulamalar\u0131 rahatl\u0131kla \u00e7al\u0131\u015ft\u0131rmay\u0131 ve y\u00f6netmeyi ama\u00e7lamaktad\u0131r.<\/p>\n<h3>MassTransit Nedir?<\/h3>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-10.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-10-300x300.png\" alt=\".NET Core - MassTransit Kullanarak RabbitMQ \u0130le Messaging\" width=\"300\" height=\"300\" class=\"aligncenter size-medium wp-image-20110\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-10-300x300.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-10-150x150.png 150w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-10-160x160.png 160w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-10-320x320.png 320w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-10.png 612w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\n.NET i\u00e7in geli\u015ftirilmi\u015f olan, distributed uygulamalar\u0131 rahatl\u0131kla y\u00f6netebilmeyi ve \u00e7al\u0131\u015ft\u0131rmay\u0131 ama\u00e7layan, \u00fccretsiz, open source bir Enterprise Service Bus Framework&#8217;\u00fcd\u00fcr. Messaging tabanl\u0131, gev\u015fek ba\u011fl\u0131(loosely coupled) ve asenkron olarak tasarlanm\u0131\u015f da\u011f\u0131n\u0131k sistemlerde y\u00fcksek dereceli kullan\u0131labilirlik, g\u00fcvenilirlik ve \u00f6l\u00e7eklenebilirlik sa\u011flayabilmek i\u00e7in hizmetler olu\u015fturmay\u0131 olduk\u00e7a kolayla\u015ft\u0131rmaktad\u0131r. \u0130\u00e7eri\u011fimiz boyunca MassTransit framework&#8217;\u00fc ile seyredece\u011fimiz i\u00e7in dilerseniz avantajlar\u0131n\u0131 h\u0131zl\u0131ca de\u011ferlendirelim.<\/p>\n<blockquote><p><em style=\"color: orange;\">MassTransit, tamamen farkl\u0131 uygulamalar aras\u0131nda message-based communication yapabilmemizi sa\u011flayan bir transport gateway&#8217;idir.<\/em><\/p><\/blockquote>\n<p><strong>Avantajlar\u0131<\/strong><\/p>\n<ul>\n<li>Open source ve \u00fccretsizdir,<\/li>\n<li>Kullan\u0131m\u0131 kolayd\u0131r,<\/li>\n<li>G\u00fc\u00e7l\u00fc mesaj desenleri(message pattern)ni bar\u0131nd\u0131r\u0131r<\/li>\n<li>Distributed transaction sa\u011flar,<\/li>\n<li>Test edilebilirdir,<\/li>\n<li>Monitoring\/\u0130zleme \u00f6zelli\u011fi mevcuttur,<\/li>\n<li>Transport i\u015flemlerinin kompleksli\u011fini d\u00fc\u015f\u00fcr\u00fcr,<\/li>\n<li>Multiple transport deste\u011fi sa\u011flar,<\/li>\n<li>Hata y\u00f6netimi sa\u011flar,<\/li>\n<li>Scheduling\/zamanlama mevcuttur,<\/li>\n<li>Request\/Response pattern&#8217;lar\u0131n\u0131 destekler,<\/li>\n<li>Message broker exchange&#8217;lerini y\u00f6netebilir<\/li>\n<li>vs.<\/li>\n<li>vs.<\/li>\n<\/ul>\n<p><strong>Peki ne ama\u00e7la, hangi durumlarda kullan\u0131r\u0131z?<\/strong><br \/>\nMicroservice architecture yakla\u015f\u0131mlarda t\u00fcm servisleri ay\u0131rd\u0131ktan sonra(yani distributed yakla\u015f\u0131m sergilendikten sonra), asenkron operasyonlara ihtiya\u00e7 olursa ve ger\u00e7ekle\u015ftirmeye karar verilirse bu tarz durumlarda message broker&#8217;lar kullan\u0131lmaktad\u0131r. Bu \u015fekilde distributed yakla\u015f\u0131mlarda message broker kulland\u0131\u011f\u0131 taktirde makalemizin ilk paragraflar\u0131nda da bahsedildi\u011fi gibi hata y\u00f6netimi, yeniden deneme, bekletme, transaction vs. gibi meydana gelen durumlar\u0131 rahatl\u0131kla y\u00f6netebilmek i\u00e7in tercih edebilir, kullanabiliriz.<\/p>\n<p><strong>Temel D\u00fczeyde MassTransit K\u00fct\u00fcphanesinin Kullan\u0131m\u0131<\/strong><br \/>\nTemel d\u00fczeyde MassTransit k\u00fct\u00fcphanesinin kullan\u0131m\u0131n\u0131 \u00f6rneklendirebilmek i\u00e7in bir Console uygulamas\u0131ndan faydalanabiliriz. \u0130lgili uygulamaya <code style=\"color: red;\">dotnet add package MassTransit<\/code> komutu arac\u0131l\u0131\u011f\u0131yla <a href=\"https:\/\/www.nuget.org\/packages\/MassTransit\/\" target=\"_blank\" rel=\"noopener noreferrer\">MassTransit<\/a> k\u00fct\u00fcphanesini y\u00fckledikten sonra a\u015fa\u011f\u0131daki kodun geli\u015ftirilmesi yeterli olacakt\u0131r :<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Program\r\n    {\r\n        class Message\r\n        {\r\n            public string Text { get; set; }\r\n        }\r\n        static async Task Main(string&#x5B;] args)\r\n        {\r\n            var bus = Bus.Factory.CreateUsingInMemory(factory =&gt;\r\n                factory.ReceiveEndpoint(&quot;test_queue&quot;, endpoint =&gt;\r\n                    endpoint.Handler&lt;Message&gt;(async handler =&gt; Console.Out.WriteLine($&quot;***\\nReceived : { handler.Message.Text}\\n***&quot;))\r\n                )\r\n            );\r\n\r\n            \/\/Kanal ba\u015flat\u0131l\u0131yor\r\n            await bus.StartAsync();\r\n\r\n            await Task.Run(async () =&gt;\r\n            {\r\n                while (true)\r\n                {\r\n                    Message message = new Message\r\n                    {\r\n                        Text = Console.ReadLine()\r\n                    };\r\n                    if (message.Text.ToUpper() == &quot;C&quot;)\r\n                    {\r\n                        \/\/Kanal sonland\u0131r\u0131l\u0131yor\r\n                        await bus.StopAsync();\r\n                        break;\r\n                    }\r\n                    await bus.Publish(message);\r\n                }\r\n            });\r\n        }\r\n    }\r\n<\/pre>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-19979\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging.gif\" alt=\".NET Core - MassTransit Kullanarak RabbitMQ \u0130le Messaging\" width=\"192\" height=\"260\" \/><\/a>Kod blo\u011funu incelerseniz e\u011fer <em><strong>32.<\/strong><\/em> sat\u0131rda publish edilen message, <em><strong>10.<\/strong><\/em> sat\u0131rda receive edilmektedir. Uygulama derlenip, \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda yandaki g\u00f6rseldeki gibi i\u015flevsellik g\u00f6sterecektir.<\/p>\n<h3>RabbitMQ Nedir?<\/h3>\n<p>Asenkron bir \u015fekilde mesajla\u015fmay\u0131 sa\u011flayan open source mesaj kuyruk sistemidir. Makale s\u00fcreci boyunca RabbitMQ kullan\u0131lacakt\u0131r. Bu sisteme dair bir bilginiz yoksa e\u011fer taraf\u0131mca yaz\u0131lm\u0131\u015f a&#8217;dan z&#8217;ye <a href=\"https:\/\/www.gencayyildiz.com\/blog\/rabbitmq-yazi-dizisi\/\" target=\"_blank\" rel=\"noopener noreferrer\">RabbitMQ Yaz\u0131 Dizisi<\/a>nden faydalanabilirsiniz.<\/p>\n<p>MassTransit ile RabbitMQ kullan\u0131m\u0131n\u0131 \u00f6rneklendirmeden \u00f6nce MassTransit&#8217;in mesaj iletim yollar\u0131n\u0131 bilmekte fayda vard\u0131r. MassTransit <em>Publish<\/em> ve <em>Send<\/em> olmak \u00fczere iki farkl\u0131 yolla mesaj iletiminde bulunmaktad\u0131r.<\/p>\n<ul>\n<li><em style=\"color:purple;\">Publish<\/em><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-3-300x158.png\" alt=\".NET Core - MassTransit Kullanarak RabbitMQ \u0130le Messaging\" width=\"300\" height=\"158\" class=\"alignleft size-medium wp-image-20045\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-3-300x158.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-3-768x404.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-3.png 921w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>Event tabanl\u0131 mesaj iletim y\u00f6ntemidir. \u00d6z\u00fcnde publish-subscribe pattern&#8217;ini uygular. Event publish edildi\u011finde, o event&#8217;e abone olan t\u00fcm queue&#8217;lara mesaj iletilecektir.<br \/>\n&nbsp;<br \/>&nbsp;<br \/>&nbsp;\n<\/li>\n<li><em style=\"color:purple;\">Send<\/em><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-4-300x55.png\" alt=\".NET Core - MassTransit Kullanarak RabbitMQ \u0130le Messaging\" width=\"300\" height=\"55\" class=\"alignleft size-medium wp-image-20046\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-4-300x55.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-4-768x140.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-4.png 915w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>Command(komut) tabanl\u0131 mesaj iletim y\u00f6ntemidir. Hangi kuyru\u011fa mesaj iletimi ger\u00e7ekle\u015ftirilecekse endpoint olarak bildirilmesi gerekir.\n<\/li>\n<\/ul>\n<p><strong>Temel D\u00fczeyde MassTransit K\u00fct\u00fcphanesinin RabbitMQ \u0130le Kullan\u0131m\u0131<\/strong><\/p>\n<blockquote style=\"color:red;\"><p><em>Bu \u00f6rnekte Send fonksiyonu ile mesaj\u0131 Command olarak iletmeyi inceleyece\u011fiz&#8230;<\/em><\/p><\/blockquote>\n<p>MassTransit ile RabbitMQ uygulamas\u0131n\u0131n kullan\u0131labilmesi i\u00e7in ilk olarak ilgili kuyruk sisteminin y\u00fckl\u00fc olmas\u0131 gerekmektedir. Bunun i\u00e7in direkt olarak <a href=\"https:\/\/www.gencayyildiz.com\/blog\/net-core-docker-yazi-dizisi\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker<\/a>&#8216;dan yaralanabilir ve ilgili platform \u00fczerinde aya\u011fa kald\u0131rabilirsiniz. (<span style=\"font-size: 11px;\">\u0130lgili makale i\u00e7in bak\u0131n\u0131z : <a href=\"https:\/\/www.gencayyildiz.com\/blog\/dockerda-rabbitmq-ayaga-kaldirma\/\" target=\"_blank\" rel=\"noopener noreferrer\">Docker\u2019da RabbitMQ Aya\u011fa Kald\u0131rma<\/a><\/span>) Ya da RabbitMQ i\u00e7in cloud&#8217;u tercih edebilir ve <a href=\"https:\/\/www.gencayyildiz.com\/blog\/rabbitmq-cloud-ortamdacloudamqp-kurulumu\/\" target=\"_blank\" rel=\"noopener noreferrer\">CloudAMQP<\/a>&#8216;de bir hesap a\u00e7abilir ve kullanabilirsiniz.<\/p>\n<p>Bizler bu i\u00e7eri\u011fimizde, MassTransit&#8217;i RabbitMQ ile birlikte kullanabilmek i\u00e7in sadece cloud RabbitMQ \u00fczerinden \u00f6rneklendirecek ve ele alaca\u011f\u0131z. \u00d6rneklendirme i\u00e7in yine Console uygulamalar\u0131 kullan\u0131lacakt\u0131r. &#8216;Producer&#8217; ve &#8216;Consumer&#8217; olmak \u00fczere iki farkl\u0131 console uygulamas\u0131 olu\u015fturulmal\u0131 ve her iki uygulamaya <code style=\"color: red;\">dotnet add package MassTransit.RabbitMQ<\/code> komutu e\u015fli\u011finde <a href=\"https:\/\/www.nuget.org\/packages\/MassTransit.RabbitMQ\/\" target=\"_blank\" rel=\"noopener noreferrer\">MassTransit.RabbitMQ<\/a> k\u00fct\u00fcphanesi kurulmal\u0131d\u0131r. Ayr\u0131ca her iki projede de iletilecek mesajlar\u0131n t\u00fcr\u00fcn\u00fc belirtebilmek i\u00e7in &#8216;Shared'(de\u011fi\u015febilir, opsiyoneldir) isimli class library&#8217;nin olu\u015fturulmas\u0131 ve her iki proje taraf\u0131ndan referans edilmesi gerekmektedir. &#8216;Shared&#8217;\u0131n olu\u015fturulma ve illa mesaj t\u00fcr\u00fcn\u00fcn bu katmanda tan\u0131mlanma nedenlerini birka\u00e7 sat\u0131r sonra a\u00e7\u0131klayaca\u011f\u0131m.<\/p>\n<p>\u0130lk olarak &#8216;Shared&#8217; projesinde mesaj t\u00fcr\u00fcn\u00fc tan\u0131mlayarak ba\u015flayal\u0131m :<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-20006\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging.png\" alt=\".NET Core - MassTransit Kullanarak RabbitMQ \u0130le Messaging\" width=\"196\" height=\"122\" \/><\/a><\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public interface IMessage\r\n    {\r\n        string Text { get; set; }\r\n    }\r\n<\/pre>\n<p>\u015eimdi MassTransit i\u00e7erisinde kullan\u0131lacak olan mesaj t\u00fcrlerinin neden bu \u015fekilde farkl\u0131 bir katmanda tan\u0131mland\u0131\u011f\u0131na de\u011finebiliriz. MassTransit, iletilecek olan mesajlar\u0131n t\u00fcr\u00fcn\u00fc tan\u0131mlarken, i\u00e7erisinde metot bar\u0131nd\u0131rmayan ve sadece read-only property imzalar\u0131 bar\u0131nd\u0131ran class yahut interface kullan\u0131lmas\u0131n\u0131 tavsiye eder. Ayr\u0131ca bu t\u00fcrlerin &#8216;Producer&#8217; ve &#8216;Consumer&#8217;lar i\u00e7in ayn\u0131 namespace&#8217;den gelecek \u015fekilde ayarlanmas\u0131 gerekmektedir. Yani &#8216;Shared&#8217;da oldu\u011fu gibi ortak bir projeden referans al\u0131nmas\u0131 kastedilmektedir.<\/p>\n<p>\u0130letilecek mesajlar\u0131n t\u00fcr\u00fcn\u00fc tan\u0131mlad\u0131ktan sonra bu mesajlar\u0131 olu\u015fturacak ve kuyruklara g\u00f6nderecek olan &#8216;Producer&#8217; uygulamas\u0131n\u0131 in\u015fa ederek devam edebiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing MassTransit;\r\nusing Shared;\r\nusing System;\r\nusing System.Security.Authentication;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Producer\r\n{\r\n    public class Message : IMessage\r\n    {\r\n        public string Text { get; set; }\r\n    }\r\n    class Program\r\n    {\r\n        static async Task Main(string&#x5B;] args)\r\n        {\r\n            string rabbitMqUri = &quot;amqps:\/\/wmfjyalu:X0GmitgZM7iXUPmT4uymccexqiTKoxJq@shark.rmq.cloudamqp.com\/wmfjyalu&quot;;\r\n            string queue = &quot;test-queue&quot;;\r\n            string userName = &quot;wmfjyalu&quot;;\r\n            string password = &quot;X0GmitgZM7iXUPmT4uymccexqiTKoxJq&quot;;\r\n\r\n            var bus = Bus.Factory.CreateUsingRabbitMq(factory =&gt;\r\n            {\r\n                factory.Host(rabbitMqUri, configurator =&gt;\r\n                {\r\n                    configurator.Username(userName);\r\n                    configurator.Password(password);\r\n                });\r\n            });\r\n\r\n            var sendToUri = new Uri($&quot;{rabbitMqUri}\/{queue}&quot;);\r\n            var endPoint = await bus.GetSendEndpoint(sendToUri);\r\n\r\n            await Task.Run(async () =&gt;\r\n            {\r\n                while (true)\r\n                {\r\n                    Console.Write(&quot;Mesaj yaz : &quot;);\r\n                    Message message = new Message\r\n                    {\r\n                        Text = Console.ReadLine()\r\n                    };\r\n                    if (message.Text.ToUpper() == &quot;C&quot;)\r\n                        break;\r\n                    await endPoint.Send&lt;IMessage&gt;(message);\r\n                    Console.WriteLine(&quot;&quot;);\r\n                }\r\n            });\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>MassTransit ile &#8216;Producer&#8217;de \u00fcretilen mesaj\u0131 &#8216;Consumer&#8217;a iletmek i\u00e7in <code style=\"color: red; font-size: 12px;\">Send<\/code> fonksiyonunu kullanaca\u011f\u0131z. Send fonksiyonu ilgili mesaj\u0131 nereye iletece\u011fini bilebilmek i\u00e7in bizden bir endpoint istemektedir. Bu endpoint&#8217;te mesaj\u0131n hangi queue&#8217;ya g\u00f6nderilece\u011fi tutulmaktad\u0131r. Dolay\u0131s\u0131yla Send fonksiyonu hangi kuyru\u011fa mesaj g\u00f6nderece\u011fini bildi\u011fi i\u00e7in bir command olarak iletecek, o \u015fekilde i\u015flevsellik g\u00f6sterecektir. Dolay\u0131s\u0131yla yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer <strong><em>31.<\/em><\/strong> sat\u0131rda ilgili kuyru\u011fun uri&#8217;si olu\u015fturulmakta ve <strong><em>32.<\/em><\/strong> sat\u0131rda ise &#8216;bus&#8217; \u00fczerinden &#8216;GetSendEndpoint&#8217; fonksiyonu ile ilgili uri&#8217;ye kar\u015f\u0131l\u0131k endpoint elde edilmektedir. <strong><em>45.<\/em><\/strong> sat\u0131rda ise ilgili endpoint \u00fczerinden Send fonksiyonu \u00e7a\u011fr\u0131lmakta ve IMessage interface&#8217;i t\u00fcr\u00fcnden mesaj nesnesi g\u00f6nderilmektedir. <strong><em>9.<\/em><\/strong> sat\u0131ra g\u00f6z atarsan\u0131z e\u011fer iletiyi g\u00f6nderecek olan &#8216;Message&#8217; s\u0131n\u0131f\u0131 &#8216;Shared&#8217; katman\u0131ndaki &#8216;IMessage&#8217;dan t\u00fcreyecek \u015fekilde in\u015fa edilmekte ve message instance&#8217;i ilgili aray\u00fcz t\u00fcr\u00fcnden de\u011fer alan Send fonksiyonuna parametre olarak verilmektedir.<\/p>\n<p>\u015eimdi s\u0131ra &#8216;Consumer&#8217;\u0131 geli\u015ftirmeye gelmi\u015ftir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing MassTransit;\r\nusing Shared;\r\nusing System;\r\nusing System.Security.Authentication;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Consumer\r\n{\r\n    public class Message : IMessage\r\n    {\r\n        public string Text { get; set; }\r\n    }\r\n    public class MessageConsumer : IConsumer&lt;IMessage&gt;\r\n    {\r\n        public async Task Consume(ConsumeContext&lt;IMessage&gt; context)\r\n            =&gt; Console.WriteLine($&quot;Gelen mesaj : {context.Message.Text}&quot;);\r\n    }\r\n    class Program\r\n    {\r\n        static async Task Main(string&#x5B;] args)\r\n        {\r\n            string rabbitMqUri = &quot;amqps:\/\/wmfjyalu:X0GmitgZM7iXUPmT4uymccexqiTKoxJq@shark.rmq.cloudamqp.com\/wmfjyalu&quot;;\r\n            string queue = &quot;test-queue&quot;;\r\n\r\n            string userName = &quot;wmfjyalu&quot;;\r\n            string password = &quot;X0GmitgZM7iXUPmT4uymccexqiTKoxJq&quot;;\r\n\r\n            var bus = Bus.Factory.CreateUsingRabbitMq(factory =&gt;\r\n            {\r\n                factory.Host(rabbitMqUri, configurator =&gt;\r\n                {\r\n                    configurator.Username(userName);\r\n                    configurator.Password(password);\r\n                });\r\n\r\n                factory.ReceiveEndpoint(queue, endpoint =&gt; endpoint.Consumer&lt;MessageConsumer&gt;());\r\n            });\r\n            await bus.StartAsync();\r\n            Console.ReadLine();\r\n            await bus.StopAsync();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>&#8216;Consumer&#8217;, &#8216;Producer&#8217;\u0131n kuyru\u011fa att\u0131\u011f\u0131 mesajlar\u0131 &#8216;IConsumer&#8217;dan t\u00fcreyen bir nesneyle kar\u015f\u0131lamak zorundad\u0131r. Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer <strong><em>36.<\/em><\/strong> sat\u0131rda &#8216;ReceiveEndpoint&#8217; metodu ile kuyruk dinlenmekte ve <code>endpoint.Consumer&lt;MessageConsumer>()<\/code>\u00a0komutu ile gelen mesaj &#8216;MessageConsumer&#8217; ile kar\u015f\u0131lanmaktad\u0131r. <strong><em>13.<\/em><\/strong> sat\u0131ra bakarsan\u0131z e\u011fer &#8216;MessageConsumer&#8217; biraz \u00f6nce bahsedildi\u011fi gibi &#8216;IConsumer&#8217; aray\u00fcz\u00fcn\u00fc uygulamakta ve generic olarak yine &#8216;Shared&#8217;da ki &#8216;IMessage&#8217;dan t\u00fcremi\u015f &#8216;Message&#8217; type&#8217;\u0131n\u0131 kullanmaktad\u0131r. Burada ilgili aray\u00fcz\u00fcn implemente ettirdi\u011fi &#8216;Consume&#8217; fonksiyonu kuyruktan gelecek olan mesaj\u0131 elde etmemizi sa\u011flayacak olan fonksiyondur.<\/p>\n<p>Bu geli\u015ftirmelerden sonra uygulamalar\u0131 derleyip, aya\u011fa kald\u0131rd\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki gibi bir i\u015flevsellik s\u00f6z konusu olacakt\u0131r.<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-1.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-1.gif\" alt=\".NET Core - MassTransit Kullanarak RabbitMQ \u0130le Messaging\" width=\"800\" height=\"855\" class=\"aligncenter size-full wp-image-20027\" \/><\/a>Yukar\u0131da g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere MassTransit birbirinden ba\u011f\u0131ms\u0131z iki uygulama aras\u0131nda RabbitMQ \u00fczerinden kolayca ileti\u015fim kurmam\u0131z\u0131 sa\u011flamaktad\u0131r. Burada t\u00fcm y\u00f6netimi \u00fcstlenmekte ve gerekli iletimsel aray\u00fcz\u00fc uygulamaktad\u0131r. Bunu anlayabilmek i\u00e7in RabbitMQ cloud&#8217;a g\u00f6z at\u0131lmas\u0131 yeterli olacakt\u0131r.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-1.png\" alt=\".NET Core - MassTransit Kullanarak RabbitMQ \u0130le Messaging\" width=\"756\" height=\"400\" class=\"aligncenter size-full wp-image-20033\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-1.png 756w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-1-300x159.png 300w\" sizes=\"auto, (max-width: 756px) 100vw, 756px\" \/><\/a>Mesaj iletimleri i\u00e7in ismi belirtilen queue ad\u0131nda(test-queue) bir kuyruk olu\u015fturmu\u015f ve<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-2.png\" alt=\".NET Core - MassTransit Kullanarak RabbitMQ \u0130le Messaging\" width=\"524\" height=\"468\" class=\"aligncenter size-full wp-image-20034\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-2.png 524w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-2-300x268.png 300w\" sizes=\"auto, (max-width: 524px) 100vw, 524px\" \/><\/a>mesajlar\u0131 y\u00f6netmek i\u00e7in de birka\u00e7 exchange(MassTransit default olarak Fanout exchange kullanmaktad\u0131r) dahi olu\u015fturmu\u015f ve t\u00fcm bunlar\u0131 bizim yerimize otomatik olarak ger\u00e7ekle\u015ftirmi\u015ftir. <\/p>\n<p><strong>Temel D\u00fczeyde MassTransit K\u00fct\u00fcphanesinin RabbitMQ \u0130le Kullan\u0131m\u0131 &#8211; 2<\/strong><\/p>\n<blockquote style=\"color:red;\"><p><em>Bu \u00f6rnekte Publish fonksiyonu ile mesaj\u0131 Event olarak iletmeyi inceleyece\u011fiz&#8230;<\/em><\/p><\/blockquote>\n<p>MassTransit ile RabbitMQ kullan\u0131rken ayriyetten Publish fonksiyonuyla t\u00fcm kuyruklara mesaj iletebilmekteyiz. Bu fonksiyon ile MassTransit, var olan kuyruklar\u0131n hepsine abone olan bir veya birden fazla consumer&#8217;lara mesaj\u0131 iletebilmek i\u00e7in publish neticesinde bir event f\u0131rlatmaktad\u0131r ve bu event&#8217;a subscribe olan t\u00fcm consumer&#8217;lar ilgili mesaj\u0131n g\u00f6nderildi\u011fine dair bilgilendirilmi\u015f olacakt\u0131r. Haliyle MassTransit bu y\u00f6ntemde &#8216;<em>Siz bizi aramay\u0131n, biz sizi arar\u0131z!<\/em>&#8216; desturuyla yola \u00e7\u0131kmakta ve b\u00f6ylece <em>Inversion of Control<\/em> ve <em>Dependency Injection<\/em> prensiplerini uygulamaktad\u0131r.<\/p>\n<p>Olay\u0131 pratik olarak ele al\u0131rsak e\u011fer birden fazla farkl\u0131 kuyru\u011fa ba\u011fl\u0131 olan &#8216;Consumer1&#8217;, &#8216;Consumer2&#8217; ve &#8216;Consumer3&#8217; uygulamalar\u0131 oldu\u011funu d\u00fc\u015f\u00fcnelim ve bunlara publish ile mesaj iletisinde bulunan bir &#8216;Producer&#8217; uygulamas\u0131 oldu\u011funu varsayal\u0131m.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-5.png\" alt=\"\" width=\"176\" height=\"149\" class=\"alignleft size-full wp-image-20060\" \/><\/a>Tabi s\u00fcre\u00e7te t\u00fcm uygulamalarda ortak veri t\u00fcr\u00fcn\u00fc temsil edecek olan &#8216;IMessage&#8217; aray\u00fcz\u00fcn\u00fcn t\u00fcm uygulamalardan eri\u015filebilir olmas\u0131 i\u00e7in &#8216;Shared&#8217; katman\u0131n\u0131da unutmayal\u0131m. Bu katman bir \u00f6nceki &#8216;Send&#8217; \u00f6rneklendirmesindekiyle birebir ayn\u0131 amaca hizmet etmektedir ve iletilecek mesaj t\u00fcr\u00fcn\u00fcn sadece tek bir namespace alt\u0131nda olmas\u0131n\u0131 ve uygulamalarda bu ortak noktadan referans edilmesini sa\u011flamaktad\u0131r. Hat\u0131rlarsan\u0131z MassTransit uygulamas\u0131nda mesaj t\u00fcr\u00fcne dair bu durumun \u00f6nemli oldu\u011funa \u00f6nceden de\u011finmi\u015f ve aksi halde mesaj iletimi \u00fczerinde problem ya\u015fanaca\u011f\u0131n\u0131 ifade etmi\u015ftik.<\/p>\n<p>\u015eimdi gelin consumer&#8217;lar\u0131 s\u0131rayla kodlayal\u0131m ve en son producer&#8217;\u0131 ele alal\u0131m.<\/p>\n<p>&#8216;Consumer1&#8217;;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing MassTransit;\r\nusing Shared;\r\nusing System;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Consumer1\r\n{\r\n    public class Message : IMessage\r\n    {\r\n        public string Text { get; set; }\r\n    }\r\n    public class MessageConsumer : IConsumer&lt;IMessage&gt;\r\n    {\r\n        public async Task Consume(ConsumeContext&lt;IMessage&gt; context)\r\n            =&gt; Console.WriteLine($&quot;test-queue-1 Gelen mesaj : {context.Message.Text}&quot;);\r\n    }\r\n    class Program\r\n    {\r\n        static async Task Main(string&#x5B;] args)\r\n        {\r\n            string rabbitMqUri = &quot;amqps:\/\/wmfjyalu:X0GmitgZM7iXUPmT4uymccexqiTKoxJq@shark.rmq.cloudamqp.com\/wmfjyalu&quot;;\r\n            string queue = &quot;test-queue-1&quot;;\r\n\r\n            string userName = &quot;wmfjyalu&quot;;\r\n            string password = &quot;X0GmitgZM7iXUPmT4uymccexqiTKoxJq&quot;;\r\n\r\n            var bus = Bus.Factory.CreateUsingRabbitMq(factory =&gt;\r\n            {\r\n                factory.Host(rabbitMqUri, configurator =&gt;\r\n                {\r\n                    configurator.Username(userName);\r\n                    configurator.Password(password);\r\n                });\r\n\r\n                factory.ReceiveEndpoint(queue, endpoint =&gt; endpoint.Consumer&lt;MessageConsumer&gt;());\r\n            });\r\n            await bus.StartAsync();\r\n            Console.ReadLine();\r\n            await bus.StopAsync();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>&#8216;Consumer1&#8217;in i\u00e7eri\u011fine g\u00f6z atarsan\u0131z e\u011fer &#8216;test-queue-1&#8217; isimli bir kuyru\u011fu dinlemektedir. Ayr\u0131ca gelecek mesajlar\u0131 kar\u015f\u0131layaca\u011f\u0131 &#8216;Message&#8217; nesnesi &#8216;Shared&#8217; katman\u0131ndaki &#8216;IMassage&#8217;dan t\u00fcremi\u015ftir. Bu operasyonu t\u00fcm consumer&#8217;lar i\u00e7in ve hatta product i\u00e7in yapaca\u011f\u0131m\u0131z\u0131 \u00f6nceden oldu\u011fu gibi son kez tekrar ediyorum.<\/p>\n<p>&#8216;Consumer2&#8217;;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing MassTransit;\r\nusing Shared;\r\nusing System;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Consumer2\r\n{\r\n    public class Message : IMessage\r\n    {\r\n        public string Text { get; set; }\r\n    }\r\n    public class MessageConsumer : IConsumer&lt;IMessage&gt;\r\n    {\r\n        public async Task Consume(ConsumeContext&lt;IMessage&gt; context)\r\n            =&gt; Console.WriteLine($&quot;test-queue-2 Gelen mesaj : {context.Message.Text}&quot;);\r\n    }\r\n    class Program\r\n    {\r\n        static async Task Main(string&#x5B;] args)\r\n        {\r\n            string rabbitMqUri = &quot;amqps:\/\/wmfjyalu:X0GmitgZM7iXUPmT4uymccexqiTKoxJq@shark.rmq.cloudamqp.com\/wmfjyalu&quot;;\r\n            string queue = &quot;test-queue-2&quot;;\r\n\r\n            string userName = &quot;wmfjyalu&quot;;\r\n            string password = &quot;X0GmitgZM7iXUPmT4uymccexqiTKoxJq&quot;;\r\n\r\n            var bus = Bus.Factory.CreateUsingRabbitMq(factory =&gt;\r\n            {\r\n                factory.Host(rabbitMqUri, configurator =&gt;\r\n                {\r\n                    configurator.Username(userName);\r\n                    configurator.Password(password);\r\n                });\r\n\r\n                factory.ReceiveEndpoint(queue, endpoint =&gt; endpoint.Consumer&lt;MessageConsumer&gt;());\r\n            });\r\n            await bus.StartAsync();\r\n            Console.ReadLine();\r\n            await bus.StopAsync();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>&#8216;Consumer2&#8217; ise &#8216;test-queue-2&#8217; isimli kuyru\u011fu dinlemektedir.<\/p>\n<p>&#8216;Consumer3&#8217;;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing MassTransit;\r\nusing Shared;\r\nusing System;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Consumer3\r\n{\r\n    public class Message : IMessage\r\n    {\r\n        public string Text { get; set; }\r\n    }\r\n    public class MessageConsumer : IConsumer&lt;IMessage&gt;\r\n    {\r\n        public async Task Consume(ConsumeContext&lt;IMessage&gt; context)\r\n            =&gt; Console.WriteLine($&quot;test-queue-3 Gelen mesaj : {context.Message.Text}&quot;);\r\n    }\r\n    class Program\r\n    {\r\n        static async Task Main(string&#x5B;] args)\r\n        {\r\n            string rabbitMqUri = &quot;amqps:\/\/wmfjyalu:X0GmitgZM7iXUPmT4uymccexqiTKoxJq@shark.rmq.cloudamqp.com\/wmfjyalu&quot;;\r\n            string queue = &quot;test-queue-3&quot;;\r\n\r\n            string userName = &quot;wmfjyalu&quot;;\r\n            string password = &quot;X0GmitgZM7iXUPmT4uymccexqiTKoxJq&quot;;\r\n\r\n            var bus = Bus.Factory.CreateUsingRabbitMq(factory =&gt;\r\n            {\r\n                factory.Host(rabbitMqUri, configurator =&gt;\r\n                {\r\n                    configurator.Username(userName);\r\n                    configurator.Password(password);\r\n                });\r\n\r\n                factory.ReceiveEndpoint(queue, endpoint =&gt; endpoint.Consumer&lt;MessageConsumer&gt;());\r\n            });\r\n            await bus.StartAsync();\r\n            Console.ReadLine();\r\n            await bus.StopAsync();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>ve sonuncu consumer&#8217;\u0131m\u0131z da &#8216;test-queue-3&#8217; isimli kuyru\u011fu dinlemektedir. Burada consumer say\u0131s\u0131 s\u0131n\u0131rs\u0131z bir \u015fekilde artt\u0131r\u0131labilir. Ya da ilgili kuyruk isimleri parametre olarak al\u0131n\u0131p, bir uygulaman\u0131n birden fazla instance&#8217;\u0131nda farkl\u0131 kuyruk isimlerini dinleyecekleri \u015fekilde aya\u011fada kald\u0131r\u0131labilir. Amma velakin ben burada fiziksel olarak \u00fc\u00e7 farkl\u0131 uygulama \u00fczerinden \u00f6rneklendirmeyi yeterli g\u00f6rmekteyim. Art\u0131k bu consumer&#8217;lara gerekli mesajlar\u0131 iletecek olan producer&#8217;\u0131 ele alabiliriz.<\/p>\n<p>&#8216;Producer&#8217;;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing MassTransit;\r\nusing Shared;\r\nusing System;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Producer\r\n{\r\n    public class Message : IMessage\r\n    {\r\n        public string Text { get; set; }\r\n    }\r\n    class Program\r\n    {\r\n        static async Task Main(string&#x5B;] args)\r\n        {\r\n            string rabbitMqUri = &quot;amqps:\/\/wmfjyalu:X0GmitgZM7iXUPmT4uymccexqiTKoxJq@shark.rmq.cloudamqp.com\/wmfjyalu&quot;;\r\n            string queue = &quot;test-queue&quot;;\r\n            string userName = &quot;wmfjyalu&quot;;\r\n            string password = &quot;X0GmitgZM7iXUPmT4uymccexqiTKoxJq&quot;;\r\n\r\n            var bus = Bus.Factory.CreateUsingRabbitMq(factory =&gt;\r\n            {\r\n                factory.Host(rabbitMqUri, configurator =&gt;\r\n                {\r\n                    configurator.Username(userName);\r\n                    configurator.Password(password);\r\n                });\r\n            });\r\n\r\n            await Task.Run(async () =&gt;\r\n            {\r\n                while (true)\r\n                {\r\n                    Console.Write(&quot;Mesaj yaz : &quot;);\r\n                    Message message = new Message\r\n                    {\r\n                        Text = Console.ReadLine()\r\n                    };\r\n                    if (message.Text.ToUpper() == &quot;C&quot;)\r\n                        break;\r\n                    await bus.Publish&lt;IMessage&gt;(message);\r\n                    Console.WriteLine(&quot;&quot;);\r\n                }\r\n            });\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>&#8216;Producer&#8217; uygulamas\u0131 g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere <strong><em>41.<\/em><\/strong> sat\u0131rda &#8216;IMessage&#8217; t\u00fcr\u00fcnden iletiyi &#8216;Publish&#8217; etmektedir. Dikkat ederseniz publish esnas\u0131nda ne bir kuyruk ad\u0131 bildirilmekte ne de herhangi bir endpoint tan\u0131mlamas\u0131 yap\u0131lmaktad\u0131r. Publish, davran\u0131\u015fsal olarak sistemdeki t\u00fcm kuyruklara gerekli mesajlar\u0131 iletmek i\u00e7in vard\u0131r. Publish neticesinde f\u0131rlat\u0131lacak event&#8217;a subscribe olan t\u00fcm consumer&#8217;lar mesajlar\u0131 ilgili kuyruklardan t\u00fcketebilecek ve b\u00f6ylece bu operasyon MassTransit sayesinde efektif bir \u015fekilde y\u00fcr\u00fct\u00fclm\u00fc\u015f olacakt\u0131r.<\/p>\n<p>Geli\u015ftirme a\u015famas\u0131ndan sonra uygulamalar\u0131 derleyip, \u00e7al\u0131\u015ft\u0131r\u0131rsak e\u011fer;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-2.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-2.gif\" alt=\".NET Core - MassTransit Kullanarak RabbitMQ \u0130le Messaging\" width=\"800\" height=\"520\" class=\"aligncenter size-full wp-image-20069\" \/><\/a>uygulamalar\u0131n ba\u015far\u0131l\u0131 bir \u015fekilde mesaj tabanl\u0131 ileti\u015fim kurdu\u011funu g\u00f6zlemleyebilmekteyiz.<\/p>\n<p>Publish neticesinde RabbitMQ cloud&#8217;una g\u00f6z atarsak e\u011fer;<\/p>\n<table>\n<thead>\n<tr>\n<th>Queue<\/th>\n<th>Exchanges<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-6.png\" alt=\".NET Core - MassTransit Kullanarak RabbitMQ \u0130le Messaging\" width=\"474\" height=\"361\" class=\"aligncenter size-full wp-image-20073\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-6.png 474w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-6-300x228.png 300w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/><\/a><\/td>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-7.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-7.png\" alt=\".NET Core - MassTransit Kullanarak RabbitMQ \u0130le Messaging\" width=\"489\" height=\"509\" class=\"aligncenter size-full wp-image-20074\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-7.png 489w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-7-288x300.png 288w\" sizes=\"auto, (max-width: 489px) 100vw, 489px\" \/><\/a><\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\">\ng\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere ilgili kuyruklar ve gerekli exchanges&#8217;ler MassTransit sayesinde otomatik olarak olu\u015fturulmaktad\u0131r.\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Birden Fazla Farkl\u0131 T\u00fcrde Mesaj G\u00f6nderme<\/strong><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-8.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-8.png\" alt=\".NET Core - MassTransit Kullanarak RabbitMQ \u0130le Messaging\" width=\"169\" height=\"94\" class=\"alignleft size-full wp-image-20078\" \/><\/a>Producer, consumer&#8217;lara birden fazla farkl\u0131 t\u00fcrlerde mesajlarda iletmek isteyebilir. B\u00f6yle bir durumda bu mesajlar\u0131n t\u00fcrleri yandaki gibi &#8216;Shared&#8217; katman\u0131nda modellenmeli ve operasyonel olarak a\u015fa\u011f\u0131daki gibi i\u015flem ger\u00e7ekle\u015ftirilmelidir :<br \/>\n&#8216;Producer&#8217;;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing MassTransit;\r\nusing Shared;\r\nusing System;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Producer\r\n{\r\n    public class MessageA : IMessageA\r\n    {\r\n        public string Text { get; set; }\r\n    }\r\n    public class MessageB : IMessageB\r\n    {\r\n        public string Text { get; set; }\r\n    }\r\n    public class MessageC : IMessageC\r\n    {\r\n        public string Text { get; set; }\r\n    }\r\n    class Program\r\n    {\r\n        static async Task Main(string&#x5B;] args)\r\n        {\r\n            string rabbitMqUri = &quot;amqps:\/\/wmfjyalu:X0GmitgZM7iXUPmT4uymccexqiTKoxJq@shark.rmq.cloudamqp.com\/wmfjyalu&quot;;\r\n            string queue = &quot;test-queue&quot;;\r\n            string userName = &quot;wmfjyalu&quot;;\r\n            string password = &quot;X0GmitgZM7iXUPmT4uymccexqiTKoxJq&quot;;\r\n\r\n            var bus = Bus.Factory.CreateUsingRabbitMq(factory =&gt;\r\n            {\r\n                factory.Host(rabbitMqUri, configurator =&gt;\r\n                {\r\n                    configurator.Username(userName);\r\n                    configurator.Password(password);\r\n                });\r\n            });\r\n\r\n            await bus.Publish&lt;IMessageA&gt;(new MessageA { Text = &quot;mesaj a&quot; });\r\n            await bus.Publish&lt;IMessageB&gt;(new MessageB { Text = &quot;mesaj b&quot; });\r\n            await bus.Publish&lt;IMessageC&gt;(new MessageC { Text = &quot;mesaj c&quot; });\r\n\r\n            Console.WriteLine(&quot;Mesajlar g\u00f6nderilmi\u015ftir.&quot;);\r\n\r\n            Console.Read();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Her bir farkl\u0131 t\u00fcrdeki mesaj ayr\u0131 ayr\u0131 publish edilmelidir. Tabi burada Send fonksiyonuda tercih edilebilir.<\/p>\n<p>&#8216;Consumer&#8217;;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing MassTransit;\r\nusing Shared;\r\nusing System;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace Consumer\r\n{\r\n    public class MessageA : IMessageA\r\n    {\r\n        public string Text { get; set; }\r\n    }\r\n    public class MessageAConsumer : IConsumer&lt;IMessageA&gt;\r\n    {\r\n        public async Task Consume(ConsumeContext&lt;IMessageA&gt; context)\r\n            =&gt; Console.WriteLine($&quot;Gelen mesaj : {context.Message.Text}&quot;);\r\n    }\r\n    public class MessageB : IMessageB\r\n    {\r\n        public string Text { get; set; }\r\n    }\r\n    public class MessageBConsumer : IConsumer&lt;IMessageB&gt;\r\n    {\r\n        public async Task Consume(ConsumeContext&lt;IMessageB&gt; context)\r\n            =&gt; Console.WriteLine($&quot;Gelen mesaj : {context.Message.Text}&quot;);\r\n    }\r\n    public class MessageC : IMessageC\r\n    {\r\n        public string Text { get; set; }\r\n    }\r\n    public class MessageCConsumer : IConsumer&lt;IMessageC&gt;\r\n    {\r\n        public async Task Consume(ConsumeContext&lt;IMessageC&gt; context)\r\n            =&gt; Console.WriteLine($&quot;Gelen mesaj : {context.Message.Text}&quot;);\r\n    }\r\n    class Program\r\n    {\r\n        static async Task Main(string&#x5B;] args)\r\n        {\r\n            string rabbitMqUri = &quot;amqps:\/\/wmfjyalu:X0GmitgZM7iXUPmT4uymccexqiTKoxJq@shark.rmq.cloudamqp.com\/wmfjyalu&quot;;\r\n            string queue = &quot;test-queue-1&quot;;\r\n\r\n            string userName = &quot;wmfjyalu&quot;;\r\n            string password = &quot;X0GmitgZM7iXUPmT4uymccexqiTKoxJq&quot;;\r\n\r\n            var bus = Bus.Factory.CreateUsingRabbitMq(factory =&gt;\r\n            {\r\n                factory.Host(rabbitMqUri, configurator =&gt;\r\n                {\r\n                    configurator.Username(userName);\r\n                    configurator.Password(password);\r\n                });\r\n\r\n                factory.ReceiveEndpoint(queue, endpoint =&gt;\r\n                {\r\n                    endpoint.Consumer&lt;MessageAConsumer&gt;();\r\n                    endpoint.Consumer&lt;MessageBConsumer&gt;();\r\n                    endpoint.Consumer&lt;MessageCConsumer&gt;();\r\n                });\r\n            });\r\n            await bus.StartAsync();\r\n            Console.ReadLine();\r\n            await bus.StopAsync();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>consumer ise t\u00fcm t\u00fcrlere kar\u015f\u0131l\u0131k birer nesne kal\u0131tmal\u0131(MessageA, MessageB, MessageC) ve bunlar\u0131n &#8216;IConsumer&#8217; s\u0131n\u0131flar\u0131n\u0131(MessageAConsumer, MessageBConsumer, MessageCConsumer) olu\u015fturmal\u0131d\u0131r. <strong><em>55 &#8211; 57.<\/em><\/strong> sat\u0131r aral\u0131\u011f\u0131na g\u00f6z atarsan\u0131z e\u011fer ilgili kuyru\u011fa gelen farkl\u0131 t\u00fcrlerdeki t\u00fcm mesajlar kar\u015f\u0131lanmakta ve t\u00fcr\u00fcne g\u00f6re ilgili &#8216;IConsumer&#8217; t\u00fcrevi s\u0131n\u0131f tetiklenmektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-9.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-9.png\" alt=\".NET Core - MassTransit Kullanarak RabbitMQ \u0130le Messaging\" width=\"346\" height=\"177\" class=\"aligncenter size-full wp-image-20082\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-9.png 346w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/NET-Core-MassTransit-Kullanarak-RabbitMQ-Ile-Messaging-9-300x153.png 300w\" sizes=\"auto, (max-width: 346px) 100vw, 346px\" \/><\/a>Tabi burada gelen mesajlar\u0131n t\u00fcrlerini a\u015fa\u011f\u0131daki gibi farkl\u0131 varyasyonlarla da ay\u0131rt edebilmekteyiz :<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n                .\r\n                .\r\n                .\r\n                factory.ReceiveEndpoint(queue, endpoint =&gt;\r\n                {\r\n                    endpoint.Consumer&lt;MessageAConsumer&gt;();\r\n                    endpoint.Consumer(() =&gt; new MessageBConsumer());\r\n                    endpoint.Consumer(typeof(MessageCConsumer), type =&gt; Activator.CreateInstance(type));\r\n                });\r\n                .\r\n                .\r\n                .\r\n<\/pre>\n<p>\u0130stedi\u011finiz varyasyonu kullanabilirsiniz. Hepsi farkl\u0131 y\u00f6ntemle lakin ayn\u0131 mahiyette i\u015flevsellik g\u00f6steren mesaj al\u0131c\u0131 overload&#8217;lard\u0131r.<\/p>\n<p><strong>A\u015f\u0131r\u0131 Yo\u011funluktan Kilitlenme\/Deadlock Durumlar\u0131na Kar\u015f\u0131 \u00d6nlem Alma<\/strong><br \/>\n\u015eu ana kadar MassTransit&#8217;in bizim yerimize channel, exchange, queue vs. gibi ileti\u015fim s\u00fcre\u00e7lerini otomatik olarak y\u00f6netti\u011fini g\u00f6zlemlemi\u015f olduk. T\u00fcm bunlar\u0131n yan\u0131nda, \u00e7al\u0131\u015fma zarf\u0131nda a\u015f\u0131r\u0131 yo\u011funluktan bir deadlock olu\u015ftu\u011funu ve sistemin durdu\u011funu varsayarsak, <em>b\u00f6yle bir durumda nas\u0131l bir aksiyon alaca\u011f\u0131m\u0131z\u0131?<\/em> d\u00fc\u015f\u00fcnelim ve gelin bunu sorgulayal\u0131m&#8230;\ud83d\ude12Tamam panik yapmay\u0131n. Bu durumu sorgulamaya gerek kalmaks\u0131z\u0131n MassTransit bizim yerimize \u00e7\u00f6z\u00fcm getirmekte ve b\u00fcnyesinde dahili olarak bir <em>CircuitBreaker<\/em> bar\u0131nd\u0131rmaktad\u0131r.\ud83d\ude01<\/p>\n<p>&#8216;CircuitBreaker&#8217;\u0131 olas\u0131 herhangi bir kesintiye kar\u015f\u0131 consumer&#8217;lar da kullanmam\u0131z icap edecektir. Bu duruma \u00f6rnek olarak a\u015fa\u011f\u0131daki herhangi bir consumer&#8217;a kar\u015f\u0131l\u0131k gelen kodu ele alabiliriz :<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            .\r\n            .\r\n            .\r\n            var bus = Bus.Factory.CreateUsingRabbitMq(factory =&gt;\r\n            {\r\n                factory.Host(rabbitMqUri, configurator =&gt;\r\n                {\r\n                    configurator.Username(userName);\r\n                    configurator.Password(password);\r\n                });\r\n\r\n                factory.ReceiveEndpoint(queue, endpoint =&gt; endpoint.Consumer&lt;MessageConsumer&gt;());\r\n                factory.UseCircuitBreaker(configurator =&gt;\r\n                {\r\n                    configurator.TrackingPeriod = TimeSpan.FromMinutes(1);\r\n                    configurator.TripThreshold = 15;\r\n                    configurator.ActiveThreshold = 10;\r\n                    configurator.ResetInterval = TimeSpan.FromMinutes(5);\r\n                });\r\n            });\r\n            .\r\n            .\r\n            .\r\n<\/pre>\n<p>Yukar\u0131daki &#8216;CircuitBreaker&#8217; konfig\u00fcrasyonunu incelerseniz e\u011fer;<\/p>\n<ul>\n<li><em style=\"color:orange;\">TrackingPeriod<\/em><br \/>\nHata durumlar\u0131ndan sonra ne kadar s\u00fcre takipte kal\u0131naca\u011f\u0131n\u0131 ifade etmektedir.\n<\/li>\n<li><em style=\"color:orange;\">TripThreshold<\/em><br \/>\nAl\u0131nan taleplerin y\u00fczdelik olarak ne kadar\u0131n\u0131n hatal\u0131 olaca\u011f\u0131n\u0131 ifade etmektedir.\n<\/li>\n<li><em style=\"color:orange;\">ActiveThreshold<\/em><br \/>\n\u00dcst \u00fcste al\u0131nabilecek hata say\u0131s\u0131n\u0131 ifade etmektedir.\n<\/li>\n<li><em style=\"color:orange;\">ResetInterval<\/em><br \/>\nHata al\u0131nd\u0131\u011f\u0131nda ne kadar s\u00fcre beklenmesi gerekti\u011fini ifade etmektedir.\n<\/li>\n<\/ul>\n<p>Dolay\u0131s\u0131yla bu yap\u0131lanmalardan \u015f\u00f6yle bir davran\u0131\u015fsal durum ortaya \u00e7\u0131kmaktad\u0131r; Al\u0131nan taleplerin %15&#8217;inin hatal\u0131 olmas\u0131(TripThreshold) yahut art arda 10 adedinin hatal\u0131 gelmesi(ActiveThreshold) durumunda, sistem 5dk bekleyecek(ResetInterval) ve bu bekleyi\u015ften sonra 1dk boyunca takipte kal\u0131nacak(TrackingPeriod) ve e\u011fer birdaha hata s\u00f6z konusu olursa &#8216;TripThreshold&#8217; ve &#8216;ActiveThreshold&#8217; limitlerini beklemeksizin direkt olarak 5 dk s\u00fcre ile beklemeye ge\u00e7ecektir(ResetInterval). Ve d\u00f6ng\u00fc bundan sonra bu \u015fekilde devam edecektir.<\/p>\n<p><strong>Olur Olmaz Kesintilere Kar\u015f\u0131 \u00d6nlem Alma<\/strong><br \/>\nUygulamalarla yahut servislerle olan ba\u011flant\u0131lar\u0131n kopma durumlar\u0131nda MassTransit mesaj kay\u0131plar\u0131na izin vermemekte ve ilgili mesajlar\u0131 queue ak\u0131\u015f\u0131n\u0131 bozmamak i\u00e7in <code>-hata al\u0131nan queue-.error<\/code> ad\u0131nda bir kuyruk olu\u015fturup buraya ta\u015f\u0131maktad\u0131r. Haliyle bu kesintiler kal\u0131c\u0131 olmay\u0131p, ge\u00e7ici olaca\u011f\u0131ndan dolay\u0131 taraf\u0131m\u0131zca belirtilen bir miktar ve aral\u0131kta yeniden mesajlar\u0131 i\u015flemesini isteyebiliriz. B\u00f6yle bir durumda retry pattern&#8217;\u0131 benimsemi\u015f olan &#8216;UseMessageRetry&#8217; extension fonksiyonunu kullanabiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            .\r\n            .\r\n            .\r\n            var bus = Bus.Factory.CreateUsingRabbitMq(factory =&gt;\r\n            {\r\n                factory.Host(rabbitMqUri, configurator =&gt;\r\n                {\r\n                    configurator.Username(userName);\r\n                    configurator.Password(password);\r\n                });\r\n\r\n                factory.ReceiveEndpoint(queue, endpoint =&gt; endpoint.Consumer&lt;MessageConsumer&gt;());\r\n                factory.UseMessageRetry(r =&gt; r.Immediate(5));\r\n            });\r\n            .\r\n            .\r\n            .\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere consumer taraf\u0131nda &#8216;UseMessageRetry&#8217; ile yap\u0131lan kontrolde &#8216;Immediate&#8217; fonksiyonu ile 5 defa denemesini istemekteyiz. E\u011fer ki, hata al\u0131nan kuyruktaki mesaj bu denemelerde de i\u015flenemeyip, hata devam ederse tekrar ilgili .error kuyru\u011funa at\u0131l\u0131p bir sonraki denemeyi bekleyecektir.<\/p>\n<p><strong>Belirli Bir S\u00fcre \u0130\u00e7erisinde \u0130\u015flenecek Mesaj Adedini Belirleme<\/strong><br \/>\nBazende MassTransit ile belirli bir s\u00fcre i\u00e7erisinde i\u015flenecek mesaj adedini belirtmek isteyebiliriz. \u0130\u015fte bu durumda da &#8216;RateLimit&#8217; fonksiyonu imdad\u0131m\u0131za yeti\u015fmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            .\r\n            .\r\n            .\r\n            var bus = Bus.Factory.CreateUsingRabbitMq(factory =&gt;\r\n            {\r\n                factory.Host(rabbitMqUri, configurator =&gt;\r\n                {\r\n                    configurator.Username(userName);\r\n                    configurator.Password(password);\r\n                });\r\n\r\n                factory.ReceiveEndpoint(queue, endpoint =&gt; endpoint.Consumer&lt;MessageConsumer&gt;());\r\n                factory.UseRateLimit(1000, TimeSpan.FromMinutes(1));\r\n            });\r\n            .\r\n            .\r\n            .\r\n<\/pre>\n<p>Yukar\u0131da g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere ilgili servis, 1 dk i\u00e7erisinde 1000 request yapabilecek \u015fekilde s\u0131n\u0131rland\u0131r\u0131lm\u0131\u015ft\u0131r.<\/p>\n<p>Nihai olarak;<br \/>\nMessage broker&#8217;lar ile proje geli\u015ftirmenin zahmetli seyrini kolayla\u015ft\u0131rabilmek ve s\u00fcre\u00e7teki zahmetin sorumlulu\u011funu devredebilmek i\u00e7in ESB(Enterprise Service Bus)lerle \u00e7al\u0131\u015fmak ka\u00e7\u0131n\u0131lmazd\u0131r. Dolay\u0131s\u0131yla b\u00f6yle bir ihtiyaca istinaden problemleri ve s\u00fcreci y\u00f6netmek a\u00e7\u0131s\u0131ndan MassTransit bence olduk\u00e7a iyi bir tercih olacakt\u0131r. <\/p>\n<p>Uzun ve yorucu olan bu i\u00e7eri\u011fi zahmet edip son noktas\u0131na kadar sab\u0131r ve s\u00fckut ederek okudu\u011funuz i\u00e7in te\u015fekk\u00fcr ederim&#8230;<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<p>Not : \u00d6rnek projeleri indirebilmek i\u00e7in a\u015fa\u011f\u0131daki linkleri kullanabilirsiniz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/ExampleMassTransit.zip\">MassTransit &#8211; RabbitMQ Console (Send Function Example)(ExampleMassTransit)<\/a><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/12\/ExampleMassTransitPublish.zip\">MassTransit &#8211; RabbitMQ Console (Publish Function Example)ExampleMassTransitPublish<\/a><\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, G\u00fcn\u00fcm\u00fczde geli\u015ftirilen bir\u00e7ok enterprise uygulama, ihtiya\u00e7lar do\u011frultusunda birbirinden ba\u011f\u0131ms\u0131z platformlarda, distributed bir \u015fekilde \u00e7al\u0131\u015fmaktad\u0131r. Bu yap\u0131lar\u0131n birbirleriyle olan ileti\u015fimleri genellikle Messaging yap\u0131lar\u0131 sayesinde gev\u015fek ba\u011fl\u0131l\u0131kla(loosely coupled) ve asenkron bir \u015fekilde ger\u00e7ekle\u015ftirilmekte ve b\u00f6ylece&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":20110,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2739,3573,3156],"tags":[4020,4021,4016,4017,4018,4022,4019,3221,3158,4023],"class_list":["post-19954","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-microservices","category-rabbitmq","tag-net-core-masstransit-rabbitmq","tag-circuitbreaker","tag-enterprise-service-bus","tag-esb","tag-masstransit","tag-masstransit-circuitbreaker","tag-masstransit-rabbitmq","tag-publish-subscribe-pattern","tag-rabbitmq","tag-usemessageretry"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19954","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=19954"}],"version-history":[{"count":139,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19954\/revisions"}],"predecessor-version":[{"id":20111,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19954\/revisions\/20111"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/20110"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=19954"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=19954"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=19954"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}