﻿
{"id":13499,"date":"2020-02-21T11:47:13","date_gmt":"2020-02-21T11:47:13","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=13499"},"modified":"2020-02-21T11:47:13","modified_gmt":"2020-02-21T11:47:13","slug":"rabbitmq-basitce-kuyruga-mesaj-gonderme-ve-okuma","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/rabbitmq-basitce-kuyruga-mesaj-gonderme-ve-okuma\/","title":{"rendered":"RabbitMQ &#8211; Basit\u00e7e Kuyru\u011fa Mesaj G\u00f6nderme ve Okuma"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde bir uygulama \u00fczerinden kuyru\u011fa mesaj g\u00f6ndermeyi ve ba\u015fka bir uygulama taraf\u0131ndan bu mesaj\u0131 okumay\u0131 ele alan basit bir RabbitMQ uygulamas\u0131 \u00fczerine \u00e7al\u0131\u015f\u0131yor olacak ve b\u00f6ylece RabbitMQ&#8217;nun yaz\u0131l\u0131msal temelleriyle birlikte yap\u0131sal prensiplerini de ortaya koyuyor olaca\u011f\u0131z. <\/p>\n<p>\u0130lk olarak en sade mesaj g\u00f6nderme senaryosunda kullanaca\u011f\u0131m\u0131z kuyruk yap\u0131lanmas\u0131n\u0131 ve temel akt\u00f6rleri \u015fematik bir \u015fekilde ele alarak ba\u015flayal\u0131m.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma.png\" alt=\"v\" width=\"598\" height=\"154\" class=\"aligncenter size-full wp-image-13507\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma.png 598w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-300x77.png 300w\" sizes=\"auto, (max-width: 598px) 100vw, 598px\" \/><\/a><br \/>\nYukar\u0131daki \u015femaya g\u00f6z atarsan\u0131z e\u011fer RabbitMQ&#8217;ya dair ilk olarak ele ald\u0131\u011f\u0131m\u0131z makalemizdeki<span style=\"font-size:10px;\">(bknz: <a href=\"https:\/\/www.gencayyildiz.com\/blog\/rabbitmq-nedir-ne-amaca-hizmet-etmektedir#rabbitmqisleyis\" rel=\"noopener noreferrer\" target=\"_blank\">RabbitMQ Nedir? Ne Amaca Hizmet Etmektedir?<\/a>)<\/span> g\u00f6rselde Exchange diye bir yap\u0131lanman\u0131n oldu\u011funu lakin bu yukar\u0131daki \u015femada ise olmad\u0131\u011f\u0131n\u0131 g\u00f6rmekteyiz. \u0130lerideki makalelerimizde bol bol kendisinden bahsedece\u011fimiz exchange mekanizmas\u0131 basit bir mesaj g\u00f6nderme i\u015flemi gibi en temel yap\u0131lanmalarda kullan\u0131lmas\u0131na gerek olmayan bir yap\u0131lanmad\u0131r. Her ne kadar taraf\u0131m\u0131zca kullan\u0131lmasada sistem taraf\u0131ndan olmas\u0131 gereken bu yap\u0131lanman\u0131n bu tarz durumlarda varsay\u0131lan olarak tan\u0131mlanm\u0131\u015f olan default exchange&#8217;i devreye girmektedir.<\/p>\n<p>Tekrardan \u015femaya d\u00f6nersek e\u011fer en temel i\u015flem olan kuyru\u011fa mesaj g\u00f6nderme i\u015fini <em><strong>P<\/strong>ublisher<\/em>, kuyruktan okuma i\u015fini ise <em><strong>C<\/strong>onsumer<\/em> \u00fcstlenmektedir. Kuyru\u011fa g\u00f6nderilen mesajlar First In First Out(FIFO) mant\u0131\u011f\u0131na g\u00f6re s\u0131ralanmakta ve ilk g\u00f6nderilen mesaj ilk olarak t\u00fcketilmektedir.<\/p>\n<p>\u015eimdi bu teorik bilgilendirmeden sonra pratik uygulama \u00fczerinden \u00f6rneklendirmeye ge\u00e7ebiliriz.<\/p>\n<h3>Publisher ve Consumer Tasarlama<\/h3>\n<p>Yukar\u0131da bahsedildi\u011fi gibi en temel senaryoda bile sadece Publisher ve Consumer olmak \u00fczere iki akt\u00f6r\u00fcm\u00fcz mevcuttur. Bizler bu akt\u00f6rleri birer Console Application olarak olu\u015fturacak ve tasarlayaca\u011f\u0131z. Tabi ki de sizler ger\u00e7ek ihtiya\u00e7lar\u0131n\u0131za d\u00f6n\u00fck uygulamalar se\u00e7ebilir ve i\u00e7erikte ele alaca\u011f\u0131m\u0131z t\u00fcm RabbitMQ nimetlerinden faydalanabilirsiniz.<\/p>\n<ul>\n<li>\n<h4 style=\"color:orange;\">Publisher Tasar\u0131m\u0131 &#8211; Kuyru\u011fa Mesaj G\u00f6nderme<\/h4>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-2.png\" alt=\"\" width=\"202\" height=\"73\" class=\"aligncenter size-full wp-image-13550\" \/><\/a><\/p>\n<blockquote><p>Publisher, RabbitMQ servisindeki kuyru\u011fa mesaj g\u00f6nderen uygulamad\u0131r.<\/p><\/blockquote>\n<p>.NET Core platformunda RabbitMQ kullanabilmek i\u00e7in \u00f6ncelikle ilgili projeye <a href=\"https:\/\/www.nuget.org\/packages\/RabbitMQ.Client\" rel=\"noopener noreferrer\" target=\"_blank\">RabbitMQ.Client<\/a> Nuget paketinin y\u00fcklenmesi gerekmektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-1.png\" alt=\"v\" width=\"596\" height=\"181\" class=\"aligncenter size-full wp-image-13532\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-1.png 596w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-1-300x91.png 300w\" sizes=\"auto, (max-width: 596px) 100vw, 596px\" \/><\/a><\/p>\n<ul>\n<li><strong>Ba\u011flant\u0131 Olu\u015fturma<\/strong><br \/>\nPublisher&#8217;\u0131n mesaj g\u00f6nderebilmesi i\u00e7in her\u015feyden \u00f6nce RabbitMQ sunucular\u0131na ba\u011flant\u0131 olu\u015fturmam\u0131z gerekmektedir. Bunun i\u00e7in;<\/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            \/\/factory.HostName = &quot;localhost&quot;;\r\n        }\r\n<\/pre>\n<p>\u015feklinde \u00e7al\u0131\u015fabiliriz. Koda g\u00f6z atarsan\u0131z e\u011fer &#8220;ConnectionFactory&#8221; s\u0131n\u0131f\u0131 \u00fczerinden bu ba\u011flant\u0131n\u0131n tan\u0131mland\u0131\u011f\u0131n\u0131 g\u00f6rebilirsiniz. Burada <em><strong>4.<\/strong><\/em> sat\u0131r ile <em><strong>5.<\/strong><\/em> sat\u0131r aras\u0131ndaki farka de\u011finmem gerekirse e\u011fer; <em><strong>4.<\/strong><\/em> sat\u0131r CloudAMQP sunucular\u0131nda bar\u0131nd\u0131r\u0131lan RabbitMQ instance&#8217;\u0131na ba\u011flant\u0131 kurabilmek i\u00e7in taraf\u0131m\u0131za verilen AMQP URL de\u011feri iken, <em><strong>5.<\/strong><\/em> sat\u0131rda ise localdeki RabbitMQ sunucuna ba\u011flanmak i\u00e7indir.\n<\/li>\n<li><strong>Ba\u011flant\u0131 Sa\u011flama ve Kanal A\u00e7ma<\/strong><br \/>\nOlu\u015fturulan ba\u011flant\u0131 hatt\u0131 \u00fczerinden ba\u011flant\u0131y\u0131 aktifle\u015ftirelim ve ard\u0131ndan bu ba\u011flant\u0131 \u00fczerinden kullanaca\u011f\u0131m\u0131z kuyru\u011fu olu\u015fturabilmek i\u00e7in bir kanal a\u00e7al\u0131m.<\/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            \/\/factory.HostName = &quot;localhost&quot;;\r\n\r\n            using (IConnection connection = factory.CreateConnection())\r\n            using (IModel channel = connection.CreateModel())\r\n            {\r\n\r\n            }\r\n        }\r\n<\/pre>\n<p><em><strong>7.<\/strong><\/em> sat\u0131rda ba\u011flant\u0131 sa\u011flanmakta, <em><strong>8.<\/strong><\/em> sat\u0131rda bir kanal olu\u015fturulmaktad\u0131r. Bu i\u015flemden sonra kuyruk olu\u015fturabiliriz.\n<\/li>\n<li><strong>Kuyruk Olu\u015fturma<\/strong>\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            \/\/factory.HostName = &quot;localhost&quot;;\r\n\r\n            using (IConnection connection = factory.CreateConnection())\r\n            using (IModel channel = connection.CreateModel())\r\n            {\r\n                channel.QueueDeclare(&quot;mesajkuyrugu&quot;, false, false, true);\r\n            }\r\n        }\r\n<\/pre>\n<p>Burada <em><strong>10.<\/strong><\/em> sat\u0131ra g\u00f6z atarsan\u0131z e\u011fer kanal \u00fczerinden QueueDeclare metodu arac\u0131l\u0131\u011f\u0131yla bir kuyruk olu\u015fturulmu\u015ftur. \u0130lgili metodun parametrelerini izah edebilmek i\u00e7in a\u015fa\u011f\u0131daki g\u00f6rseli ele alal\u0131m;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-3.png\" alt=\"RabbitMQ - Basit\u00e7e Kuyru\u011fa Mesaj G\u00f6nderme ve Okuma\" width=\"983\" height=\"80\" class=\"aligncenter size-full wp-image-13559\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-3.png 983w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-3-300x24.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-3-768x63.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-3-980x80.png 980w\" sizes=\"auto, (max-width: 983px) 100vw, 983px\" \/><\/a><\/p>\n<ul>\n<li><em>queue<\/em> : Olu\u015fturulacak kuyru\u011fun ad\u0131n\u0131 belirliyoruz.<\/li>\n<li><em>durable<\/em> : Normal \u015fartlarda kuyruktaki mesajlar\u0131n hepsi bellek \u00fczerinde dizilirler. Hal b\u00f6yleyken RabbitMQ sunucular\u0131 bir sebepten dolay\u0131 restart atarlarsa t\u00fcm veriler kaybolabilir. durable parametresine true de\u011ferini verirsek e\u011fer verilerimiz g\u00fcvenli bir \u015fekilde sa\u011flamla\u015ft\u0131r\u0131lacak yani fiziksel hale getirilecektir.<\/li>\n<li><em>exclusive<\/em> : Olu\u015fturulacak bu kuyru\u011fa birden fazla kanal\u0131n ba\u011flan\u0131p, ba\u011flanmayaca\u011f\u0131n\u0131 belirtir.<\/li>\n<li><em>autoDelete<\/em> : True de\u011ferine kar\u015f\u0131l\u0131k t\u00fcm mesajlar bitince kuyru\u011fu otomatik imha eder.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Kuyru\u011fa Mesaj G\u00f6nderme<\/strong>\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            \/\/factory.HostName = &quot;localhost&quot;;\r\n\r\n            using (IConnection connection = factory.CreateConnection())\r\n            using (IModel channel = connection.CreateModel())\r\n            {\r\n                channel.QueueDeclare(&quot;mesajkuyrugu&quot;, false, false, true);\r\n                byte&#x5B;] bytemessage = Encoding.UTF8.GetBytes(&quot;sebepsiz bo\u015f yere ayr\u0131lacaksan&quot;);\r\n                channel.BasicPublish(exchange: &quot;&quot;, routingKey: &quot;mesajkuyrugu&quot;, body: bytemessage);\r\n            }\r\n        }\r\n<\/pre>\n<p><em><strong>11.<\/strong><\/em> sat\u0131rda kuyru\u011fa g\u00f6nderece\u011fimiz mesaj\u0131m\u0131z\u0131 olu\u015fturmu\u015f bulunuyoruz. Dikkat ederseniz mesaj\u0131m\u0131z\u0131 byte dizisine \u00e7eviriyoruz. Bunun nedeni RabbitMQ&#8217;nun byte t\u00fcr\u00fcnde veriyi kabul etmesidir. Basit bir string ifadeden tutun, kendinizi bile kuyru\u011fa g\u00f6nderecekseniz byte dizisine \u00e7evirmelisiniz. <em><strong>12.<\/strong><\/em> sat\u0131rda ise &#8220;BasicPublish&#8221; metodu arac\u0131l\u0131\u011f\u0131yla a\u00e7t\u0131\u011f\u0131m\u0131z kanal \u00fczerinden mesaj\u0131m\u0131z\u0131 kuyru\u011fa g\u00f6nderiyoruz. \u0130lgili metodu daha da detayland\u0131r\u0131rsak e\u011fer;<\/p>\n<ul>\n<li><em>exchange<\/em> : E\u011fer exchange kullanm\u0131yorsan\u0131z bo\u015f b\u0131rak\u0131n\u0131z. B\u00f6ylece default exchange devreye girecek ve kullan\u0131lm\u0131\u015f olacakt\u0131r.<\/li>\n<li><em>routingKey<\/em> : E\u011fer ki default exchange kullan\u0131yorsan\u0131z routingKey olarak olu\u015fturdu\u011funuz kuyru\u011fa verdi\u011finiz ismin birebir ayn\u0131s\u0131n\u0131 veriniz.<\/li>\n<li><em>body<\/em> : G\u00f6nderilecek mesaj\u0131n ta kendisidir.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Publisher&#8217;\u0131 Aya\u011fa Kald\u0131rma ve Kuyru\u011fa Mesaj G\u00f6nderme<\/strong><br \/>\nOlu\u015fturdu\u011fumuz uygulamay\u0131 derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda tan\u0131mlad\u0131\u011f\u0131m\u0131z mesaj kuyru\u011fu olu\u015fturulacak ve i\u00e7erisine g\u00f6nderdi\u011fimiz mesaj eklenmi\u015f olacakt\u0131r. Bunu g\u00f6rebilmek i\u00e7in tekrar CloudAMQP adresi \u00fczerinden instancelar\u0131m\u0131z\u0131 listeleyelim ve ilgili instance \u00fczerinden a\u015fa\u011f\u0131daki gibi RabbitMQ Manager sekmesini se\u00e7elim.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-4.png\" alt=\"RabbitMQ - Basit\u00e7e Kuyru\u011fa Mesaj G\u00f6nderme ve Okuma\" width=\"1270\" height=\"231\" class=\"aligncenter size-full wp-image-13567\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-4.png 1270w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-4-300x55.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-4-1024x186.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-4-768x140.png 768w\" sizes=\"auto, (max-width: 1270px) 100vw, 1270px\" \/><\/a><br \/>\nA\u00e7\u0131lan pencere \u00fczerinden &#8220;Queues&#8221; sekmesini se\u00e7tikten sonra ilgili kuyru\u011fun olu\u015fturuldu\u011funu ve i\u00e7erisine de bir adet mesaj at\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6receksiniz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-5.png\" alt=\"RabbitMQ - Basit\u00e7e Kuyru\u011fa Mesaj G\u00f6nderme ve Okuma\" width=\"695\" height=\"322\" class=\"aligncenter size-full wp-image-13569\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-5.png 695w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-5-300x139.png 300w\" sizes=\"auto, (max-width: 695px) 100vw, 695px\" \/><\/a>\n<\/li>\n<\/ul>\n<p>Evet&#8230; Mesaj \u00fcreticimizi bitirmi\u015f bulunmaktay\u0131z. \u015eimdi s\u0131ra t\u00fcketiciyi olu\u015fturmaya geldi.<\/p>\n<\/li>\n<li>\n<h4 style=\"color:orange;\">Consumer(Receiving) Tasar\u0131m\u0131 &#8211; Kuyruktan Mesaj Alma\/Okuma<\/h4>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-6.png\" alt=\"RabbitMQ - Basit\u00e7e Kuyru\u011fa Mesaj G\u00f6nderme ve Okuma\" width=\"205\" height=\"78\" class=\"aligncenter size-full wp-image-13577\" \/><\/a><\/p>\n<blockquote><p>Consumer, RabbitMQ servisinde kuyruktaki mesajlar\u0131 t\u00fcketen uygulamad\u0131r.<\/p><\/blockquote>\n<p>Consumer uygulamas\u0131nda da <a href=\"https:\/\/www.nuget.org\/packages\/RabbitMQ.Client\" rel=\"noopener noreferrer\" target=\"_blank\">RabbitMQ.Client<\/a> Nuget paketini kurmal\u0131 ve ard\u0131ndan Publisher&#8217;da inceledi\u011fimiz ba\u011flant\u0131, kanal vs. olu\u015fturma i\u015flemlerini ad\u0131m ad\u0131m ger\u00e7ekle\u015ftirmeliyiz.<\/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.QueueDeclare(&quot;mesajkuyrugu&quot;, false, false, false);\r\n                EventingBasicConsumer consumer = new EventingBasicConsumer(channel);\r\n                channel.BasicConsume(&quot;mesajkuyrugu&quot;, false, consumer);\r\n                consumer.Received += (sender, e) =&gt;\r\n                {\r\n                    \/\/e.Body : Kuyruktaki mesaj\u0131 verir.\r\n                    Console.WriteLine(Encoding.UTF8.GetString(e.Body));\r\n                };\r\n            }\r\n            Console.Read();\r\n        }\r\n<\/pre>\n<p>Her ne kadar cunsomer kuyruktaki mesajlar\u0131 t\u00fcketecek olan bir uygulama olsa dahi <em><strong>9.<\/strong><\/em> sat\u0131rdaki &#8220;QueueDeclare&#8221; metodu ile publisher&#8217;da ki de\u011ferlerle birebir ayn\u0131 olacak \u015fekilde kuyruk tan\u0131mlamal\u0131y\u0131z. <em><strong>10.<\/strong><\/em> sat\u0131rda ise tan\u0131mlad\u0131\u011f\u0131m\u0131z kuyruktaki mesajlar\u0131 yakalayacak bir event olu\u015fturuyor ve ard\u0131ndan <em><strong>11.<\/strong><\/em> sat\u0131rda &#8220;BasicConsume&#8221; metodu ile ilgili mesajlar\u0131 t\u00fcketiyoruz. &#8220;BasicConsume&#8221; metodunun parametrelerini incelersek e\u011fer;<\/p>\n<ul>\n<li><em>queue<\/em> : Mesajlar\u0131n al\u0131naca\u011f\u0131 kuyruk ad\u0131.<\/li>\n<li><em>autoAck<\/em> : Kuruktan al\u0131nan mesaj\u0131n silinip silinmemesini sa\u011fl\u0131yor. Bazen kuyruktan al\u0131nan mesaj i\u015flenirken beklenmeyen hatalarla kar\u015f\u0131la\u015f\u0131labiliyor. O y\u00fczden mesaj\u0131 ba\u015far\u0131l\u0131 bir \u015fekilde i\u015flemeksizin kuyruktan silinmesini pek \u00f6nermeyiz.<\/li>\n<li><em>consumer<\/em> : T\u00fcketici.<\/li>\n<\/ul>\n<p><em><strong>12.<\/strong><\/em> sat\u0131ra g\u00f6z atarsan\u0131z e\u011fer &#8220;EventingBasicConsumer&#8221; tipinden tan\u0131mlad\u0131\u011f\u0131m\u0131z consumer nesnesinin Received olay\u0131 bizlere kuyruktaki mesajlar\u0131 getirecektir. Dikkat ederseniz mesaj byte dizisi olarak g\u00f6nderildi\u011finden dolay\u0131 haliyle byte dizisi olarak elde edilecek ve biz ilgili d\u00f6n\u00fc\u015f\u00fcm\u00fc yapmak suretiyle mesaj\u0131 i\u015flemekteyiz.\n<\/li>\n<\/ul>\n<h3>Derleyip, Test Edelim<\/h3>\n<p>Her iki projeyide derleyip s\u0131ras\u0131yla Publisher ve Consumer \u015feklinde \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda cloud&#8217;da ki ba\u011flant\u0131 kurulan sunucuda kuyru\u011fa at\u0131lan mesajlar\u0131n consumer taraf\u0131ndan t\u00fcketildi\u011fini ve tek tek ekrana yaz\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6receksiniz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-7.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/02\/RabbitMQ-Basit\u00e7e-Kuyru\u011fa-Mesaj-G\u00f6nderme-ve-Okuma-7.png\" alt=\"RabbitMQ - Basit\u00e7e Kuyru\u011fa Mesaj G\u00f6nderme ve Okuma\" width=\"268\" height=\"49\" class=\"aligncenter size-full wp-image-13585\" \/><\/a><\/p>\n<p>Evet&#8230; B\u00f6ylece basit bir mesaj kuyruk uygulamas\u0131 yapm\u0131\u015f bulunmaktay\u0131z. Tabi ki de sonraki i\u00e7eriklerimizde olay\u0131 daha da detayland\u0131racak ve derinlerde anlaml\u0131 sistemler olu\u015fturaca\u011f\u0131z.<\/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<!-- 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 bir uygulama \u00fczerinden kuyru\u011fa mesaj g\u00f6ndermeyi ve ba\u015fka bir uygulama taraf\u0131ndan bu mesaj\u0131 okumay\u0131 ele alan basit bir RabbitMQ uygulamas\u0131 \u00fczerine \u00e7al\u0131\u015f\u0131yor olacak ve b\u00f6ylece RabbitMQ&#8217;nun yaz\u0131l\u0131msal temelleriyle birlikte yap\u0131sal prensiplerini&#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":13404,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3156],"tags":[3186,3158,3180,3181,3185,3179,3183,3184,3182],"class_list":["post-13499","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-rabbitmq","tag-kuyruktan-mesaj-okuma","tag-rabbitmq","tag-rabbitmq-baglanti-olusturma","tag-rabbitmq-connection","tag-rabbitmq-mesaj-okuma","tag-rabbitmq-ornek","tag-rabbitmq-rabbitmq-mesaj-gonderme","tag-rabbitmq-receive-message","tag-rabbitmq-send-message"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/13499","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=13499"}],"version-history":[{"count":74,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/13499\/revisions"}],"predecessor-version":[{"id":13586,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/13499\/revisions\/13586"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/13404"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=13499"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=13499"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=13499"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}