﻿
{"id":13751,"date":"2020-02-28T22:20:43","date_gmt":"2020-02-28T22:20:43","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=13751"},"modified":"2020-02-28T23:22:58","modified_gmt":"2020-02-28T23:22:58","slug":"rabbitmq-fanout-exchange","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/rabbitmq-fanout-exchange\/","title":{"rendered":"RabbitMQ &#8211; Fanout Exchange"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>RabbitMQ kendisine g\u00f6nderilen mesajlar\u0131 direkt olarak olu\u015fturulan kuyru\u011fa eklemekte ve consumerlar ise bu mesajlar\u0131 s\u0131ras\u0131yla t\u00fcketmektedir. S\u00fcre\u00e7 bu \u015fekilde ilerlerken birden fazla consumer\u0131n oldu\u011fu durumlarda mesaj t\u00fcketiminin nas\u0131l bir algoritma taraf\u0131ndan i\u015flenece\u011fini ve hangi consumer\u0131n ne kadar mesaj\u0131 i\u015fleyece\u011fini bildirmemiz gerekmektedir. \u0130\u015fte bu durumda devreye exchangeler girmekte ve t\u00fcr\u00fcne g\u00f6re exchange ile kuyru\u011fa g\u00f6nderilen mesajlar t\u00fcr\u00fcn getirdi\u011fi i\u015fleme mant\u0131\u011f\u0131na g\u00f6re t\u00fcketicilere g\u00f6nderilerek i\u015fletilmektedir. Bizler bu i\u00e7eri\u011fimizde ilk olarak t\u00fcm consumerlara mesajlar\u0131n iletilmesini sa\u011flayan Fanout Exchange yap\u0131lanmas\u0131n\u0131 inceleyece\u011fiz.<\/p>\n<h3>Exchange Nedir?<\/h3>\n<p>Bu i\u00e7eri\u011fimiz exchangelerle ilgili ilk makalemiz olaca\u011f\u0131ndan dolay\u0131 bu soruyu cevapland\u0131rarak konuya girmek istiyorum \ud83d\ude42<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Nedir..png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13381\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Nedir..png\" alt=\"RabbitMQ Nedir?\" width=\"684\" height=\"290\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Nedir..png 684w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Nedir.-300x127.png 300w\" sizes=\"auto, (max-width: 684px) 100vw, 684px\" \/><\/a><br \/>\nYukar\u0131daki \u015femay\u0131 incelerseniz e\u011fer RabbitMQ servislerine g\u00f6nderilen mesajlar exchange taraf\u0131ndan kar\u015f\u0131lanmakta ve exchange&#8217;in t\u00fcr\u00fcne g\u00f6re ilgili kuyru\u011fa iletilerek, dahil edilmekte ve bu kuyru\u011fu takip eden t\u00fcm consumerlar taraf\u0131ndan mesajlar t\u00fcketilmekte bir ba\u015fka deyi\u015fle i\u015flenmektedir..<\/p>\n<p>Burada consumerlar taraf\u0131ndan kuyruklar\u0131n takip edilmesi durumunu, mesaj\u0131 yay\u0131nlayan(publisher) bu yay\u0131nlara abone\/subscribe olan consumerlar\u0131n olmas\u0131ndan dolay\u0131 <em style=\"color: orange;\">Publish\/Subscribe Pattern<\/em> olarak ifade etmekteyiz.<\/p>\n<h3>Fanout Exchange \u0130\u015fleyi\u015fi Nas\u0131ld\u0131r?<\/h3>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Fanout-Exchange.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13755\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Fanout-Exchange.png\" alt=\"v\" width=\"1150\" height=\"419\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Fanout-Exchange.png 1150w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Fanout-Exchange-300x109.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Fanout-Exchange-1024x373.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Fanout-Exchange-768x280.png 768w\" sizes=\"auto, (max-width: 1150px) 100vw, 1150px\" \/><\/a><br \/>\nFanout exchange yukar\u0131daki g\u00f6rselden de anla\u015f\u0131laca\u011f\u0131 gibi ald\u0131\u011f\u0131 mesaj\u0131 direkt olarak t\u00fcm kuyruklara da\u011f\u0131tmakta ve b\u00f6ylece kuyruklar\u0131 dinleyen t\u00fcm consumerlara i\u015fletmektedir.<br \/>\nGenellikle a\u015fa\u011f\u0131daki durumlara benzer senaryolarda tercih edilebilir;<\/p>\n<ul>\n<li>G\u00fcncel skorlar\u0131n t\u00fcm oyunculara bildirilmesi,<\/li>\n<li>Hava durumu bilgisinin t\u00fcm kanallarda yay\u0131nlanmas\u0131,<\/li>\n<li>T\u00fcm birimlere %n&#8217;lik bir ikramiyede bulunulmas\u0131<\/li>\n<\/ul>\n<p>vs&#8230;<br \/>\nYani anlayaca\u011f\u0131n\u0131z \u00fczere umumi bir operasyon yahut bildirim s\u00f6z konusuysa Fanout Exchange kullan\u0131labilir.<\/p>\n<h3>Kullan\u0131m\u0131<\/h3>\n<h4>Publisher<\/h4>\n<p>Art\u0131k bir exchange kullan\u0131laca\u011f\u0131ndan dolay\u0131 publisher taraf\u0131nda bir kuyruk olu\u015fturmak yerine exchange olu\u015fturulmal\u0131 ve ard\u0131ndan mesajlar ilgili exchange&#8217;e g\u00f6nderilmelidir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            ConnectionFactory factory = new ConnectionFactory();\r\n            factory.Uri = new Uri(&quot;amqp:\/\/hkhjerrt:hcqiavAqll6-co4abXnSqUBh_hHifz-Z@hornet.rmq.cloudamqp.com\/hkhjerrt&quot;);\r\n\r\n            using (IConnection connection = factory.CreateConnection())\r\n            using (IModel channel = connection.CreateModel())\r\n            {\r\n                channel.ExchangeDeclare(&quot;iskuyrugu&quot;, type: ExchangeType.Fanout);\r\n                for (int i = 1; i &lt;= 100; i++)\r\n                {\r\n                    byte&#x5B;] bytemessage = Encoding.UTF8.GetBytes($&quot;is - {i}&quot;);\r\n\r\n                    IBasicProperties properties = channel.CreateBasicProperties();\r\n                    properties.Persistent = true;\r\n\r\n                    channel.BasicPublish(exchange: &quot;iskuyrugu&quot;, routingKey: &quot;&quot;, basicProperties: properties, body: bytemessage);\r\n                }\r\n            }\r\n        }\r\n<\/pre>\n<p>Yukar\u0131daki publisher kayna\u011f\u0131n\u0131 temsil eden kod blo\u011funa g\u00f6z atarsan\u0131z e\u011fer <strong><em>9.<\/em><\/strong> sat\u0131rda &#8220;ExchangeDeclare&#8221; metodu ile bir exchange olu\u015fturulmu\u015f ve ard\u0131ndan &#8216;type&#8217; parametresine verilen &#8216;ExchangeType.Fanout&#8217; komutuylada t\u00fcr\u00fc belirtilmi\u015ftir. Ayr\u0131ca <strong><em>17.<\/em><\/strong> sat\u0131rda ise olu\u015fturulan exchange&#8217;in &#8220;BasicPublish&#8221; metoduna belirtildi\u011finide g\u00f6zden ka\u00e7\u0131rmay\u0131n\u0131z&#8230;<\/p>\n<h4>Consumer<\/h4>\n<p>Exchange kullanmad\u0131\u011f\u0131m\u0131z \u00f6nceki makalelerimizde manuel bir queue declare ediyor ve ard\u0131ndan t\u00fcm mesajlar\u0131m\u0131z\u0131 o kuyru\u011fa g\u00f6nderiyorduk. Bu i\u00e7eri\u011fimizde biraz \u00f6nce(yukar\u0131da) exchange olu\u015fturduk ve o exchange \u00fczerinden kuyru\u011fa mesajlar\u0131m\u0131z\u0131 iletilece\u011fini belirttik. Lakin sizden <strong><em>hoca kuyruk olu\u015fturmad\u0131n ki mesajlar iletilsin!<\/em><\/strong> \u015feklinde bir duyum ald\u0131m gibiyim&#8230; Evet, exchange declare edildikten sonra bir kuyruk olu\u015fturmad\u0131k \u00e7\u00fcnk\u00fc ne zaman ki bir consumer herhangi bir exchange \u00fczerinden ba\u011flant\u0131 sa\u011flayarak mesajlar\u0131n\u0131 iletir o zaman otomatik bir queue olu\u015fturulacak ve ona ba\u011flanacakt\u0131r. \u0130\u015fte bu y\u00fczden ekstradan bir kuyruk olu\u015fturma gere\u011fi duymam\u0131\u015f bulunmaktay\u0131m.<\/p>\n<blockquote><p>Bir exchange&#8217;e birden fazla consumer ba\u011flan\u0131p aya\u011fa kalkarsa e\u011fer bu consumerlar\u0131n her biri i\u00e7in ayr\u0131 ayr\u0131 kuyruk olu\u015fturulacakt\u0131r.<\/p><\/blockquote>\n<p>A\u015fa\u011f\u0131daki \u00f6rnek consumer kodunu ele al\u0131rsak e\u011fer;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        static void Main(string&#x5B;] args)\r\n        {\r\n            ConnectionFactory factory = new ConnectionFactory();\r\n            factory.Uri = new Uri(&quot;amqp:\/\/hkhjerrt:hcqiavAqll6-co4abXnSqUBh_hHifz-Z@hornet.rmq.cloudamqp.com\/hkhjerrt&quot;);\r\n\r\n            using (IConnection connection = factory.CreateConnection())\r\n            using (IModel channel = connection.CreateModel())\r\n            {\r\n                channel.ExchangeDeclare(&quot;iskuyrugu&quot;, type: ExchangeType.Fanout);\r\n\r\n                #region Her Consumer \u0130\u00e7in Olu\u015fturulacak Kuyruklara Random \u0130sim Olu\u015fturma\r\n                string queueName = channel.QueueDeclare().QueueName; \/\/Random isim olu\u015fturuyoruz.\r\n                channel.QueueBind(queue: queueName, exchange: &quot;iskuyrugu&quot;, routingKey: &quot;&quot;); \/\/Olu\u015fturulan Random ismi ilgili exchange'e bind ediyoruz.\r\n                #endregion\r\n\r\n                channel.BasicQos(prefetchSize: 0, prefetchCount: 1, global: false);\r\n\r\n                EventingBasicConsumer consumer = new EventingBasicConsumer(channel);\r\n                channel.BasicConsume(queueName, false, consumer);\r\n                consumer.Received += (sender, e) =&gt;\r\n                {\r\n                    Thread.Sleep(int.Parse(args&#x5B;0]));\r\n                    Console.WriteLine(Encoding.UTF8.GetString(e.Body) + &quot; al\u0131nd\u0131&quot;);\r\n                    channel.BasicAck(e.DeliveryTag, false);\r\n                };\r\n                Console.Read();\r\n            }\r\n<\/pre>\n<p><strong><em>9.<\/em><\/strong> sat\u0131rda publisher&#8217;da ki ile birebir ayn\u0131 bir exchange declare etmi\u015f bulunmaktay\u0131z. <strong><em>11<\/em><\/strong> &#8211; <strong><em>14.<\/em><\/strong> sat\u0131rlar aras\u0131nda her consumer i\u00e7in olu\u015fturulacak queue&#8217;nin ad\u0131n\u0131 random olu\u015fturabilmek i\u00e7in bir isim \u00fcretmekteyiz ve bu ismi ilgili declare edilen exchange ile bind etmekteyiz. <strong><em>19.<\/em><\/strong> sat\u0131rda ise art\u0131k consumer&#8217;\u0131n do\u011fru kuyru\u011fu t\u00fcketmesi i\u00e7in &#8220;BasicConsume&#8221; metodunda random olu\u015fturulan kuyruk ismini vermekteyiz.<\/p>\n<h3>Test<\/h3>\n<p>Yap\u0131lan \u00e7al\u0131\u015fmalar\u0131 derleyip \u00e7al\u0131\u015ft\u0131rd\u0131ktan sonra <a href=\"https:\/\/hornet.rmq.cloudamqp.com\/\" rel=\"noopener noreferrer\" target=\"_blank\">hornet.rmq.cloudamqp.com<\/a> adresindeki cloud servise g\u00f6z att\u0131\u011f\u0131m\u0131zda ilgili exchange&#8217;in olu\u015fturuldu\u011funu g\u00f6rmekteyiz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-\u2013-Fanout-Exchange.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-\u2013-Fanout-Exchange.png\" alt=\"RabbitMQ \u2013 Fanout Exchange\" width=\"528\" height=\"608\" class=\"aligncenter size-full wp-image-13799\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-\u2013-Fanout-Exchange.png 528w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-\u2013-Fanout-Exchange-261x300.png 261w\" sizes=\"auto, (max-width: 528px) 100vw, 528px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Fanout-Exchange.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-13789\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Fanout-Exchange.gif\" alt=\"v\" width=\"800\" height=\"466\" \/><\/a><br \/>\nEvet&#8230; G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere RabbitMQ &#8211; Fanout Exchange ile abone olan t\u00fcm consumerlar\u0131n kuyruklar\u0131na e\u015fit \u015fekilde mesajlar\u0131m\u0131z iletilmekte ve biryandan da consumerlar taraf\u0131ndan t\u00fcketilmektedir.<\/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 uygulamay\u0131 indirmek i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQExample.zip\">buraya<\/a> t\u0131klay\u0131n\u0131z.<\/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, RabbitMQ kendisine g\u00f6nderilen mesajlar\u0131 direkt olarak olu\u015fturulan kuyru\u011fa eklemekte ve consumerlar ise bu mesajlar\u0131 s\u0131ras\u0131yla t\u00fcketmektedir. S\u00fcre\u00e7 bu \u015fekilde ilerlerken birden fazla consumer\u0131n oldu\u011fu durumlarda mesaj t\u00fcketiminin nas\u0131l bir algoritma taraf\u0131ndan i\u015flenece\u011fini ve&#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":13755,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3156],"tags":[3223,3221,3158,3222],"class_list":["post-13751","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-rabbitmq","tag-fanout-exchange","tag-publish-subscribe-pattern","tag-rabbitmq","tag-rabbitmq-fanout-exchange"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/13751","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=13751"}],"version-history":[{"count":43,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/13751\/revisions"}],"predecessor-version":[{"id":13800,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/13751\/revisions\/13800"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/13755"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=13751"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=13751"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=13751"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}