﻿
{"id":26790,"date":"2023-12-12T08:18:51","date_gmt":"2023-12-12T08:18:51","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=26790"},"modified":"2023-12-12T08:18:51","modified_gmt":"2023-12-12T08:18:51","slug":"nette-nservicebus-nedir-nasil-kullanilir","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/nette-nservicebus-nedir-nasil-kullanilir\/","title":{"rendered":".NET&#8217;te NServiceBus Nedir? Nas\u0131l Kullan\u0131l\u0131r?"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/12\/nservicebus.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/12\/nservicebus.png\" alt=\"NServiceBus\" width=\"812\" height=\"385\" class=\"aligncenter size-full wp-image-26805\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/12\/nservicebus.png 812w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/12\/nservicebus-300x142.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/12\/nservicebus-768x364.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/12\/nservicebus-720x340.png 720w\" sizes=\"auto, (max-width: 812px) 100vw, 812px\" \/><\/a><br \/>\nMerhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde Microsoft platformlar\u0131nda \u00e7al\u0131\u015fan bir mesajla\u015fma altyap\u0131s\u0131 olan NServiceBus \u00fczerine odaklanacak ve Asp.NET Core mimarisinde nas\u0131l yap\u0131land\u0131r\u0131labildi\u011fini pratiksel olarak inceliyor olaca\u011f\u0131z.<\/p>\n<h3>NServiceBus Nedir?<\/h3>\n<p>NServiceBus, giri\u015f sat\u0131r\u0131nda da belirtildi\u011fi gibi bir mesajla\u015fma altyap\u0131s\u0131 sa\u011flayan yaz\u0131l\u0131m framework&#8217;\u00fcd\u00fcr. Bu framework ile temel olarak distributed sistemler aras\u0131nda ileti\u015fimi sa\u011flamak ama\u00e7lanmaktad\u0131r. Kurumsal uygulamalar i\u00e7in g\u00fcvenilir, \u00f6l\u00e7eklenebilir ve ger\u00e7ek zamanl\u0131(realtime) mesajla\u015fma imkan\u0131 tan\u0131yan ve bir\u00e7ok farkl\u0131 kaynaktan gelen mesajlar\u0131 alabilen ve b\u00f6ylece bir\u00e7ok end\u00fcstri standard\u0131n\u0131 destekleyen bir ara\u00e7t\u0131r. Bu sayede, farkl\u0131 uygulamalar aras\u0131nda entegrasyonu kolayla\u015ft\u0131rmakta ve veri uyumsuzluklar\u0131n\u0131 da giderebilmektedir.<\/p>\n<p>NServiceBus&#8217;\u0131n \u00f6nemli bir \u00f6zelli\u011fi, mesaj \u00fczerine dayal\u0131 bir asenkron ileti\u015fim modeli kullanmas\u0131d\u0131r. Uygulamalar aras\u0131ndaki ileti\u015fim, geleneksel bir client-server ili\u015fkisi yerine, bir mesaj al\u0131c\u0131s\u0131(handler) taraf\u0131ndan i\u015flenen mesajlar\u0131n g\u00f6nderilmesi prensibine dayanmaktad\u0131r. B\u00f6ylece, mesaj iletildikten sonra i\u015flenene kadar bekletilebilmekte ve hatta yeniden denenebilmektedir. Bu sayede, sistemler aras\u0131ndaki ba\u011f\u0131ml\u0131l\u0131klar t\u00f6rp\u00fclenmekte ve daha esnek ve \u00f6l\u00e7eklenebilir bir mimari sa\u011flanm\u0131\u015f olunmaktad\u0131r.<\/p>\n<p>Uzun laf\u0131n k\u0131sas\u0131 NServiceBus&#8217;\u0131n baz\u0131 \u00f6zelliklerini listelememiz gerekirse e\u011fer;<\/p>\n<ul>\n<li><strong><em>Asenkron Mesajla\u015fma<\/em><\/strong><br \/>\n\u0130\u015flemler aras\u0131nda mesajlar kullan\u0131larak asenkron ileti\u015fim sa\u011flamaktad\u0131r. Bu da, sistemlerin daha h\u0131zl\u0131 ve esnek olmas\u0131na olanak tan\u0131maktad\u0131r.<\/li>\n<li><strong><em>G\u00fcvenilirlik<\/em><\/strong><br \/>\nMesajlar\u0131n iletilmesini ve i\u015flenmesini sa\u011flamak i\u00e7in bir dizi g\u00fcvenilirlik \u00f6zelli\u011fi i\u00e7ermektedir. Mesajlar kayboldu\u011funda veya hata durumlar\u0131nda tekrar iletilmesi gibi senaryolar\u0131 ele alabilmektedir.<\/li>\n<li><strong><em>\u00d6l\u00e7eklenebilirlik<\/em><\/strong><br \/>\nB\u00fcy\u00fck ve karma\u015f\u0131k sistemlerde \u00f6l\u00e7eklenebilirlik ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lamak \u00fczere tasarlanm\u0131\u015ft\u0131r.<\/li>\n<li><strong><em>Uygulama Entegrasyonu<\/em><\/strong><br \/>\nFarkl\u0131 uygulamalar ve bile\u015fenler aras\u0131nda etkili bir \u015fekilde ileti\u015fim kurabilmek i\u00e7in \u00e7e\u015fitli entegrasyon mekanizmalar\u0131n\u0131 desteklemektedir.<\/li>\n<li><strong><em>Monitoring ve Y\u00f6netim<\/em><\/strong><br \/>\n\u00c7e\u015fitli ara\u00e7lar ve y\u00f6netim arabirimleri arac\u0131l\u0131\u011f\u0131yla uygulamalar\u0131n izlenmesini ve y\u00f6netilmesini sa\u011flamaktad\u0131r.<\/li>\n<\/ul>\n<h3>NServiceBus&#8217;\u0131n Kullan\u0131m Alanlar\u0131 Nelerdir?<\/h3>\n<p>NServiceBus, genellikle b\u00fcy\u00fck ve karma\u015f\u0131k sistemlerde, \u00f6zellikle mikroservis mimarisiyle tasarlanm\u0131\u015f projelerde tercih edilmektedir diyebiliriz. Bunlar\u0131n d\u0131\u015f\u0131nda yayg\u0131n olarak kullan\u0131labilece\u011fini s\u00f6yleyebilece\u011fimiz alanlar \u015funlar olabilir;<\/p>\n<ul>\n<li><strong><em>Mikroservis Mimarisi<\/em><\/strong><br \/>\nNServiceBus, farkl\u0131 servisler aras\u0131nda asenkron ve g\u00fcvenilir ileti\u015fimi kolayla\u015ft\u0131rabildi\u011fi ve sistemlerin mod\u00fcler ve \u00f6l\u00e7eklenebilir olmas\u0131n\u0131 sa\u011flayabildi\u011fi i\u00e7in mikroservis mimarisiyle tasarlanm\u0131\u015f projelerde altyap\u0131 sa\u011flamaya elveri\u015flidir.<\/li>\n<li><strong><em>\u0130\u015f S\u00fcre\u00e7 Y\u00f6netimi<\/em><\/strong><br \/>\nNServiceBus, distributed i\u015f s\u00fcre\u00e7lerini y\u00f6netmek i\u00e7in de kullan\u0131labilir.<\/li>\n<li><strong><em>Event Log &amp; Monitoring<\/em><\/strong><br \/>\nSistemdeki event&#8217;leri izlemek ve loglar\u0131 y\u00f6netmek amac\u0131yla da tercih edilebilir.<\/li>\n<li><strong><em>Uygulama Entegrasyonu<\/em><\/strong><br \/>\nFarkl\u0131 uygulamalar ve bile\u015fenler aras\u0131nda g\u00fcvenilir ileti\u015fim kurmak ve sistem i\u00e7indeki farkl\u0131 par\u00e7alar aras\u0131nda entegrasyonu sa\u011flamak \u00fczere kullan\u0131labilir.<\/li>\n<li><strong><em>Distributed Sistemler<\/em><\/strong><br \/>\nB\u00fcy\u00fck \u00f6l\u00e7ekli ve da\u011f\u0131t\u0131k sistemlerde kullan\u0131larak, sistemler aras\u0131ndaki ileti\u015fimi y\u00f6netmek ve da\u011f\u0131t\u0131k i\u015f y\u00fcklerini etkili bir \u015fekilde da\u011f\u0131tmak i\u00e7in kullan\u0131labilir.<\/li>\n<li><strong><em>Message-Base Integration<\/em><\/strong><br \/>\nNServiceBus, temel olarak mesajlar arac\u0131l\u0131\u011f\u0131yla ileti\u015fim kurmay\u0131 destekleyecek \u015fekilde tasarlanmas\u0131ndan dolay\u0131 sistemlerin daha gev\u015fek ba\u011fl\u0131, esnek ve \u00f6l\u00e7eklenebilir olmas\u0131n\u0131 sa\u011flayabilece\u011finden dolay\u0131 message-base integration s\u00fcre\u00e7lerinde tercih edilebilir.<\/li>\n<\/ul>\n<h3>NServiceBus &amp; MassTransit Fark\u0131<\/h3>\n<p>K\u00e2h NServiceBus olsun k\u00e2h <a href=\"https:\/\/www.gencayyildiz.com\/blog\/net-core-masstransit-kullanarak-rabbitmq-ile-messaging\/\" target=\"_blank\" rel=\"noopener\">MassTransit<\/a> olsun her ikisi de .NET platformunda kullan\u0131labilen, distributed sistemlerde asenkron mesajla\u015fma sa\u011flamaya y\u00f6nelik framework&#8217;lerdir. Her ikisi de benzer temel prensipleri payla\u015f\u0131yor olsa da, baz\u0131 farkl\u0131l\u0131klar da bulunmaktad\u0131r. \u0130\u015fte NServiceBus ve MassTransit aras\u0131ndaki baz\u0131 temel farklar \u015funlard\u0131r;<\/p>\n<ul>\n<li><strong><em>Lisans Modeli<\/em><\/strong>\n<ul>\n<li>NServiceBus, a\u00e7\u0131k kaynak de\u011fildir ve kullan\u0131c\u0131lar i\u00e7in belli bir \u00fccret talep etmektedir.<\/li>\n<li>MassTransit ise tamamen a\u00e7\u0131k kaynak ve \u00fccretsizdir.<\/li>\n<\/ul>\n<\/li>\n<li><strong><em>Topluluk ve Destek<\/em><\/strong>\n<ul>\n<li>NServiceBus, ticari bir \u00fcr\u00fcn oldu\u011fu i\u00e7in m\u00fc\u015fterilere \u00f6zel bir destek sunmaktad\u0131r.<\/li>\n<li>MassTransit, open source oldu\u011fu i\u00e7in deste\u011fini topluluktan almaktad\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li><strong><em>Kapsaml\u0131l\u0131k ve Karma\u015f\u0131kl\u0131k<\/em><\/strong>\n<ul>\n<li>NServiceBus, genellikle daha fazla \u00f6zellik ve kapsaml\u0131 bir yap\u0131 sunmaktad\u0131r. O y\u00fczden d\u00fc\u015f\u00fck \u00f6\u011frenme e\u011frisine sahiptir.<\/li>\n<li>MassTransit ise basit ve kullan\u0131m\u0131 kolay bir API sunmaktad\u0131r. Dolay\u0131s\u0131yla ba\u015flang\u0131\u00e7ta daha h\u0131zl\u0131 bir \u015fekilde \u00f6\u011frenilebilmektedir.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere her ikisinin de kendine ait avantaj ve dezavantajlar\u0131 mevcuttur. Hal b\u00f6yleyken se\u00e7im; ki\u015fisel tercihlere, projenin ihtiya\u00e7 ve \u00f6l\u00e7eklendirme beklentilerine g\u00f6re de\u011fi\u015fkenlik g\u00f6sterecektir.<\/p>\n<h3>NServiceBus&#8217;\u0131n Temel Kavramlar\u0131<\/h3>\n<p>NServiceBus&#8217;\u0131n \u00e7al\u0131\u015fma s\u00fcrecindeki davran\u0131\u015flar\u0131 belli ba\u015fl\u0131 kavramlara kar\u015f\u0131l\u0131k gelen yap\u0131lar \u00fczerinden \u015fekillenmektedir. Bu kavramlar\u0131 \u00f6ncelikle \u00f6\u011frenmek, yap\u0131lan i\u015fteki d\u00fc\u015f\u00fcnceye hakimiyet a\u00e7\u0131s\u0131ndan bizlere fayda sa\u011flayacakt\u0131r.<\/p>\n<ul>\n<li><strong><em>Endpoint Kavram\u0131<\/em><\/strong><br \/>\nNServiceBus&#8217;ta endpoint kavram\u0131, distributed sistem olarak tasarlanm\u0131\u015f uygulaman\u0131n belirli bir i\u015flevini yerine getiren her bir servisine kar\u015f\u0131l\u0131k terminolojik olarak kulland\u0131\u011f\u0131m\u0131z bir terimdir. Misal olarak; bir e-ticaret sistemindeki sipari\u015ften, m\u00fc\u015fteri i\u015flerinden ve \u00f6deme i\u015flemlerinden sorumlu olan her bir bile\u015fen uygulaman\u0131n bir endpoint&#8217;i olarak d\u00fc\u015f\u00fcn\u00fclebilir. Yani anlayaca\u011f\u0131n\u0131z bizler, NServiceBus framework&#8217;\u00fc ile yapt\u0131\u011f\u0131m\u0131z \u00e7al\u0131\u015fmalarda servis&#8217;lere servis de\u011fil de endpoint diyoruz :)Bir uygulamadaki endpoint&#8217;lerin her biri mesaj al\u0131p g\u00f6nderebilmekte ve bu sayede di\u011fer endpoint&#8217;ler ile ileti\u015fim kurabilmektedir. Ve bu i\u015flemi yaparken endpoint isimlerinden istifade edilmektedir. Yine \u00f6rnek vermemiz gerekirse e\u011fer; sipari\u015f bile\u015feni sadece m\u00fc\u015fteri bile\u015fenine bir mesaj g\u00f6nderecekse bunu m\u00fc\u015fteri servisinin endpoint ad\u0131 her ne ise sadece onu belirterek rahatl\u0131kla ger\u00e7ekle\u015ftirebilecektir.<\/li>\n<li><strong><em>Message Kavram\u0131<\/em><\/strong><br \/>\nUygulamadaki farkl\u0131 bile\u015fenler\/endpoint&#8217;ler aras\u0131nda ileti\u015fim kurmak i\u00e7in kullan\u0131lan bilgi ta\u015f\u0131y\u0131c\u0131lar\u0131na mesaj denmektedir. Mesajlar, genellikle bir eylemi temsil etmekte ve bir endpoint&#8217;ten di\u011ferine iletilmektedirler.NServiceBus&#8217;ta mesajlar\u0131 &#8216;Command&#8217; ve &#8216;Event&#8217; olmak \u00fczere iki ana kategoriye ay\u0131rabiliriz.<\/p>\n<ul>\n<li><em style=\"color: purple;\">Command<\/em><br \/>\nBir eylemi ger\u00e7ekle\u015ftirmek amac\u0131yla (genellikle) hedef servise g\u00f6nderilerek yap\u0131lacak i\u015flemin ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flayacak olan <u>komut<\/u> mahiyetindeki mesaj t\u00fcr\u00fcd\u00fcr.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\npublic class PlaceOrderCommand : ICommand\r\n{\r\n    public Guid OrderId { get; set; }\r\n    public string ProductName { get; set; }\r\n    public int Quantity { get; set; }\r\n    \/\/ Di\u011fer gerekli \u00f6zellikler...\r\n}\r\n<\/pre>\n<\/div>\n<p>NServiceBus&#8217;ta bir mesaj\u0131n &#8216;Command&#8217; olabilmesi i\u00e7in <code style=\"color: orange;\">ICommand<\/code> interface&#8217;inden implement edilmesi gerekmektedir.<\/li>\n<li><em style=\"color: purple;\">Event<\/em><br \/>\nBir olay\u0131n ger\u00e7ekle\u015fti\u011fini bildirmek amac\u0131yla (genellikle) o olayla ilgili\/ili\u015fkili i\u015flem yapacak olan birden fazla servise(ki bu servisler abone\/subscribe olarak nitelendirilir) haber g\u00f6nderip i\u015flem yap\u0131lmas\u0131n\u0131 sa\u011flayacak olan <u>durum<\/u> mahiyetindeki mesaj t\u00fcr\u00fcd\u00fcr.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\npublic class OrderPlacedEvent : IEvent\r\n{\r\n    public Guid OrderId { get; set; }\r\n    public string ProductName { get; set; }\r\n    public int Quantity { get; set; }\r\n    \/\/ Di\u011fer gerekli \u00f6zellikler...\r\n}\r\n<\/pre>\n<\/div>\n<p>NServiceBus&#8217;ta bir mesaj\u0131n &#8216;Event&#8217; olabilmesi i\u00e7in <code style=\"color: orange;\">IEvent<\/code> interface&#8217;inden implement edilmesi gerekmektedir.<\/li>\n<\/ul>\n<p><code style=\"color: orange;\">ICommand<\/code> ve <code style=\"color: orange;\">IEvent<\/code> interface&#8217;leri genel bir mesaj t\u00fcr\u00fcn\u00fc belirtmek i\u00e7in NServiceBus taraf\u0131ndan bizlere sunulan, ancak ihtiya\u00e7 noktalar\u0131nda kendimize g\u00f6re custom interface&#8217;ler ile \u00f6zelle\u015ftirebilece\u011fimiz aray\u00fczlerdir. Bu \u015fekilde bir ayr\u0131m\u0131n, mikroservis mimarilerinde ve distributed sistemlerde yayg\u0131n olarak kullan\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6receksiniz. \u00c7\u00fcnk\u00fc bu yakla\u015f\u0131m, bir servisin i\u00e7 durumunu ve davran\u0131\u015f\u0131n\u0131 daha a\u00e7\u0131k bir \u015fekilde ifade etmeye ve servisler aras\u0131 etkile\u015fimi daha iyi y\u00f6netmeye yard\u0131mc\u0131 olmaktad\u0131r.<\/p>\n<p>Velhas\u0131l kelam anlayaca\u011f\u0131n\u0131z, \u00e7al\u0131\u015fma s\u00fcre\u00e7lerinde bu mesaj t\u00fcrlerinden hangisinin se\u00e7ilece\u011fi mesajlar\u0131n ta\u015f\u0131d\u0131\u011f\u0131 bilgi t\u00fcr\u00fc ve g\u00f6nderim amac\u0131na g\u00f6re belirlenmektedir.<\/li>\n<li><strong><em>Handler Kavram\u0131<\/em><\/strong><br \/>\nBir endpoint taraf\u0131ndan yay\u0131nlanm\u0131\u015f olan mesaj\u0131n farkl\u0131 bir endpoint ya da endpoint&#8217;ler taraf\u0131ndan i\u015flenmesini sa\u011flayacak olan kod par\u00e7ac\u0131\u011f\u0131d\u0131r. Yani MassTransit&#8217;te ki &#8216;Consumer&#8217; kavram\u0131n\u0131n muadilidir diyebiliriz. Her endpoint, istedi\u011fi mesaj t\u00fcr\u00fcn\u00fc i\u015fleyebilecek bir veya birden fazla handler bar\u0131nd\u0131rabilmektedir.<\/li>\n<li><strong><em>Transport Kavram\u0131<\/em><\/strong><br \/>\nEndpoint&#8217;ler aras\u0131 mesajlar\u0131n fiziksel olarak nas\u0131l ta\u015f\u0131naca\u011f\u0131n\u0131 belirten bir alt sistemdir. Misal olarak; RabbitMQ, Azure Service Bus veya MSMQ gibi teknolojiler NServiceBus&#8217;da transport olarak nitelendirilmektedirler.<\/li>\n<\/ul>\n<h3>.NET Core&#8217;da NServiceBus&#8217;\u0131n Kullan\u0131m\u0131<\/h3>\n<p>\u015eimdi NServiceBus&#8217;\u0131n kullan\u0131m\u0131n\u0131 pratiksel olarak incelemeye ba\u015flayabiliriz. Bunun i\u00e7in Console Application ve Asp.NET Core Web API ortamlar\u0131 \u00fczerinden \u00f6rneklendirme yapmay\u0131 uygun g\u00f6r\u00fcyorum. \u0130lk olarak Console Application ortam\u0131nda incelemeye ba\u015flayal\u0131m.<\/p>\n<h5 style=\"color: purple;\">Console Application Yap\u0131land\u0131rmas\u0131<\/h5>\n<p>Console Application&#8217;da NServiceBus&#8217;\u0131 \u00f6rneklendirebilmek i\u00e7in \u00f6ncelikle &#8216;ServiceA&#8217;, &#8216;ServiceB&#8217; ve &#8216;ServiceC&#8217; isminde \u00fc\u00e7 adet uygulama olu\u015ftural\u0131m. Bunlardan; &#8216;ServiceA&#8217;y\u0131 mesaj yay\u0131nlayacak, &#8216;ServiceB&#8217; ve &#8216;ServiceC&#8217;yi yay\u0131nlanm\u0131\u015f olan mesajlar\u0131 t\u00fcketecek konumda d\u00fc\u015f\u00fcnebiliriz.<\/p>\n<p>Servisleri olu\u015fturduktan sonra ilk i\u015f olarak t\u00fcm servislere a\u015fa\u011f\u0131daki k\u00fct\u00fcphaneleri y\u00fckleyelim;<\/p>\n<ul>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/NServiceBus\/\" target=\"_blank\" rel=\"noopener\">NServiceBus<\/a><\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/NServiceBus.RabbitMQ\" target=\"_blank\" rel=\"noopener\">NServiceBus.RabbitMQ<\/a><\/li>\n<\/ul>\n<p>\u015eimdi ilk olarak &#8216;ServiceA&#8217;ya odakl\u0131 bir \u015fekilde geli\u015ftirmede bulunal\u0131m.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing Shared;\r\nusing Shared.Messages;\r\n\r\nEndpointConfiguration endpointConfiguration = new(ServiceRegistryInformations.ServiceAEndpointName);\r\nvar rabbitMQTransport = endpointConfiguration.UseTransport&lt;RabbitMQTransport&gt;();\r\nrabbitMQTransport.ConnectionString(&quot;...&quot;);\r\nrabbitMQTransport.UseConventionalRoutingTopology(QueueType.Quorum);\r\n\r\nendpointConfiguration.EnableInstallers();\r\n\r\nIEndpointInstance endpointInstance = await Endpoint.Start(endpointConfiguration);\r\n\r\nwhile (true)\r\n{\r\n    Console.WriteLine(&quot;Mesaj\u0131 yaz\u0131n\u0131z...&quot;);\r\n\r\n    #region Hedef Endpoint'e Mesaj G\u00f6nderme\r\n    ExampleMessage message = new() { Message = Console.ReadLine() };\r\n    await endpointInstance.Send(ServiceRegistryInformations.ServiceCEndpointName, message);\r\n    #endregion\r\n\r\n    #region T\u00fcm Endpoint'lere Event Yay\u0131nlama\r\n    ExampleEvent @event = new() { Message = &quot;...Event content...&quot; };\r\n    await endpointInstance.Publish(@event);\r\n    #endregion\r\n\r\n\r\n    Console.WriteLine(&quot;Devam m\u0131? D\/H&quot;);\r\n    if (Console.ReadKey().Key == ConsoleKey.H)\r\n        break;\r\n}\r\n\r\nawait endpointInstance.Stop();\r\nConsole.Read();\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funu incelersek e\u011fer; <strong><em>4.<\/em><\/strong> sat\u0131rda <code style=\"color: green;\">EndpointConfiguration<\/code> nesnesinin \u00fcretildi\u011fini g\u00f6r\u00fcyoruz. Bu nesne bir endpoint&#8217;in(yani bu servisin) nas\u0131l davran\u0131\u015f sergileyece\u011fi ve \u00e7e\u015fitli \u00f6zelliklerinin neler olaca\u011f\u0131 \u015feklinde t\u00fcrl\u00fc yap\u0131land\u0131rmalar\u0131 sa\u011flamaktad\u0131r. \u0130lgili nesnenin constructor&#8217;\u0131na verilen metinsel de\u011fer bu servisin yani endpoint&#8217;in ad\u0131n\u0131 ifade etmektedir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/12\/NETte-NServiceBus-Nedir-Nasil-Kullanilir.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-26798\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/12\/NETte-NServiceBus-Nedir-Nasil-Kullanilir.png\" alt=\".NET'te NServiceBus Nedir? Nas\u0131l Kullan\u0131l\u0131r?\" width=\"1120\" height=\"78\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/12\/NETte-NServiceBus-Nedir-Nasil-Kullanilir.png 1120w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/12\/NETte-NServiceBus-Nedir-Nasil-Kullanilir-300x21.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/12\/NETte-NServiceBus-Nedir-Nasil-Kullanilir-1024x71.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/12\/NETte-NServiceBus-Nedir-Nasil-Kullanilir-768x53.png 768w\" sizes=\"auto, (max-width: 1120px) 100vw, 1120px\" \/><\/a><strong><em>5.<\/em><\/strong> sat\u0131rda ise <code style=\"color: green;\">UseTransport<\/code> metodu ile bu endpoint&#8217;in transport ayarlar\u0131 yap\u0131land\u0131r\u0131lmaktad\u0131r. Burada g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere <code style=\"color: green;\">RabbitMQTransport<\/code> s\u0131n\u0131f\u0131 kullan\u0131larak RabbitMQ message broker&#8217;\u0131na g\u00f6re bir transport ayarlamas\u0131nda bulunulmaktad\u0131r.<\/p>\n<p><strong><em>7.<\/em><\/strong> sat\u0131rda ise <code style=\"color: green;\">UseConventionalRoutingTopology<\/code> metodu ile RabbitMQ ta\u015f\u0131ma y\u00f6ntemi yap\u0131land\u0131r\u0131lmakta ve kullan\u0131lacak routing topolojisi belirlenmektedir. Buradaki <code style=\"color: green;\">QueueType.Quorum<\/code> ifadesi, RabbitMQ&#8217;da kullan\u0131lan bir \u00f6zelliktir ve RabbitMQ 3.8.0 ve \u00fczeri s\u00fcr\u00fcmlerde tan\u0131t\u0131lm\u0131\u015ft\u0131r. Bu \u00f6zellik, bir kuyru\u011fun &#8216;quorum&#8217; modda \u00e7al\u0131\u015fmas\u0131n\u0131 ifade etmektedir. Quorum modu, RabbitMQ kuyruklar\u0131n\u0131n y\u00fcksek g\u00fcvenilirlik ve dayan\u0131kl\u0131l\u0131k sa\u011flamak i\u00e7in geli\u015ftirilmi\u015f bir modudur.<\/p>\n<p><strong><em>9.<\/em><\/strong> sat\u0131rda ise <code style=\"color: green;\">EnableInstallers<\/code> metodu ile uygulaman\u0131n \u00e7al\u0131\u015fma zaman\u0131nda mesaj ta\u015f\u0131ma alt yap\u0131s\u0131 otomatik olarak y\u00fcklenmekte ve yap\u0131land\u0131r\u0131lmaktad\u0131r. Bu yap\u0131land\u0131rma sayesinde NServiceBus, belirli bir mesaj tipini kar\u015f\u0131layabilmek ve i\u015fleyebilmek i\u00e7in gerekli kuyruk olu\u015fturma i\u015fleminin altyap\u0131s\u0131n\u0131 sa\u011flamaya yard\u0131mc\u0131 olmakta ve i\u015flem bittikten sonra kuyru\u011fun temizlenmesini sa\u011flamaktad\u0131r. Unutulmamal\u0131d\u0131r ki, <code style=\"color: green;\">EnableInstallers<\/code> metodu, geli\u015ftirme ve test s\u00fcre\u00e7lerinde s\u00fcreci basitle\u015ftirse de production ortam\u0131nda genellikle devre d\u0131\u015f\u0131 b\u0131rak\u0131lmaktad\u0131r. \u00c7\u00fcnk\u00fc production ortam\u0131nda altyap\u0131y\u0131 manuel olarak yap\u0131land\u0131rmak daha do\u011fdurudur!<\/p>\n<p><strong><em>11.<\/em><\/strong> sat\u0131rda ise <code style=\"color: green;\">Endpoint.Start<\/code> metodu ile ilgili endpoint ba\u015flat\u0131lmakta ve bu endpoint \u00fczerinden mesaj al\u0131\u015fveri\u015fini ger\u00e7ekle\u015ftirebilir hale getirmektedir.<\/p>\n<p><strong><em>13<\/em><\/strong> ile <strong><em>31.<\/em><\/strong> sat\u0131r aral\u0131\u011f\u0131nda ise mesaj yay\u0131m\u0131 ger\u00e7ekle\u015ftirilmektedir. <strong><em>17<\/em><\/strong> ile <strong><em>20.<\/em><\/strong> sat\u0131r aral\u0131\u011f\u0131nda hedef endpoint olan &#8216;ServiceC&#8217;ye, <strong><em>22<\/em><\/strong> ile <strong><em>25.<\/em><\/strong> sat\u0131r aral\u0131\u011f\u0131nda ise t\u00fcm servislere mesaj g\u00f6nderilmektedir.<\/p>\n<p>\u015eimdi &#8216;ServiceA&#8217;y\u0131 geli\u015ftirdi\u011fimize g\u00f6re &#8216;ServiceB&#8217; ve &#8216;ServiceC&#8217;ye odaklanabiliriz.<\/p>\n<p>&#8216;ServiceB&#8217;;<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing Shared;\r\n\r\nEndpointConfiguration endpointConfiguration = new(ServiceRegistryInformations.ServiceBEndpointName);\r\nvar rabbitMQTransport = endpointConfiguration.UseTransport&lt;RabbitMQTransport&gt;();\r\nrabbitMQTransport.ConnectionString(&quot;...&quot;);\r\nrabbitMQTransport.UseConventionalRoutingTopology(QueueType.Quorum);\r\n\r\nendpointConfiguration.EnableInstallers();\r\n\r\nIEndpointInstance endpointInstance = await Endpoint.Start(endpointConfiguration);\r\n\r\n\/\/await endpointInstance.Stop();\r\nConsole.Read();\r\n<\/pre>\n<\/div>\n<p>&#8216;ServiceC&#8217;;<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing Shared;\r\n\r\nEndpointConfiguration endpointConfiguration = new(ServiceRegistryInformations.ServiceCEndpointName);\r\nvar rabbitMQTransport = endpointConfiguration.UseTransport&lt;RabbitMQTransport&gt;();\r\nrabbitMQTransport.ConnectionString(&quot;...&quot;);\r\nrabbitMQTransport.UseConventionalRoutingTopology(QueueType.Quorum);\r\n\r\nendpointConfiguration.EnableInstallers();\r\n\r\nIEndpointInstance endpointInstance = await Endpoint.Start(endpointConfiguration);\r\n\r\n\/\/await endpointInstance.Stop();\r\nConsole.Read();\r\n<\/pre>\n<\/div>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere her \u00fc\u00e7 serviste \u00f6z\u00fcnde ayn\u0131 yap\u0131land\u0131rmaya sahiptir. Sadece &#8216;ServiceA&#8217;da g\u00f6nderilen mesajlar\u0131n &#8216;ServiceB&#8217; ve &#8216;ServiceC&#8217;de i\u015flenmeleri gerekmektedir. Bunun i\u00e7in her iki endpoint&#8217;te handler yap\u0131lanmalar\u0131 olu\u015fturmam\u0131z gerekmektedir.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class ExampleEventHandler : IHandleMessages&lt;ExampleEvent&gt;\r\n    {\r\n        public Task Handle(ExampleEvent message, IMessageHandlerContext context)\r\n        {\r\n            Console.WriteLine($&quot;{message.Message}&quot;);\r\n            return Task.CompletedTask;\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class ExampleMessageHandler : IHandleMessages&lt;ExampleMessage&gt;\r\n    {\r\n        public Task Handle(ExampleMessage message, IMessageHandlerContext context)\r\n        {\r\n            Console.WriteLine($&quot;Received message : {message.Message}&quot;);\r\n            return Task.CompletedTask;\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Bu iki s\u0131n\u0131f\u0131 her iki projede olu\u015ftural\u0131m. <em>-Hocam, bu handler s\u0131n\u0131flar\u0131n\u0131 ilgili projelerin yap\u0131land\u0131rmalar\u0131nda bildirmeyecek miyiz?<\/em> \u015feklinde sorunuzu duyar gibiyim&#8230; Hay\u0131r! NServiceBus k\u00fct\u00fcphanesinde handler s\u0131n\u0131flar\u0131, ilgili proje i\u00e7erisinde assembly&#8217;de reflection ile taranmakta ve handler s\u0131n\u0131f\u0131 hangi mesaj\u0131 generic olarak ifade ediyorsa, o t\u00fcrden bir mesaj yay\u0131nland\u0131\u011f\u0131 taktirde ilgili handler s\u0131n\u0131f\u0131 tetiklenmektedir. Bu y\u00fczden handler&#8217;lar\u0131 ilgili projeler i\u00e7erisinde sadece olu\u015fturmak yeterli ve kafidir.<\/p>\n<p>Ayr\u0131ca \u00f6rnekte kulland\u0131\u011f\u0131m\u0131z command ve event mesaj t\u00fcrlerinin i\u00e7erikleri de a\u015fa\u011f\u0131daki gibi olacakt\u0131r. Tabi bu mesaj tan\u0131mlar\u0131n\u0131n &#8216;Shared&#8217; isimli class library&#8217;de olmas\u0131 gerekmektedir.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class ExampleEvent : IEvent\r\n    {\r\n        public string Message { get; set; }\r\n    }\r\n<\/pre>\n<\/div>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class ExampleMessage : ICommand\r\n    {\r\n        public string Message { get; set; }\r\n    }\r\n<\/pre>\n<\/div>\n<p>\u015eimdi uygulamay\u0131 bu vaziyette derleyip aya\u011fa kald\u0131r\u0131rsak e\u011fer a\u015fa\u011f\u0131daki gibi \u00e7al\u0131\u015fma sergiledi\u011fini g\u00f6zlemliyor olaca\u011f\u0131z.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/12\/NETte-NServiceBus-Nedir-Nasil-Kullanilir.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/12\/NETte-NServiceBus-Nedir-Nasil-Kullanilir.gif\" alt=\".NET&#039;te NServiceBus Nedir? Nas\u0131l Kullan\u0131l\u0131r?\" width=\"800\" height=\"372\" class=\"aligncenter size-full wp-image-26802\" \/><\/a>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;ServiceA&#8217;dan yaz\u0131lan mesaj direkt &#8216;ServiceC&#8217;ye g\u00f6nderilmekte ve ayr\u0131ca her iki servise de bir event yay\u0131nlanmaktad\u0131r. Anlayaca\u011f\u0131n\u0131z NServiceBus sayesinde servisler aras\u0131nda mesaj g\u00f6nderme s\u00fcrecinde ayr\u0131m\u0131 yukar\u0131daki \u00e7al\u0131\u015fmada yapt\u0131\u011f\u0131m\u0131z davran\u0131\u015fta oldu\u011fu gibi endpoint \u00fczerinden rahatl\u0131kla sa\u011flayabilmekte ve temiz bir \u00e7al\u0131\u015fma sergileyebilmekteyiz.<\/p>\n<p>Console Application ile \u00e7al\u0131\u015fmam\u0131z\u0131 ger\u00e7ekle\u015ftirdi\u011fimize g\u00f6re s\u0131ra Asp.NET Core Web API ortam\u0131nda NServiceBus&#8217;\u0131 incelemeye gelmi\u015ftir.<\/p>\n<h5 style=\"color: purple;\">Asp.NET Core Web API Yap\u0131land\u0131rmas\u0131<\/h5>\n<p>Burada ki incelemeyi de &#8216;WebAPIA&#8217; ve &#8216;WebAPIB&#8217; isminde olu\u015fturdu\u011fumuz iki API servisi \u00fczerinden y\u00fcr\u00fctece\u011fiz. \u0130lk olarak bu servislere gerekli k\u00fct\u00fcphanelerin y\u00fcklenmesi gerekmektedir. Yaln\u0131z Asp.NET Core mimarisinde \u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131zdan dolay\u0131 <a href=\"https:\/\/www.nuget.org\/packages\/NServiceBus\/\" rel=\"noopener\" target=\"_blank\">NServiceBus<\/a> k\u00fct\u00fcphanesinden ziyade, mimarinin HostBuilder \u00fczerindeki entegrasyonunu sa\u011flamak ve Asp.NET Core uygulamalar\u0131ndaki NServiceBus kullan\u0131m\u0131n\u0131 kolayla\u015ft\u0131rmak i\u00e7in tasarlanm\u0131\u015f olan <a href=\"https:\/\/www.nuget.org\/packages\/NServiceBus.Extensions.Hosting\" rel=\"noopener\" target=\"_blank\">NServiceBus.Extensions.Hosting<\/a> k\u00fct\u00fcphanesini kullan\u0131yor olaca\u011f\u0131z. Bu sebeple iki uygulamaya da ad\u0131 ge\u00e7en k\u00fct\u00fcphaneyle birlikte <a href=\"https:\/\/www.nuget.org\/packages\/NServiceBus.RabbitMQ\" rel=\"noopener\" target=\"_blank\">NServiceBus.RabbitMQ<\/a> k\u00fct\u00fcphanesini y\u00fckleyelim.<\/p>\n<p>\u015eimdi ilk olarak mesaj g\u00f6nderici konumunda olacak olan &#8216;WebAPIA&#8217; servisinin &#8216;Program.cs&#8217; dosyas\u0131n\u0131 ele alal\u0131m;<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing NServiceBus;\r\nusing Shared;\r\nusing Shared.Messages;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.Services.AddEndpointsApiExplorer();\r\nbuilder.Services.AddSwaggerGen();\r\n\r\nbuilder.Host.UseNServiceBus(context =&gt;\r\n{\r\n    EndpointConfiguration endpointConfiguration = new(ServiceRegistryInformations.WebAPIAEndpointName);\r\n    var rabbitMQTransport = endpointConfiguration.UseTransport&lt;RabbitMQTransport&gt;();\r\n    rabbitMQTransport.ConnectionString(builder.Configuration.GetConnectionString(&quot;RabbitMQ&quot;));\r\n    rabbitMQTransport.UseConventionalRoutingTopology(QueueType.Quorum);\r\n\r\n    endpointConfiguration.EnableInstallers();\r\n    return endpointConfiguration;\r\n});\r\n\r\nvar app = builder.Build();\r\n\r\napp.UseSwagger();\r\napp.UseSwaggerUI();\r\n\r\napp.MapPost(&quot;\/send-message&quot;, async (IMessageSession messageSession) =&gt;\r\n{\r\n    ExampleMessage exampleMessage = new() { Message = &quot;Example message&quot; };\r\n    await messageSession.Send(ServiceRegistryInformations.WebAPIBEndpointName, exampleMessage);\r\n\r\n    return TypedResults.Ok();\r\n});\r\n\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere <strong><em>10<\/em><\/strong> ile <strong><em>19.<\/em><\/strong> sat\u0131r aral\u0131\u011f\u0131nda Asp.NET Core mimarisine uygun NServiceBus yap\u0131land\u0131rmas\u0131nda bulunuyoruz. Burada kulland\u0131\u011f\u0131m\u0131z t\u00fcm s\u0131n\u0131flar\u0131 i\u00e7eri\u011fimizin \u00f6nceki sat\u0131rlar\u0131nda izah etti\u011fimizden dolay\u0131 tekrara d\u00fc\u015fmemek i\u00e7in ge\u00e7iyorum.<\/p>\n<p>Geli\u015ftirdi\u011fimiz bu yap\u0131lanmay\u0131 test etmek i\u00e7in <strong><em>26<\/em><\/strong> ile <strong><em>32.<\/em><\/strong> sat\u0131r aral\u0131\u011f\u0131nda olu\u015fturdu\u011fumuz minimal api&#8217;a da dikkatinizi \u00e7ekerim.<\/p>\n<p>Ayn\u0131 \u015fekilde yay\u0131nlanm\u0131\u015f mesajlar\u0131 t\u00fcketecek konumdaki &#8216;WebAPIB&#8217; servisimizi de geli\u015ftirmemiz gerekirse e\u011fer;<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing NServiceBus;\r\nusing Shared;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.Host.UseNServiceBus(context =&gt;\r\n{\r\n    EndpointConfiguration endpointConfiguration = new(ServiceRegistryInformations.WebAPIBEndpointName);\r\n    var rabbitMQTransport = endpointConfiguration.UseTransport&lt;RabbitMQTransport&gt;();\r\n    rabbitMQTransport.ConnectionString(builder.Configuration.GetConnectionString(&quot;RabbitMQ&quot;));\r\n    rabbitMQTransport.UseConventionalRoutingTopology(QueueType.Quorum);\r\n\r\n    endpointConfiguration.EnableInstallers();\r\n    return endpointConfiguration;\r\n});\r\n\r\nvar app = builder.Build();\r\n\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>\u015feklinde yap\u0131land\u0131r\u0131lmas\u0131 k\u00e2fidir. Tabi bu yap\u0131land\u0131rman\u0131n d\u0131\u015f\u0131nda ayriyeten <code>ExampleMessage<\/code>&#8216;\u0131 t\u00fcketecek olan handler s\u0131n\u0131f\u0131n\u0131 da olu\u015fturmam\u0131z gerekmektedir.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class ExampleMessageHandler : IHandleMessages&lt;ExampleMessage&gt;\r\n    {\r\n        public Task Handle(ExampleMessage message, IMessageHandlerContext context)\r\n        {\r\n            Console.WriteLine($&quot;Received message : {message.Message}&quot;);\r\n            return Task.CompletedTask;\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>\u0130\u015fte bu kadar \ud83d\ude42 Yap\u0131lan bu \u00e7al\u0131\u015fmalar neticesinde uygulamalar\u0131 derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi neticeyle kar\u015f\u0131l\u0131yor olaca\u011f\u0131z.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/12\/NETte-NServiceBus-Nedir-Nasil-Kullanilir-1.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2023\/12\/NETte-NServiceBus-Nedir-Nasil-Kullanilir-1.gif\" alt=\".NET&#039;te NServiceBus Nedir? Nas\u0131l Kullan\u0131l\u0131r?\" width=\"800\" height=\"317\" class=\"aligncenter size-full wp-image-26803\" \/><\/a><\/p>\n<p>Nihai olarak;<br \/>\nFarkl\u0131 service bus yap\u0131lanmalar\u0131n\u0131 g\u00f6rmek, g\u00f6zlemlemek her daim ihtiya\u00e7 noktalar\u0131nda farkl\u0131 bir alternatif de\u011ferlendirmesine imkan tan\u0131yacak ve b\u00f6ylece geli\u015ftirdi\u011fimiz yaz\u0131l\u0131mlar senaryolar\u0131na g\u00f6re daha verimli bir \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirebiliyor olacakt\u0131r. Ben deniz, NServiceBus&#8217;\u0131n yukar\u0131daki sat\u0131rlarda anlatt\u0131\u011f\u0131m\u0131z \u015feklindeki endpoint mant\u0131\u011f\u0131yla \u00e7al\u0131\u015fmas\u0131n\u0131n, biz yaz\u0131l\u0131mc\u0131lar a\u00e7\u0131s\u0131ndan geli\u015ftirme s\u00fcre\u00e7lerinde olduk\u00e7a pratik ve etkili bir davran\u0131\u015f sa\u011flad\u0131\u011f\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcyorum ve bu mant\u0131\u011f\u0131, kod sadeli\u011fi ve y\u00f6netimi a\u00e7\u0131s\u0131ndan \u00f6nemli bir katk\u0131 olarak de\u011ferlendiriyorum.<\/p>\n<p>Sizlere de nacizane tavsiyem, NServiceBus&#8217;\u0131n g\u00fcc\u00fcn\u00fc daha tereffuatl\u0131 bir \u015fekilde test etmek istiyorsan\u0131z makalenin sonundaki github adresinde payla\u015fm\u0131\u015f oldu\u011fum bu \u00e7al\u0131\u015fmalar\u0131n hepsini indirip, hem Web API hem de console uygulamalar\u0131n\u0131 k\u00fcm\u00fclatif bir \u015fekilde \u00e7al\u0131\u015ft\u0131r\u0131p, kendi aralar\u0131nda ileti\u015fim kurmalar\u0131n\u0131 deneyimleyerek g\u00f6zlemde bulunabilirsiniz.<\/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 \u00e7al\u0131\u015fmaya a\u015fa\u011f\u0131daki github adresinden eri\u015febilirsiniz.<br \/>\n<a href=\"https:\/\/github.com\/gncyyldz\/NServiceBus.Example\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/gncyyldz\/NServiceBus.Example<\/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, Bu i\u00e7eri\u011fimizde Microsoft platformlar\u0131nda \u00e7al\u0131\u015fan bir mesajla\u015fma altyap\u0131s\u0131 olan NServiceBus \u00fczerine odaklanacak ve Asp.NET Core mimarisinde nas\u0131l yap\u0131land\u0131r\u0131labildi\u011fini pratiksel olarak inceliyor olaca\u011f\u0131z. NServiceBus Nedir? NServiceBus, giri\u015f sat\u0131r\u0131nda da belirtildi\u011fi gibi bir mesajla\u015fma altyap\u0131s\u0131&#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":26805,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2739,3102,3573],"tags":[4018,4986,4987,4988,4989,4990],"class_list":["post-26790","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core","category-asp-net-core","category-microservices","tag-masstransit","tag-nservicebus","tag-nservicebus-masstransit-farki","tag-nservicebus-vs-masstransit","tag-nservicebus-extensions-hosting","tag-nservicebus-rabbitmq"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26790","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=26790"}],"version-history":[{"count":10,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26790\/revisions"}],"predecessor-version":[{"id":26806,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/26790\/revisions\/26806"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/26805"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=26790"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=26790"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=26790"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}