{"id":831,"date":"2016-10-03T00:14:32","date_gmt":"2016-10-02T21:14:32","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=831"},"modified":"2016-10-03T00:16:30","modified_gmt":"2016-10-02T21:16:30","slug":"rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\/","title":{"rendered":"RabbitMQ ve Publish-Subscribe Patterni ile Fanout Exchange"},"content":{"rendered":"<p>Merhaba arkada\u015flar.<\/p>\n<p>Bir s\u00fcredir <strong>Messaging<\/strong> sistemleri \u00fczerinde yo\u011fun bir \u015fekilde \u00e7al\u0131\u015fmaktay\u0131m. Bu makalede ise RabbitMQ&#8217;da <strong>Publish-Subscribe<\/strong>\u00a0pattern&#8217;i ile <strong>Fanout Exchange<\/strong>&#8216;e\u00a0de\u011finmeye \u00e7al\u0131\u015faca\u011f\u0131m. \u00d6ncelikle t\u00fcm bu i\u015flemlere ba\u015flamadan RabbitMQ hakk\u0131ndaki bilgilerimizi tazeleyebilmek ad\u0131na,\u00a0<a href=\"https:\/\/gokhan-gokalp.com\/category\/rabbitmq\/\" target=\"_blank\">buraya<\/a>\u00a0t\u0131klayarak RabbitMQ hakk\u0131nda daha \u00f6nce yazd\u0131\u011f\u0131m makalelere bir g\u00f6z atabilirsiniz.<\/p>\n<p>Dilerseniz konuya girmeden \u00f6nce biraz messaging sistemlerinden\u00a0bahsedelim.<\/p>\n<blockquote><p>Messaging yap\u0131lar\u0131 ile\u00a0uygulamalar, loosely coupled olarak\u00a0asenkron bir \u015fekilde\u00a0birbirleri ile ileti\u015fime\u00a0ge\u00e7ebilmektedirler.<\/p><\/blockquote>\n<p>Messaging yap\u0131lar\u0131\u00a0temel olarak verinin, bir uygulamadan bir ba\u015fka uygulamaya aktar\u0131lmas\u0131 ile sorumludur. Web Servisler, Windows Servisler veya MVC uygulamalar\u0131 gibi bir \u00e7ok platform birbirleri ile ileti\u015fime ge\u00e7me ihtiyac\u0131nda\u00a0olabilirler. \u0130\u015fte bu noktada Messaging yap\u0131lar\u0131 bu entegrasyon s\u00fcrecine odaklanarak, uygulamalar\u0131n platform ba\u011f\u0131ms\u0131z bir \u015fekilde herhangi bir bilgiyi\u00a0<strong>exchange<\/strong> edebilmelerini sa\u011flamaktad\u0131rlar.<\/p>\n<p>Hat\u0131rlarsak daha \u00f6nceki makalemde RabbitMQ \u00fczerinde &#8220;Direct Exchange&#8221;, &#8220;Fanout Exchange&#8221; ve &#8220;Topic Exchange&#8221; gibi farkl\u0131 exchange tiplerinin bulundu\u011fundan bahsetmi\u015ftik. Bu makalemde ise <strong>Fanout Exhange<\/strong> tipine de\u011finece\u011fiz ve bir \u00f6rnek ger\u00e7ekle\u015ftirece\u011fiz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/10\/publish-subscriber.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-839 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/10\/publish-subscriber.png\" alt=\"publish-subscriber\" width=\"502\" height=\"158\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/10\/publish-subscriber.png 502w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/10\/publish-subscriber-300x94.png 300w\" data-sizes=\"(max-width: 502px) 100vw, 502px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 502px; --smush-placeholder-aspect-ratio: 502\/158;\" \/><\/a><\/p>\n<p>Pub-Sub Message exchange pattern&#8217;ini hat\u0131rlarsak Publisher taraf\u0131ndan exchange i\u00e7in g\u00f6nderilen message, queue \u00fczerinde kendisine ba\u011fl\u0131 olan t\u00fcm Subscriber&#8217;lara distributed olarak\u00a0g\u00f6nderilmekteydi. Bu sefer ki exchange i\u015flemini ise <strong>Fanout<\/strong> olarak ger\u00e7ekle\u015ftirece\u011fiz. Fanout exchange tipi isminden de anla\u015f\u0131labilece\u011fi \u00fczere ayn\u0131 message, farkl\u0131 consumer&#8217;lar taraf\u0131ndan farkl\u0131 yollarla process edilmeye ihtiya\u00e7 duyuldu\u011funda kullan\u0131lmaktad\u0131r.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/10\/fanout-exchange.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-841 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/10\/fanout-exchange.png\" alt=\"fanout-exchange\" width=\"474\" height=\"501\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/10\/fanout-exchange.png 474w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/10\/fanout-exchange-284x300.png 284w\" data-sizes=\"(max-width: 474px) 100vw, 474px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 474px; --smush-placeholder-aspect-ratio: 474\/501;\" \/><\/a><\/p>\n<p>Bir ba\u015fka de\u011fi\u015fle yukar\u0131da bulunan\u00a0g\u00f6rsel\u00a0gibi fanout, kendisine ba\u011fl\u0131 olan t\u00fcm queue&#8217;lara ayn\u0131 message&#8217;\u0131 iletir.<\/p>\n<p>Konuya bir \u00f6rnek ile devam edelim. Bir e-ticaret sistemi d\u00fc\u015f\u00fcnelim ve sipari\u015f\u00a0i\u015flemi ger\u00e7ekle\u015fti\u011finde Publisher taraf\u0131ndan &#8220;foo.billing&#8221; ve &#8220;foo.shipping&#8221;\u00a0queue&#8217;lar\u0131na bu sipari\u015f bilgilerini\u00a0g\u00f6nderelim. Daha \u00f6nceki RabbitMQ makalesindeki projede kullanm\u0131\u015f oldu\u011fumuz baz\u0131 kodlar\u0131 kullanaca\u011f\u0131z. \u00d6ncelikle yeni bir solution olu\u015ftural\u0131m\u00a0ve &#8220;FanoutExMessaging.Common&#8221; isminde bir class library ekleyelim.\u00a0Ekleme i\u015fleminin ard\u0131ndan Nuget Package Manager \u00fczerinden &#8220;RabbitMQ.Client&#8221; paketini y\u00fckleyelim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/10\/rabbitmq-client.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-842 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/10\/rabbitmq-client.jpg\" alt=\"rabbitmq-client\" width=\"687\" height=\"208\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/10\/rabbitmq-client.jpg 687w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/10\/rabbitmq-client-300x91.jpg 300w\" data-sizes=\"(max-width: 687px) 100vw, 687px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 687px; --smush-placeholder-aspect-ratio: 687\/208;\" \/><\/a><\/p>\n<p>Ard\u0131ndan daha \u00f6nceki projede de kullanm\u0131\u015f oldu\u011fumuz &#8220;RabbitMQService&#8221; class&#8217;\u0131n\u0131 ekleyelim ve a\u015fa\u011f\u0131daki gibi tan\u0131mlayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true\">using RabbitMQ.Client;\r\n\r\nnamespace FanoutExMessaging.Common\r\n{\r\n    public class RabbitMQService\r\n    {\r\n        \/\/ localhost \u00fczerinde kurulu oldu\u011fu i\u00e7in host adresi olarak bunu kullan\u0131yorum.\r\n        private readonly string _hostName = \"localhost\";\r\n\r\n        public IConnection GetRabbitMQConnection()\r\n        {\r\n            ConnectionFactory connectionFactory = new ConnectionFactory()\r\n            {\r\n                \/\/ RabbitMQ'nun ba\u011flant\u0131 kuraca\u011f\u0131 host'u tan\u0131ml\u0131yoruz. Herhangi bir g\u00fcvenlik \u00f6nlemi koymak istersek, Management ekran\u0131ndan password ad\u0131mlar\u0131n\u0131 tan\u0131mlay\u0131p factory i\u00e7erisindeki \"UserName\" ve \"Password\" property'lerini set etmemiz yeterlidir.\r\n                HostName = _hostName\r\n            };\r\n\r\n            return connectionFactory.CreateConnection();\r\n        }\r\n    }\r\n}<\/pre>\n<p>Common katman\u0131 ile i\u015fimiz \u015fimdilik bu kadar. Solution \u00fczerine &#8220;FanoutExMessaging.Publisher&#8221; isminde yeni bir console application ekleyelim ard\u0131ndan\u00a0Nuget Package Manager \u00fczerinden &#8220;RabbitMQ.Client&#8221; paketini buraya da dahil edelim ve &#8220;FanoutExMessaging.Common&#8221; library&#8217;sini referans olarak g\u00f6stererek,\u00a0Publisher&#8217;\u0131 kodlamaya ba\u015flayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true\">using System;\r\nusing System.Text;\r\nusing FanoutExMessaging.Common;\r\nusing RabbitMQ.Client;\r\n\r\nnamespace FanoutExMessaging.Publisher\r\n{\r\n    class Program\r\n    {\r\n        static void Main(string[] args)\r\n        {\r\n            var rabbitMQService = new RabbitMQService();\r\n\r\n            using (var connection = rabbitMQService.GetRabbitMQConnection())\r\n            {\r\n                using (var channel = connection.CreateModel())\r\n                {\r\n                    channel.ExchangeDeclare(\"foo.exchange\", ExchangeType.Fanout, true, false, null);\r\n\r\n                    channel.QueueDeclare(\"foo.billing\", true, false, false, null);\r\n                    channel.QueueDeclare(\"foo.shipping\", true, false, false, null);\r\n\r\n                    channel.QueueBind(\"foo.billing\", \"foo.exchange\", \"\");\r\n                    channel.QueueBind(\"foo.shipping\", \"foo.exchange\", \"\");\r\n\r\n                    var publicationAddress = new PublicationAddress(ExchangeType.Fanout, \"foo.exchange\", \"\");\r\n\r\n                    channel.BasicPublish(publicationAddress, null,\r\n                        Encoding.UTF8.GetBytes(\"12345 numaral\u0131 sipari\u015f geldi.\"));\r\n                }\r\n            }\r\n\r\n            Console.WriteLine(\"Sipari\u015f publish i\u015flemi ger\u00e7ekle\u015ftirildi.\");\r\n            Console.ReadLine();\r\n        }\r\n    }\r\n}<\/pre>\n<p>Burada dikkat etmemiz gereken ilk yer\u00a0channel \u00fczerinde yeni bir <strong>exchange<\/strong> tan\u0131ml\u0131yoruz. Tan\u0131mlam\u0131\u015f oldu\u011fumuz bu exchange ile channel&#8217;\u0131n\u00a0&#8220;foo.exchange&#8221; isminde ve Fanout tipinde olaca\u011f\u0131n\u0131 belirtiyoruz. Ard\u0131ndan &#8220;foo.billing&#8221; ve &#8220;foo.shipping&#8221; isminde iki adet queue tan\u0131ml\u0131yor ve bu queue&#8217;lar\u0131 &#8220;foo.exchange&#8221; \u00fczerine bind ediyoruz. &#8220;PublicationAddress&#8221; class&#8217;\u0131 ile de message&#8217;\u0131n publish yap\u0131laca\u011f\u0131 adresi ve exchange type&#8217;\u0131n\u0131 tan\u0131ml\u0131yoruz.<\/p>\n<p>Tan\u0131mlamalar\u0131n ard\u0131ndan channel \u00fczerinde bulunan &#8220;BasicPublish&#8221; method&#8217;u ile, &#8220;12345 numaral\u0131 sipari\u015f geldi.&#8221; mesaj\u0131n\u0131 t\u00fcm queue&#8217;lara publish yap\u0131yoruz. Dilerseniz Publisher&#8217;\u0131\u00a0test edebilmek i\u00e7in \u00e7al\u0131\u015ft\u0131ral\u0131m ve RabbitMQ Management ekran\u0131 \u00fczerinden, Exchanges&#8217;in ve Queue&#8217;lar\u0131n olu\u015fup olu\u015fmad\u0131\u011f\u0131n\u0131 bir kontrol edelim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/10\/exchanges.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-843 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/10\/exchanges.jpg\" alt=\"exchanges\" width=\"573\" height=\"487\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/10\/exchanges.jpg 573w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/10\/exchanges-300x255.jpg 300w\" data-sizes=\"(max-width: 573px) 100vw, 573px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 573px; --smush-placeholder-aspect-ratio: 573\/487;\" \/><\/a><\/p>\n<p>Exchanges sekmesine bakt\u0131\u011f\u0131m\u0131zda en altta &#8220;foo.exchange&#8221; isminde &#8220;fanout&#8221; type&#8217;\u0131na sahip bir exchange olu\u015ftu\u011funu g\u00f6rebiliyoruz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/10\/queues.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-844 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/10\/queues.jpg\" alt=\"queues\" width=\"724\" height=\"296\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/10\/queues.jpg 724w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/10\/queues-300x123.jpg 300w\" data-sizes=\"(max-width: 724px) 100vw, 724px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 724px; --smush-placeholder-aspect-ratio: 724\/296;\" \/><\/a><\/p>\n<p>Queues sekmesinde ise &#8220;foo.billing&#8221; ve &#8220;foo.shipping&#8221; queue&#8217;lar\u0131 ba\u015far\u0131l\u0131 bir \u015fekilde olu\u015fmu\u015f durumdad\u0131r.<\/p>\n<p>\u015eimdi bu queue&#8217;lar\u0131 process edecek olan Consumer&#8217;lar\u0131 kodlayal\u0131m. \u00d6ncelikle solution \u00fczerine &#8220;FanoutExMessaging.BillingConsumer&#8221; isminde yeni bir console application olu\u015ftural\u0131m ve i\u00e7erisine Nuget\u00a0Package Manager \u00fczerinden &#8220;RabbitMQ.Client&#8221; paketini dahil edelim ve ard\u0131ndan &#8220;FanoutExMessaging.Common&#8221; library&#8217;sini referans olarak ekleyelim.<\/p>\n<p><strong>BillingConsumer<\/strong>\u00a0main method&#8217;unu a\u015fa\u011f\u0131daki gibi kodlayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true \">using System;\r\nusing System.Text;\r\nusing FanoutExMessaging.Common;\r\nusing RabbitMQ.Client;\r\nusing RabbitMQ.Client.Events;\r\n\r\nnamespace FanoutExMessaging.BillingConsumer\r\n{\r\n    class Program\r\n    {\r\n        static void Main(string[] args)\r\n        {\r\n            var rabbitMQService = new RabbitMQService();\r\n\r\n            using (var connection = rabbitMQService.GetRabbitMQConnection())\r\n            {\r\n                using (var channel = connection.CreateModel())\r\n                {\r\n                    var consumer = new EventingBasicConsumer(channel);\r\n\r\n                    consumer.Received += (model, ea) =&gt;\r\n                    {\r\n                        var body = ea.Body;\r\n                        var message = Encoding.UTF8.GetString(body);\r\n\r\n                        Console.WriteLine(\"foo.billing \u00fczerinden mesaj al\u0131nd\u0131: {0}\", message);\r\n                    };\r\n\r\n                    channel.BasicConsume(\"foo.billing\", false, consumer);\r\n                    Console.ReadLine();\r\n                }\r\n            }\r\n        }\r\n    }\r\n}<\/pre>\n<p>Burada ise yapt\u0131\u011f\u0131m\u0131z channel \u00fczerinden &#8220;foo.billing&#8221; queue&#8217;suna ba\u011flanmakt\u0131r.<\/p>\n<p>\u0130kinci queue&#8217;muz olan &#8220;foo.shipping&#8221; i\u00e7in &#8220;FanoutExMessaging.ShippingConsumer&#8221; isminde yeni bir console application daha ekleyelim ard\u0131ndan Nuget Package Manager \u00fczerinden &#8220;RabbitMQ.Client&#8221; paketini dahil ederek,\u00a0&#8220;FanoutExMessaging.Common&#8221; library&#8217;sini referans olarak ekleyelim. &#8220;foo.billing&#8221; de oldu\u011fu gibi t\u00fcm kodlar\u0131m\u0131 ayn\u0131 olacak. Buradaki tek fark ise &#8220;foo.billing&#8221; queue&#8217;su yerine, &#8220;foo.shipping&#8221; queue&#8217;suna ba\u011flanmam\u0131z olacak.<\/p>\n<p><strong>ShippingConsumer<\/strong> main method&#8217;unu a\u015fa\u011f\u0131daki gibi kodlayal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true \">using System;\r\nusing System.Text;\r\nusing FanoutExMessaging.Common;\r\nusing RabbitMQ.Client;\r\nusing RabbitMQ.Client.Events;\r\n\r\nnamespace FanoutExMessaging.ShippingConsumer\r\n{\r\n    class Program\r\n    {\r\n        static void Main(string[] args)\r\n        {\r\n            var rabbitMQService = new RabbitMQService();\r\n\r\n            using (var connection = rabbitMQService.GetRabbitMQConnection())\r\n            {\r\n                using (var channel = connection.CreateModel())\r\n                {\r\n                    var consumer = new EventingBasicConsumer(channel);\r\n\r\n                    consumer.Received += (model, ea) =&gt;\r\n                    {\r\n                        var body = ea.Body;\r\n                        var message = Encoding.UTF8.GetString(body);\r\n\r\n                        Console.WriteLine(\"foo.shipping \u00fczerinden mesaj al\u0131nd\u0131: {0}\", message);\r\n                    };\r\n\r\n                    channel.BasicConsume(\"foo.shipping\", false, consumer);\r\n                    Console.ReadLine();\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>\u015euan elimizde bir Publisher ve iki adet Consumer bulunmakta. Solution&#8217;\u0131n ayarlar\u0131ndan &#8220;FanoutExMessaging.BillingConsumer&#8221; ve &#8220;FanoutExMessaging.ShippingConsumer&#8221; \u0131n ayn\u0131 anda \u00e7al\u0131\u015fabilmesi i\u00e7in multiple startup&#8217;\u0131 se\u00e7elim.<\/p>\n<p>Projeyi \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda, a\u015fa\u011f\u0131daki gibi iki adet console uygulamas\u0131 a\u00e7\u0131lacakt\u0131r.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/10\/rabbitmq-test-1.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-845 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/10\/rabbitmq-test-1.jpg\" alt=\"rabbitmq-test-1\" width=\"511\" height=\"194\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/10\/rabbitmq-test-1.jpg 511w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/10\/rabbitmq-test-1-300x114.jpg 300w\" data-sizes=\"(max-width: 511px) 100vw, 511px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 511px; --smush-placeholder-aspect-ratio: 511\/194;\" \/><\/a><\/p>\n<p>Bakt\u0131\u011f\u0131m\u0131zda iki\u00a0consumer \u00fczerinde birer adet ayn\u0131 mesaj bulunmaktad\u0131r. Bunun sebebi ise\u00a0Publisher&#8217;\u0131 test edebilmek i\u00e7in \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zdan dolay\u0131 &#8220;foo.billing&#8221; ve &#8220;foo.shipping&#8221; queue&#8217;lar\u0131na test mesaj\u0131n\u0131n g\u00f6nderilmesidir. \u0130ki consumer a\u00e7\u0131kken Publisher&#8217;\u0131 tekrardan \u00e7al\u0131\u015ft\u0131ral\u0131m ve sonucunu izleyelim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/10\/rabbitmq-test-2.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-846 lazyload\" data-src=\"\/wp-content\/uploads\/2016\/10\/rabbitmq-test-2.jpg\" alt=\"rabbitmq-test-2\" width=\"513\" height=\"277\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/10\/rabbitmq-test-2.jpg 513w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/10\/rabbitmq-test-2-300x162.jpg 300w\" data-sizes=\"(max-width: 513px) 100vw, 513px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 513px; --smush-placeholder-aspect-ratio: 513\/277;\" \/><\/a><\/p>\n<p>Publisher&#8217;\u0131n tekrardan \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 sonucunda fanout exchange arac\u0131l\u0131\u011f\u0131 ile t\u00fcm queue&#8217;lara ayn\u0131 mesaj tekrardan g\u00f6nderilmi\u015ftir. Bu i\u015flemin ard\u0131ndan ise ilgili consumer&#8217;lar, kendi queue&#8217;lar\u0131nda bulunan\u00a0mesaj\u0131 fetch etmi\u015flerdir.<\/p>\n<p>Makalemizi sonland\u0131r\u0131rken tekrardan belirtmek gerekirse,\u00a0e\u011fer ayn\u0131 i\u015fi farkl\u0131 \u015fekillerde ve farkl\u0131 consumer&#8217;lar taraf\u0131ndan process edilme ihtiyac\u0131 duyulursa bu \u00f6rne\u011fimizde oldu\u011fu gibi,\u00a0<strong>fanout exchange<\/strong> type&#8217;\u0131 kolay bir \u015fekilde\u00a0kullan\u0131labilinir.<\/p>\n<p>Takipte kal\u0131n&#8230;<\/p>\n<p><a href=\"\/wp-content\/uploads\/2016\/10\/FanoutExMessagingWithRabbitMQ.rar\">fanoutexmessagingwithrabbitmq<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba arkada\u015flar. Bir s\u00fcredir Messaging sistemleri \u00fczerinde yo\u011fun bir \u015fekilde \u00e7al\u0131\u015fmaktay\u0131m. Bu makalede ise RabbitMQ&#8217;da Publish-Subscribe\u00a0pattern&#8217;i ile Fanout Exchange&#8216;e\u00a0de\u011finmeye \u00e7al\u0131\u015faca\u011f\u0131m. \u00d6ncelikle t\u00fcm bu i\u015flemlere ba\u015flamadan RabbitMQ hakk\u0131ndaki bilgilerimizi tazeleyebilmek ad\u0131na,\u00a0buraya\u00a0t\u0131klayarak RabbitMQ hakk\u0131nda daha \u00f6nce yazd\u0131\u011f\u0131m makalelere bir g\u00f6z atabilirsiniz. Dilerseniz konuya girmeden \u00f6nce biraz messaging&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">RabbitMQ ve Publish-Subscribe Patterni ile Fanout Exchange<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[68,285,152],"tags":[290,287,288,286,191,153,289,291,187],"class_list":["post-831","post","type-post","status-publish","format-standard","hentry","category-architectural","category-messaging","category-rabbitmq","tag-c-messaging","tag-c-rabbitmq","tag-fanout-exchange","tag-messaging","tag-publish-subscribe-pattern","tag-rabbitmq","tag-rabbitmq-fanout-exchange","tag-rabbitmq-ile-messaging","tag-rabbitmq-kullanimi","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":false,"content":false,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>RabbitMQ ve Publish-Subscribe Patterni ile Fanout Exchange - G\u00f6khan G\u00f6kalp<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gokhan-gokalp.com\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"RabbitMQ ve Publish-Subscribe Patterni ile Fanout Exchange - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2016-10-02T21:14:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-10-02T21:16:30+00:00\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"RabbitMQ ve Publish-Subscribe Patterni ile Fanout Exchange\",\"datePublished\":\"2016-10-02T21:14:32+00:00\",\"dateModified\":\"2016-10-02T21:16:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\\\/\"},\"wordCount\":922,\"commentCount\":7,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"keywords\":[\"c# messaging\",\"C# RabbitMQ\",\"Fanout Exchange\",\"Messaging\",\"Publish Subscribe Pattern\",\"RabbitMQ\",\"RabbitMQ Fanout Exchange\",\"RabbitMQ ile Messaging\",\"RabbitMQ kullan\u0131m\u0131\"],\"articleSection\":[\"Architectural\",\"Messaging\",\"RabbitMQ\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\\\/\",\"name\":\"RabbitMQ ve Publish-Subscribe Patterni ile Fanout Exchange - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"datePublished\":\"2016-10-02T21:14:32+00:00\",\"dateModified\":\"2016-10-02T21:16:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"RabbitMQ ve Publish-Subscribe Patterni ile Fanout Exchange\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"RabbitMQ ve Publish-Subscribe Patterni ile Fanout Exchange - G\u00f6khan G\u00f6kalp","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gokhan-gokalp.com\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\/","og_locale":"tr_TR","og_type":"article","og_title":"RabbitMQ ve Publish-Subscribe Patterni ile Fanout Exchange - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2016-10-02T21:14:32+00:00","article_modified_time":"2016-10-02T21:16:30+00:00","author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"6 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"RabbitMQ ve Publish-Subscribe Patterni ile Fanout Exchange","datePublished":"2016-10-02T21:14:32+00:00","dateModified":"2016-10-02T21:16:30+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\/"},"wordCount":922,"commentCount":7,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"keywords":["c# messaging","C# RabbitMQ","Fanout Exchange","Messaging","Publish Subscribe Pattern","RabbitMQ","RabbitMQ Fanout Exchange","RabbitMQ ile Messaging","RabbitMQ kullan\u0131m\u0131"],"articleSection":["Architectural","Messaging","RabbitMQ"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\/","url":"https:\/\/gokhan-gokalp.com\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\/","name":"RabbitMQ ve Publish-Subscribe Patterni ile Fanout Exchange - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"datePublished":"2016-10-02T21:14:32+00:00","dateModified":"2016-10-02T21:16:30+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/rabbitmq-ve-publish-subscribe-patterni-ile-fanout-exchange\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"RabbitMQ ve Publish-Subscribe Patterni ile Fanout Exchange"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/831","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=831"}],"version-history":[{"count":11,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/831\/revisions"}],"predecessor-version":[{"id":852,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/831\/revisions\/852"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=831"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=831"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=831"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}