﻿
{"id":27121,"date":"2024-08-25T10:25:10","date_gmt":"2024-08-25T10:25:10","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=27121"},"modified":"2024-08-25T10:25:10","modified_gmt":"2024-08-25T10:25:10","slug":"amazon-sqs-asp-net-core-scalable-messaging","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/amazon-sqs-asp-net-core-scalable-messaging\/","title":{"rendered":"Amazon SQS &#038; Asp.NET Core &#8211; Scalable Messaging"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Biliyorsunuz ki, bir yaz\u0131l\u0131m i\u00e7in \u00f6nem arz eden bir\u00e7ok fakt\u00f6r aras\u0131ndan \u00f6l\u00e7eklenebilirlik ve g\u00fcvenilir mesajla\u015fma yap\u0131lanmas\u0131 olduk\u00e7a kritik arz etmektedir. Bu ihtiya\u00e7lara kar\u015f\u0131n kullanabilece\u011fimiz muhtelif teknolojiler olmas\u0131n\u0131n yan\u0131nda Amazon SQS&#8217;de imdad\u0131m\u0131za yeti\u015fmekte ve olduk\u00e7a esnek ve g\u00fc\u00e7l\u00fc bir \u015fekilde web ve mobil uygulamalar i\u00e7in alternatif olarak de\u011ferlendirilebilmektedir. Bu i\u00e7eri\u011fimizde Amazon SQS hakk\u0131nda temel kavramlar\u0131 ve mimarisel yap\u0131y\u0131 inceleyecek, .NET uygulamalar\u0131yla nas\u0131l entegre edilece\u011fi \u00fczerine bir \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftiriyor olaca\u011f\u0131z. O halde buyurun Amazon SQS ile .NET&#8217;in g\u00fcc\u00fcn\u00fc birlikte ke\u015ffetmeye ba\u015flayal\u0131m.<\/p>\n<h3>Amazon SQS(Amazon Simple Queue Service) Nedir?<\/h3>\n<p>Amazon SQS, AWS&#8217;nin genellikle microservice, distributed yahut event-driven mimarilerini kullanan uygulamalarda mesajlar\u0131n g\u00fcvenli bir \u015fekilde g\u00f6nderilmesi, al\u0131nmas\u0131 ve saklanmas\u0131 i\u00e7in geli\u015ftirmi\u015f oldu\u011fu y\u00f6netilebilir, y\u00fcksek d\u00fczeyde kullan\u0131labilir, \u00f6l\u00e7eklenebilir, serverless bir servisidir. Olduk\u00e7a uygun maliyetlerde kullan\u0131labilir olan Amazon SQS, standart kuyruk yap\u0131lanmalar\u0131 yan\u0131nda FIFO davran\u0131\u015f sergileyen kuyruk mimarisi sunabilmekte; <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/aws-lambda\/\" rel=\"noopener\" target=\"_blank\">AWS Lambda<\/a>, <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/amazon-ec2\/\" rel=\"noopener\" target=\"_blank\">EC2<\/a> ve di\u011fer AWS servisleri ile kolayca entegre edilebilmektedir.<\/p>\n<h3>Amazon SQS&#8217;in Temel Kavramlar\u0131 Nelerdir?<\/h3>\n<p><div id=\"attachment_27135\" style=\"width: 310px\" class=\"wp-caption alignleft\"><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging.webp\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-27135\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-300x300.webp\" alt=\"Amazon SQS &amp; Asp.NET Core - Scalable Messaging\" width=\"300\" height=\"300\" class=\"size-medium wp-image-27135\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-300x300.webp 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-1024x1024.webp 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-150x150.webp 150w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-768x768.webp 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-80x80.webp 80w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-320x320.webp 320w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging.webp 1080w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><p id=\"caption-attachment-27135\" class=\"wp-caption-text\"><span style=\"font-size:10px;\">Bu g\u00f6rsel https:\/\/codewithmukesh.com\/blog\/amazon-sqs-and-aspnet-core\/ adresinden al\u0131nm\u0131\u015ft\u0131r.<\/span><\/p><\/div>Amazon SQS&#8217;de <em>queue<\/em> ve <em>message processing<\/em> olmak \u00fczere birbirleriyle yak\u0131ndan ili\u015fkili olan iki temel kavram mevcuttur. Bu kavramlar\u0131 de\u011ferlendirirsek e\u011fer;<\/p>\n<ul>\n<li><strong><em>Queue<\/em><\/strong><br \/>\nQueue, bir mesaj\u0131n g\u00f6nderildi\u011fi ve al\u0131nd\u0131\u011f\u0131 depolama alan\u0131d\u0131r. Queue&#8217;lar sayesinde mesajlar bir sistemden di\u011ferine g\u00fcvenli bir \u015fekilde iletilebilmektedir.<\/p>\n<p><em>Standard Queues<\/em> ve <em>FIFO (First-In-First-Out) Queues<\/em> olmak \u00fczere iki temel queue t\u00fcr\u00fc mevcuttur;<\/p>\n<ol>\n<li><em>Standard Queues<\/em><br \/>\n\u0130lk piyasaya s\u00fcr\u00fclen queue t\u00fcr\u00fc olan standard queue&#8217;lar; mesajlar\u0131n en az bir kez teslim edildi\u011fi, b\u00fcy\u00fck hacimli mesajlar\u0131n y\u00fcksek h\u0131zda i\u015flenebildi\u011fi ve mesajlar\u0131n i\u015flenme s\u0131ras\u0131n\u0131n bir \u00f6neminin olmad\u0131\u011f\u0131 sistemlerde kullan\u0131lan queue&#8217;lard\u0131r. Son ibareye odaklan\u0131rsak e\u011fer birden fazla mesaj\u0131n s\u00f6z konusu oldu\u011fu durumlarda queue&#8217;da ki mesajlar\u0131n i\u015flenmesi s\u00fcrecinde s\u0131ras\u0131n\u0131n korunmas\u0131 garanti edilmemektedir. Buna \u00f6rnek vermemiz gerekirse e\u011fer; 1, 2, 3, 4, 5 \u015feklinde gelen mesajlar consumer&#8217;lar taraf\u0131ndan 1, 5, 3, 2, 4 \u015feklinde i\u015flenebilmesi olas\u0131d\u0131r.\n<\/li>\n<li><em>FIFO (First-In-First-Out) Queues<\/em><br \/>\nAd\u0131ndan da anla\u015f\u0131laca\u011f\u0131 \u00fczere bu queue&#8217;lar da mesajlar s\u0131rayla i\u015flenmektedir. Ve standard queue&#8217;lar\u0131n aksine her mesaj yaln\u0131zca bir kez i\u015flenir. Bir d\u00fczen sa\u011flad\u0131\u011f\u0131 i\u00e7in ister istemez standard queue&#8217;lara nazaran daha maliyetli olabilmektedir. Bu y\u00fczden performansta biraz azalma g\u00f6zlemlenebilir.\n<\/li>\n<\/ol>\n<\/li>\n<li><strong><em>Message Processing<\/em><\/strong><br \/>\nMessage Processing ise bir kuyru\u011fa g\u00f6nderilen mesajlar\u0131n al\u0131nmas\u0131 ve i\u015flenmesi s\u00fcrecidir. Bu s\u00fcre\u00e7te bilinmesi gereken kritik bir davran\u0131\u015f vard\u0131r. Bu davran\u0131\u015f, iki farkl\u0131 consumer taraf\u0131ndan bir queue&#8217;dan ayn\u0131 mesaj\u0131n al\u0131namamas\u0131d\u0131r. Bir consumer, bir mesaj\u0131 ald\u0131\u011f\u0131nda bu mesaj di\u011fer consumer&#8217;lar taraf\u0131ndan g\u00f6r\u00fclemeyecek \u015fekilde kilitlenmektedir. B\u00f6ylece bir mesaja yaln\u0131zca bir thread&#8217;in eri\u015febilmesinin garantisi sa\u011flanm\u0131\u015f olacakt\u0131r. Tabi mesaj al\u0131nd\u0131ktan sonra belirli bir s\u00fcre zarf\u0131nda i\u015flenmezse mesaj\u0131n farkl\u0131 bir consumer taraf\u0131ndan t\u00fcketilebilmesi i\u00e7in yeniden g\u00f6r\u00fcn\u00fcr hale getirilmesi gerekecek ve bunun i\u00e7in de mesaj\u0131n kilidi a\u00e7\u0131larak tekrar queue&#8217;ya geri koyulacakt\u0131r. Buradaki s\u00fcre terminolojik olarak <em style=\"color:red;\">Visibility Timeout<\/em> olarak nitelendirilmektedir. Bu s\u00fcre default olarak 30 saniyedir ve her bir mesaj i\u00e7in \u00f6zelle\u015ftirilememektedir!<\/p>\n<p>Ayr\u0131ca bir mesaj d\u00fczg\u00fcn bir \u015fekilde i\u015flendi\u011fi taktirde kuyruktan kal\u0131c\u0131 olarak silinecektir. Amma velakin belirli bir say\u0131da ba\u015far\u0131s\u0131z denemeden sonra<span style=\"font-size:12px;\">(ki bu geli\u015ftirici taraf\u0131ndan <em style=\"color:purple;\">Maximum Receives<\/em> parametresi ile belirlenmektedir)<\/span> i\u015flenemeyen mesajlar ayr\u0131 bir kuyruk olan <em style=\"color:red;\">Dead Letter Queue (DLQ)<\/em>&#8216;ya ta\u015f\u0131nacakt\u0131r.\n<\/li>\n<\/ul>\n<h3>Amazon SQS&#8217;in Avantajlar\u0131 Nelerdir?<\/h3>\n<p>Amazon SQS&#8217;in, <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/rabbitmq\/\" rel=\"noopener\" target=\"_blank\">RabbitMQ<\/a> ve Kafka gibi di\u011fer mesajla\u015fma sistemlerine k\u0131yasla \u00e7e\u015fitli avantajlar\u0131 mevcuttur. Bu avantajlar, belirli senaryolarda Amazon SQS&#8217;i daha cazip hale getirebilmektedirler. \u0130\u015fte Amazon SQS&#8217;in birka\u00e7 \u00f6ne \u00e7\u0131kan avantajlar\u0131;<\/p>\n<ul>\n<li><em style=\"color:orange;\">Tam Y\u00f6netilen Hizmet<\/em><br \/>\nAmazon SQS, AWS taraf\u0131ndan tamamen y\u00f6netildi\u011fi i\u00e7in sunucu y\u00f6netimi, yaz\u0131l\u0131m g\u00fcncellemeleri, \u00f6l\u00e7eklendirme ve bak\u0131m gibi sorumluluklardan bizleri m\u00fcnezzeh k\u0131lmaktad\u0131r. Haliyle uygulama sahipleri taraf\u0131ndan altyap\u0131y\u0131 y\u00f6netmek ve sorumlulu\u011funu \u00fcstlenmek ciddi maliyet ve kalem olaca\u011f\u0131ndan dolay\u0131 bu a\u00e7\u0131dan b\u00fcy\u00fck avantaj sa\u011flamaktad\u0131r.\n<\/li>\n<li><em style=\"color:orange;\">Kolay Entegrasyon ve Kullan\u0131m<\/em><br \/>\nAmazon SQS, AWS ekosisteminin bir par\u00e7as\u0131 oldu\u011fundan di\u011fer AWS servisleriyle(Lambda, EC2, S3 vs.) kolayca entegre edilebilmektedir. Ayr\u0131ca SQS&#8217;in kullan\u0131m\u0131, basit bir API ile sa\u011flanabilmekte ve bu da h\u0131zl\u0131 bir kullan\u0131m ve \u00f6\u011frenim e\u011frisi sa\u011flamaktad\u0131r.\n<\/li>\n<li><em style=\"color:orange;\">Otomatik \u00d6l\u00e7eklendirme<\/em><br \/>\nAmazon SQS, message queue trafi\u011fi artt\u0131\u011f\u0131nda otomatik olarak \u00f6l\u00e7eklendirmeyi ger\u00e7ekle\u015ftirmektedir. Haliyle geli\u015ftiriciler taraf\u0131ndan kapasitenin \u00f6nceden planlanmas\u0131 gerekmemekte ve b\u00f6ylece sistemde anl\u0131k olas\u0131 trafik art\u0131\u015flar\u0131na kar\u015f\u0131 uyum do\u011fal bir \u015fekilde sa\u011flanabilmektedir.\n<\/li>\n<li><em style=\"color:orange;\">G\u00fcvenilirlik ve Dayan\u0131kl\u0131l\u0131k<\/em><br \/>\nAmazon SQS, AWS&#8217;in y\u00fcksek g\u00fcvenilirlik ve dayan\u0131kl\u0131l\u0131k sa\u011flayan altyap\u0131s\u0131 \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in mesajlar birden fazla veri merkezinde \u00e7o\u011falt\u0131larak g\u00fcvence alt\u0131na al\u0131nmaktad\u0131r. Dolay\u0131s\u0131yla bu a\u00e7\u0131dan olay\u0131 de\u011ferlendirdi\u011fimizde de herhangi bir risk durumu s\u00f6z konusu de\u011fildir.\n<\/li>\n<li><em style=\"color:orange;\">Fiyatland\u0131rma ve Maliyet Verimlili\u011fi<\/em><br \/>\nAmazon SQS&#8217;de kullan\u0131c\u0131lar yaln\u0131zca kulland\u0131klar\u0131 kadar \u00f6deme yaparlar. \u00d6zellikle k\u00fc\u00e7\u00fck \u00f6l\u00e7ekli ve de\u011fi\u015fken trafik senaryolar\u0131 i\u00e7in maliyet olduk\u00e7a verimlidir diyebiliriz.\n<\/li>\n<li><em style=\"color:orange;\">FIFO ve Dead Letter Queue(DLQ) Deste\u011fi<\/em><br \/>\nFIFO queue&#8217;lar\u0131 sayesinde tam s\u0131ral\u0131 mesaj teslimi sa\u011flarken, DLQ ile de ba\u015far\u0131s\u0131z mesajlar\u0131 kolayca y\u00f6netilebilir hale getirmektedir.\n<\/li>\n<li><em style=\"color:orange;\">G\u00fcvenlik<\/em><br \/>\nAmazon SQS, AWS IAM(Identity and Access Management) ile entegrasyon, g\u00fcvenlik ve eri\u015fim denetimi i\u00e7in geli\u015fmi\u015f yetenekler sunmaktad\u0131r. Ayr\u0131ca mesajlar varsay\u0131lan olarak \u015fifrelenmektedir.\n<\/li>\n<\/ul>\n<h3>Amazon SQS&#8217;in Kullan\u0131m\u0131<\/h3>\n<p>\u015eimdi Amazon SQS&#8217;i nas\u0131l kullanabilece\u011fimizi inceliyor olaca\u011f\u0131z. Bu incelemeyi hem AWS \u00fczerinden ger\u00e7ekle\u015ftirece\u011fiz hem de Asp.NET Core uygulamalar\u0131 \u00fczerinden. \u0130lk olarak AWS&#8217;de bir kuyru\u011fun nas\u0131l olu\u015fturulup kullan\u0131labilece\u011fini de\u011ferlendirece\u011fiz. Bu a\u015famadan sonra art\u0131k olay\u0131 programatik ele alacak ve biri producer di\u011feri consumer olmak \u00fczere iki Asp.NET Core uygulamas\u0131 olu\u015fturaca\u011f\u0131z. Haliyle planlama belli. O halde hadi ba\u015flayal\u0131m.<\/p>\n<ul>\n<li>\n<h6 style=\"color:green;\">AWS Management Console Arac\u0131l\u0131\u011f\u0131yla Amazon SQS Olu\u015fturma<\/h6>\n<p>\u0130lk olarak Amazon Management Console \u00fczerinden SQS servisine gidelim.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging.png\" alt=\"Amazon SQS &amp; Asp.NET Core - Scalable Messaging\" width=\"1048\" height=\"225\" class=\"aligncenter size-full wp-image-27138\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging.png 1048w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-300x64.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-1024x220.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-768x165.png 768w\" sizes=\"auto, (max-width: 1048px) 100vw, 1048px\" \/><\/a>Create queue butonuna t\u0131klay\u0131p ard\u0131ndan Standard t\u00fcr\u00fcn\u00fc se\u00e7erek bir kuyruk ad\u0131 belirleyelim.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging.gif\" alt=\"Amazon SQS &amp; Asp.NET Core - Scalable Messaging\" width=\"800\" height=\"415\" class=\"aligncenter size-full wp-image-27139\" \/><\/a>Tabi bizler i\u00e7eri\u011fimiz boyunca standard t\u00fcr\u00fc \u00fczerinden \u00f6rneklendirmede bulunmay\u0131 tercih ediyoruz ama siz isterseniz burada FIFO t\u00fcr\u00fcnden de kuyruk olu\u015fturabilirsiniz. <\/p>\n<p>Ard\u0131ndan devam\u0131nda ilgili kuyru\u011fu a\u015fa\u011f\u0131daki gibi yap\u0131land\u0131ral\u0131m.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-1.png\" alt=\"Amazon SQS &amp; Asp.NET Core - Scalable Messaging\" width=\"1293\" height=\"386\" class=\"aligncenter size-full wp-image-27141\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-1.png 1293w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-1-300x90.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-1-1024x306.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-1-768x229.png 768w\" sizes=\"auto, (max-width: 1293px) 100vw, 1293px\" \/><\/a><br \/>\nBurada yapt\u0131\u011f\u0131m\u0131z yap\u0131land\u0131rmada \u00f6nceki sat\u0131rlarda bahsetti\u011fimiz <em>Visibility Timeout<\/em> de\u011ferini yap\u0131land\u0131rabilmekteyiz. <em>Neydi la bu?<\/em> diye hat\u0131rlamak maksatl\u0131 bu suali cevapland\u0131r\u0131rsak e\u011fer bir mesaj\u0131n bir consumer taraf\u0131ndan okunduktan sonra di\u011fer consumer&#8217;lar\u0131n onu okuyabilmesi i\u00e7in kilitlendi\u011fi s\u00fcreyi temsil ediyordu. Haliyle \u00f6nceden de ifade etti\u011fimiz gibi g\u00f6rselden de varsay\u0131lan olarak 30 saniye oldu\u011funu g\u00f6rmekteyiz.<\/p>\n<p>Bunun d\u0131\u015f\u0131nda bir mesaj\u0131n kuyrukta g\u00f6r\u00fcnmesine ra\u011fmen consumer&#8217;lar taraf\u0131ndan gecikmeli bir \u015fekilde i\u015flenebilmesi i\u00e7in <em>Delivery Delay<\/em> de\u011ferini belirleyebilir, hen\u00fcz silinmemi\u015f bir mesaj\u0131n ne kadar periyot sonras\u0131nda silinebilece\u011fini <em>Retention Period<\/em> ile ayarlayabilir ve kuyruktaki mesajlar\u0131n kullan\u0131labilir olmas\u0131 i\u00e7in <em>Receive Message Wait Time<\/em> de\u011feriyle oynayabiliriz.<\/p>\n<p>Devam\u0131nda ise olu\u015fturaca\u011f\u0131m\u0131z kuyru\u011fa dair di\u011fer yap\u0131land\u0131rmalar\u0131 varsay\u0131lan ayarlar\u0131yla kabul ederek kuyru\u011fu olu\u015ftural\u0131m.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-2.png\" alt=\"Amazon SQS &amp; Asp.NET Core - Scalable Messaging\" width=\"1814\" height=\"537\" class=\"aligncenter size-full wp-image-27143\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-2.png 1814w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-2-300x89.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-2-1024x303.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-2-768x227.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-2-1536x455.png 1536w\" sizes=\"auto, (max-width: 1814px) 100vw, 1814px\" \/><\/a>Son olarak olu\u015fturdu\u011fumuz bu kuyru\u011fa a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde oldu\u011fu gibi AWS Management Console \u00fczerinden mesaj yay\u0131nlayabilir ve subscribe olarak yay\u0131nlanan mesajlar\u0131 elde edebiliriz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-1.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-1.gif\" alt=\"Amazon SQS &amp; Asp.NET Core - Scalable Messaging\" width=\"800\" height=\"394\" class=\"aligncenter size-full wp-image-27144\" \/><\/a>AWS \u00fczerinden kuyruk yap\u0131lanmas\u0131n\u0131 kullanmak i\u015fte bu kadar \ud83d\ude42\n<\/li>\n<li>\n<h6 style=\"color:green;\">Asp.NET Core &#8211; Producer ve Consumer Altyap\u0131s\u0131n\u0131 Geli\u015ftirme<\/h6>\n<p>\u015eimdi s\u0131ra Asp.NET Core k\u0131sm\u0131na gelmi\u015ftir. Burada ilk olarak producer ve consumer uygulamalar\u0131nda kullanaca\u011f\u0131m\u0131z altyap\u0131y\u0131 geli\u015ftirmeye odaklanal\u0131m. Bunun i\u00e7in solution i\u00e7erisinde <em>Shared<\/em> isimli bir class library olu\u015ftural\u0131m ve a\u015fa\u011f\u0131daki paketlerin ilgili projeye y\u00fcklenmesiyle ba\u015flayal\u0131m.<\/p>\n<p><code><a href=\"https:\/\/www.nuget.org\/packages\/AWSSDK.SQS\/\" rel=\"noopener\" target=\"_blank\">Install-Package AWSSDK.SQS<\/a><\/code><br \/>\n<code><a href=\"https:\/\/www.nuget.org\/packages\/AWSSDK.Extensions.NETCore.Setup\" rel=\"noopener\" target=\"_blank\">Install-Package AWSSDK.Extensions.NETCore.Setup<\/a><\/code><\/p>\n<p>Ard\u0131ndan bu class library i\u00e7erisinde a\u015fa\u011f\u0131daki producer ile consumer aras\u0131ndaki haberle\u015fmeyi \u00f6rnek\/misal olarak modelleyecek olan <code>OrderCreatedEvent<\/code>&#8216;i tasarlayal\u0131m.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class OrderCreatedEvent : IEvent\r\n    {\r\n        public Guid OrderId { get; set; }\r\n        public Guid CustomerId { get; set; }\r\n        public DateTime CreatedDate { get; } = DateTime.UtcNow;\r\n    }\r\n<\/pre>\n<\/div>\n<p>Ve son olarak bu <em>Shared<\/em> isimli class library&#8217;i producer ve consumer uygulamalar\u0131nda referans edelim.<\/p>\n<p>Art\u0131k producer ya da consumer uygulamalar\u0131n\u0131 geli\u015ftirmeye odaklanabiliriz. Burada opsiyonel olarak bizler ilk producer uygulamas\u0131n\u0131 geli\u015ftirmeyle ba\u015flayal\u0131m.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing Amazon.SQS;\r\nusing Amazon.SQS.Model;\r\nusing Shared.Events;\r\nusing System.Text.Json;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.Services.AddDefaultAWSOptions(builder.Configuration.GetAWSOptions());\r\nbuilder.Services.AddAWSService&lt;IAmazonSQS&gt;();\r\n\r\nvar app = builder.Build();\r\n\r\napp.MapGet(&quot;\/create-order&quot;, async (IAmazonSQS amazonSQS) =&gt;\r\n{\r\n    string queueName = &quot;order-created-queue&quot;;\r\n\r\n    OrderCreatedEvent orderCreatedEvent = new()\r\n    {\r\n        CustomerId = Guid.NewGuid(),\r\n        OrderId = Guid.NewGuid()\r\n    };\r\n\r\n    string queueUrl = string.Empty;\r\n\r\n    try\r\n    {\r\n        GetQueueUrlResponse getQueueUrlResponse = await amazonSQS.GetQueueUrlAsync(queueName);\r\n        queueUrl = getQueueUrlResponse.QueueUrl;\r\n    }\r\n    catch (QueueDoesNotExistException)\r\n    {\r\n        CreateQueueResponse createQueueResponse = await amazonSQS.CreateQueueAsync(queueName);\r\n        queueUrl = createQueueResponse.QueueUrl;\r\n    }\r\n\r\n    SendMessageRequest sendMessageRequest = new()\r\n    {\r\n        QueueUrl = queueUrl,\r\n        MessageBody = JsonSerializer.Serialize(orderCreatedEvent)\r\n    };\r\n\r\n    await amazonSQS.SendMessageAsync(sendMessageRequest);\r\n    return Results.Ok();\r\n});\r\n\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>Producer&#8217;da yap\u0131lacak i\u015flemi yukar\u0131daki gibi tasarlayabiliriz. Yap\u0131lan \u00e7al\u0131\u015fmaya g\u00f6z atarsak e\u011fer <strong><em>8<\/em><\/strong> ve <strong><em>9.<\/em><\/strong> sat\u0131rlarda AWS Service entegrasyonu ger\u00e7ekle\u015ftirilmekte ve <strong><em>25<\/em><\/strong> ile <strong><em>34.<\/em><\/strong> sat\u0131r aral\u0131\u011f\u0131nda ise &#8216;order-created-queue&#8217; ad\u0131nda bir queue tan\u0131mlanmakta yahut \u00f6nceden tan\u0131mlanm\u0131\u015fsa var olan kullan\u0131larak mesaj g\u00f6nderimi sa\u011flanmaktad\u0131r.<\/p>\n<p>Producer&#8217;\u0131 tamamlad\u0131\u011f\u0131m\u0131za g\u00f6re s\u0131ra consumer&#8217;a gelmi\u015ftir. Producer taraf\u0131ndan yay\u0131nlanm\u0131\u015f mesajlar\u0131 consumer&#8217;da yakalayabilmek i\u00e7in a\u015fa\u011f\u0131daki gibi bir BackgroundService olu\u015fturabiliriz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\r\nusing Amazon.SQS;\r\nusing Amazon.SQS.Model;\r\n\r\nnamespace Consumer.BackgroundServices\r\n{\r\n    public class OrderCreatedEventConsumer(IAmazonSQS amazonSQS) : BackgroundService\r\n    {\r\n        protected override async Task ExecuteAsync(CancellationToken stoppingToken)\r\n        {\r\n            string queueName = &quot;order-created-queue&quot;;\r\n            string queueUrl = string.Empty;\r\n\r\n            try\r\n            {\r\n                GetQueueUrlResponse getQueueUrlResponse = await amazonSQS.GetQueueUrlAsync(queueName);\r\n                queueUrl = getQueueUrlResponse.QueueUrl;\r\n            }\r\n            catch (QueueDoesNotExistException)\r\n            {\r\n                CreateQueueResponse createQueueResponse = await amazonSQS.CreateQueueAsync(queueName);\r\n                queueUrl = createQueueResponse.QueueUrl;\r\n            }\r\n\r\n            ReceiveMessageRequest receiveMessageRequest = new()\r\n            {\r\n                QueueUrl = queueUrl\r\n            };\r\n\r\n            while (!stoppingToken.IsCancellationRequested)\r\n            {\r\n                ReceiveMessageResponse receiveMessageResponse = await amazonSQS.ReceiveMessageAsync(receiveMessageRequest);\r\n                if (receiveMessageResponse.Messages.Count &gt; 0)\r\n                    foreach (Message message in receiveMessageResponse.Messages)\r\n                    {\r\n                        \/\/OrderCreatedEvent _message = JsonSerializer.Deserialize&lt;OrderCreatedEvent&gt;(message.Body);\r\n                        Console.WriteLine(message.Body);\r\n                        await Task.Delay(1000);\r\n                        await amazonSQS.DeleteMessageAsync(queueUrl, message.ReceiptHandle);\r\n                    }\r\n            }\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>Devam\u0131nda ise &#8216;Program.cs&#8217; dosyas\u0131nda a\u015fa\u011f\u0131daki gibi yap\u0131land\u0131rmada bulunal\u0131m.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing Amazon.SQS;\r\nusing Consumer.BackgroundServices;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.Services.AddDefaultAWSOptions(builder.Configuration.GetAWSOptions());\r\nbuilder.Services.AddAWSService&lt;IAmazonSQS&gt;();\r\nbuilder.Services.AddHostedService&lt;OrderCreatedEventConsumer&gt;();\r\n\r\nvar app = builder.Build();\r\n\r\napp.MapGet(&quot;\/&quot;, () =&gt; &quot;Hello World!&quot;);\r\n\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>Evet, b\u00f6ylece art\u0131k consumer&#8217;da haz\u0131r k\u0131ta modundad\u0131r diyebiliriz.<\/p>\n<p>Art\u0131k tek yap\u0131lmas\u0131 gereken her iki uygulaman\u0131n &#8216;appsettings.json&#8217; dosyas\u0131nda a\u015fa\u011f\u0131daki yap\u0131land\u0131rman\u0131n sa\u011flanmas\u0131d\u0131r.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n  &quot;AWS&quot;: {\r\n    &quot;Profile&quot;: &quot;sqs-profile&quot;,\r\n    &quot;Region&quot;: &quot;ap-south-1&quot;\r\n  }\r\n<\/pre>\n<\/div>\n<p>Nihai olarak yapt\u0131\u011f\u0131m\u0131z bu \u00e7al\u0131\u015fmay\u0131 derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda producer ile consumer aras\u0131ndaki haberle\u015fmenin ba\u015far\u0131yla sa\u011fland\u0131\u011f\u0131n\u0131 g\u00f6zlemlemi\u015f oluyoruz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-3.png\" alt=\"Amazon SQS &amp; Asp.NET Core - Scalable Messaging\" width=\"1329\" height=\"129\" class=\"aligncenter size-full wp-image-27145\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-3.png 1329w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-3-300x29.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-3-1024x99.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-3-768x75.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-3-1320x129.png 1320w\" sizes=\"auto, (max-width: 1329px) 100vw, 1329px\" \/><\/a>\n<\/li>\n<\/ul>\n<h3>MassTransit Entegrasyonu<\/h3>\n<p>Tabi e\u011fer ki sahada bir message broker kullan\u0131l\u0131yorsa bunu burada yapt\u0131\u011f\u0131m\u0131z gibi manuel bir \u015fekilde yap\u0131land\u0131r\u0131p kullanmaktansa t\u00fcrl\u00fc avantajlar ve sebeplerden dolay\u0131 bir <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/enterprise-service-bus\/\" rel=\"noopener\" target=\"_blank\">Enterprise Service Bus (ESB)<\/a> kullanmay\u0131 tercih ederiz. Ee haliyle ESB deyince de akla ilk gelen <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/masstransit\/\" rel=\"noopener\" target=\"_blank\">MassTransit<\/a> k\u00fct\u00fcphanesi olaca\u011f\u0131ndan dolay\u0131 Amazon SQS&#8217;i MassTransit&#8217;le nas\u0131l kullanabilece\u011fimizi de inceleyip \u00f6yle i\u00e7eri\u011fimizi noktalayaca\u011f\u0131z. Aksi taktirde Amazon SQS ile MassTransit&#8217;i tecr\u00fcbe etmeksizin bu i\u00e7eri\u011fi noktalamak ciddi eksiklik olacakt\u0131r.<\/p>\n<p>Bunun i\u00e7in \u00f6ncelikle a\u015fa\u011f\u0131daki paketi <em>Shared<\/em> projesine y\u00fckleyelim.<br \/>\n<code><a href=\"https:\/\/www.nuget.org\/packages\/MassTransit.AmazonSQS\/\" rel=\"noopener\" target=\"_blank\">Install-Package MassTransit.AmazonSQS<\/a><\/code><\/p>\n<p>Ard\u0131ndan producer&#8217;\u0131n &#8216;Program.cs&#8217; dosyas\u0131nda a\u015fa\u011f\u0131daki yap\u0131land\u0131rmada bulunal\u0131m.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n#region MassTransit\r\nbuilder.Services.AddMassTransit(configurator =&gt;\r\n{\r\n    configurator.UsingAmazonSqs((context, _configurator) =&gt;\r\n    {\r\n        _configurator.Host(Amazon.RegionEndpoint.APSouth1.OriginalSystemName, hostConfigurator =&gt;\r\n        {\r\n            hostConfigurator.AccessKey(builder.Configuration&#x5B;&quot;AWS:AccessKey&quot;]);\r\n            hostConfigurator.SecretKey(builder.Configuration&#x5B;&quot;AWS:SecretKey&quot;]);\r\n        });\r\n    });\r\n});\r\n#endregion\r\n<\/pre>\n<\/div>\n<p>Ve mesaj g\u00f6nderebilmek i\u00e7in de a\u015fa\u011f\u0131daki gibi bir action olu\u015ftural\u0131m.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n#region MassTransit\r\napp.MapGet(&quot;\/create-order-masstransit&quot;, async (IPublishEndpoint publishEndpoint, ISendEndpointProvider sendEndpointProvider) =&gt;\r\n{\r\n    OrderCreatedEvent orderCreatedEvent = new()\r\n    {\r\n        CustomerId = Guid.NewGuid(),\r\n        OrderId = Guid.NewGuid()\r\n    };\r\n\r\n    #region Publish\r\n    \/\/await publishEndpoint.Publish(orderCreatedEvent);\r\n    #endregion\r\n\r\n    #region Send\r\n    var sendEndpoint = await sendEndpointProvider.GetSendEndpoint(new Uri($&quot;queue:masstransit-order-created-event-queue&quot;));\r\n    await sendEndpoint.Send(orderCreatedEvent);\r\n    #endregion\r\n\r\n    return Results.Ok();\r\n});\r\n#endregion\r\n<\/pre>\n<\/div>\n<p>Benzer mant\u0131kla consumer&#8217;\u0131n &#8216;Program.cs&#8217; dosyas\u0131nda da yap\u0131land\u0131rmada bulunmam\u0131z gerekmektedir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n#region MassTransit\r\nbuilder.Services.AddMassTransit(configurator =&gt;\r\n{\r\n    configurator.AddConsumer&lt;Consumers.OrderCreatedEventConsumer&gt;().Endpoint(e =&gt; e.InstanceId = &quot;queue&quot;);\r\n\r\n    configurator.UsingAmazonSqs((context, _configurator) =&gt;\r\n    {\r\n        _configurator.Host(Amazon.RegionEndpoint.APSouth1.OriginalSystemName, hostConfigurator =&gt;\r\n        {\r\n            hostConfigurator.AccessKey(builder.Configuration&#x5B;&quot;AWS:AccessKey&quot;]);\r\n            hostConfigurator.SecretKey(builder.Configuration&#x5B;&quot;AWS:SecretKey&quot;]);\r\n        });\r\n\r\n        _configurator.ConfigureEndpoints(context, new KebabCaseEndpointNameFormatter(&quot;masstransit&quot;, false));\r\n    });\r\n});\r\n#endregion\r\n<\/pre>\n<\/div>\n<p>Burada MassTransit konfig\u00fcrasyonu a\u00e7\u0131s\u0131ndan \u00f6nceki i\u00e7eriklerimizden tecr\u00fcbe ettiklerimizin d\u0131\u015f\u0131nda <em>Endpoint<\/em> ve <em>ConfigureEndpoints<\/em> metotlar\u0131yla birlikte <em>KebabCaseEndpointNameFormatter<\/em> s\u0131n\u0131f\u0131n\u0131 g\u00f6rmekteyiz. Hemen bunlar\u0131n izah\u0131n\u0131 yaparsak e\u011fer; <\/p>\n<ul>\n<li><em>Endpoint<\/em>, ilgili consumer i\u00e7in olu\u015fturulacak kuyruk endpoint&#8217;ine bir InstanceId de\u011feri ekler. B\u00f6ylece olu\u015fturulan endpoint benzersiz bir hal alacakt\u0131r. Dolay\u0131s\u0131yla bir consumer&#8217;\u0131 birden fazla yerde kullan\u0131yorsan\u0131z, onlar\u0131 ay\u0131rt etmek i\u00e7in InstanceId kullan\u0131lmaktad\u0131r diyebiliriz. Ayr\u0131ca bu de\u011fer kuyru\u011fun sonuna yans\u0131yacakt\u0131r.<\/li>\n<li><em>ConfigureEndpoints<\/em>, consumer&#8217;lar\u0131n MassTransit&#8217;in default kurallar\u0131na g\u00f6re otomatik olarak yap\u0131land\u0131r\u0131lmas\u0131n\u0131 sa\u011flar. Bu yap\u0131land\u0131rma s\u00fcrecinde formatter olarak verdi\u011fimiz s\u0131n\u0131flar\u0131n niteli\u011fine g\u00f6re davran\u0131\u015f sergiler. \u00d6rnekte <code>KebabCaseEndpointNameFormatter<\/code> s\u0131n\u0131f\u0131ndan istifade edilmi\u015ftir. Bu s\u0131n\u0131f, endpoint(yani kuyruk) isimlendirmesini consumer&#8217;\u0131n event&#8217;ini baz alarak olu\u015fturacak ve kebab-case format\u0131nda olmas\u0131n\u0131 sa\u011flayacakt\u0131r. Misal olarak <em>OrderCreatedEvent<\/em>&#8216;i consume eden bir consumer, bu s\u0131n\u0131f sayesinde <span style=\"font-size:12px;\">&#8216;order-created-event&#8217;<\/span> kuyru\u011funa sahip olacakt\u0131r. Ayr\u0131ca <em>ConfigureEndpoints<\/em> metodu, kuyruk isimlerine \u00f6nek eklememizi de sa\u011flamaktad\u0131r. Buradaki &#8216;masstransit&#8217; de\u011feri ile olu\u015fturulacak kuyruk<br \/>\n<span style=\"font-size:12px;\">&#8216;masstransit-order-created-event&#8217;<\/span> \u015feklinde olacakt\u0131r. Ha bir yandan da <em>Endpoint<\/em> metodu InstanceId olarak &#8216;queue&#8217; de\u011ferini ekleyece\u011fi i\u00e7in nihai olarak kuyruk ad\u0131<br \/>\n<span style=\"font-size:12px;\">&#8216;masstransit-order-created-event-consumer-queue&#8217;<\/span> \u015feklinde olacakt\u0131r.<\/li>\n<\/ul>\n<p>Velhas\u0131l, \u015fimdi de <em>OrderCreatedEvent<\/em>&#8216;i t\u00fcketecek olan consumer&#8217;\u0131 olu\u015ftural\u0131m.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class OrderCreatedEventConsumer : IConsumer&lt;OrderCreatedEvent&gt;\r\n    {\r\n        public Task Consume(ConsumeContext&lt;OrderCreatedEvent&gt; context)\r\n        {\r\n            Console.WriteLine($&quot;{context.Message.OrderId} - {context.Message.CustomerId}&quot;);\r\n            return Task.CompletedTask;\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<blockquote><p><em style=\"color:green;\">Makale boyunca AWS kanad\u0131nda i\u015flemlerin ger\u00e7ekle\u015ftirilebilmesi i\u00e7in IAM servisinde gerekli olan <code>AmazonSNSFullAccess<\/code> ve <code>AmazonSQSFullAccess<\/code> izinlerini kapsayan politikan\u0131n yap\u0131land\u0131r\u0131lmas\u0131 ve permissions boundary olarak da <code>AdministratorAccess<\/code> belirlenmesi gerekmektedir. Ya da a\u015fa\u011f\u0131daki gibi komple IAM Politikalar\u0131n\u0131n kullan\u0131lmas\u0131 yeterlidir&#8230;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n{\r\n    &quot;Version&quot;: &quot;2012-10-17&quot;,\r\n    &quot;Statement&quot;: &#x5B;\r\n        {\r\n            &quot;Sid&quot;: &quot;SqsAccess&quot;,\r\n            &quot;Effect&quot;: &quot;Allow&quot;,\r\n            &quot;Action&quot;: &#x5B;\r\n                &quot;sqs:SetQueueAttributes&quot;,\r\n                &quot;sqs:ReceiveMessage&quot;,\r\n                &quot;sqs:CreateQueue&quot;,\r\n                &quot;sqs:DeleteMessage&quot;,\r\n                &quot;sqs:SendMessage&quot;,\r\n                &quot;sqs:GetQueueUrl&quot;,\r\n                &quot;sqs:GetQueueAttributes&quot;,\r\n                &quot;sqs:ChangeMessageVisibility&quot;,\r\n                &quot;sqs:PurgeQueue&quot;,\r\n                &quot;sqs:DeleteQueue&quot;,\r\n                &quot;sqs:TagQueue&quot;\r\n            ],\r\n            &quot;Resource&quot;: &quot;arn:aws:sqs:*:YOUR_ACCOUNT_ID:*&quot;\r\n        },{\r\n            &quot;Sid&quot;: &quot;SnsAccess&quot;,\r\n            &quot;Effect&quot;: &quot;Allow&quot;,\r\n            &quot;Action&quot;: &#x5B;\r\n                &quot;sns:GetTopicAttributes&quot;,\r\n                &quot;sns:CreateTopic&quot;,\r\n                &quot;sns:Publish&quot;,\r\n                &quot;sns:Subscribe&quot;\r\n            ],\r\n            &quot;Resource&quot;: &quot;arn:aws:sns:*:YOUR_ACCOUNT_ID:*&quot;\r\n        },{\r\n            &quot;Sid&quot;: &quot;SnsListAccess&quot;,\r\n            &quot;Effect&quot;: &quot;Allow&quot;,\r\n            &quot;Action&quot;: &#x5B;\r\n                &quot;sns:ListTopics&quot;\r\n            ],\r\n            &quot;Resource&quot;: &quot;*&quot;\r\n        }\r\n    ]\r\n}\r\n<\/pre>\n<\/div>\n<p><\/em><\/p><\/blockquote>\n<p>Ve son olarak her iki uygulaman\u0131n &#8216;appsettings.json&#8217; dosyas\u0131nda a\u015fa\u011f\u0131daki yap\u0131land\u0131rmalarda bulunal\u0131m;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n  &quot;AWS&quot;: {\r\n    &quot;Profile&quot;: &quot;sqs-profile&quot;,\r\n    &quot;Region&quot;: &quot;ap-south-1&quot;,\r\n    &quot;AccessKey&quot;: &quot;***&quot;,\r\n    &quot;SecretKey&quot;: &quot;***&quot;\r\n  }\r\n<\/pre>\n<\/div>\n<p>\u0130\u015fte bu yap\u0131land\u0131rmalar ve \u00e7al\u0131\u015fmalardan sonra uygulamay\u0131 topyek\u00fcn derleyip \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda MassTransit arac\u0131l\u0131\u011f\u0131yla ba\u015far\u0131l\u0131 bir haberle\u015fmenin sa\u011fland\u0131\u011f\u0131n\u0131 tecr\u00fcbe etmi\u015f olaca\u011f\u0131z.<\/p>\n<p>\u0130\u00e7erik boyunca olu\u015fturdu\u011fumuz kuyruklara g\u00f6z atarsak e\u011fer a\u015fa\u011f\u0131daki gibi g\u00f6z\u00fckecektir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-4.png\" alt=\"Amazon SQS &amp; Asp.NET Core - Scalable Messaging\" width=\"387\" height=\"255\" class=\"aligncenter size-full wp-image-27149\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-4.png 387w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2024\/08\/Amazon-SQS-Asp.NET-Core-Scalable-Messaging-4-300x198.png 300w\" sizes=\"auto, (max-width: 387px) 100vw, 387px\" \/><\/a><\/p>\n<p>Nihai olarak;<br \/>\nAmazon SQS hakk\u0131nda bilgi edinmi\u015f ve kuyruk yap\u0131s\u0131na dair temel kavramlar\u0131 ke\u015ffetmi\u015f bulunuyoruz. Art\u0131k ihtiya\u00e7 noktalar\u0131nda RabbitMQ ve Kafka teknolojilerine kar\u015f\u0131n Amazon SQS&#8217;i bir alternatif olarak de\u011ferlendirebilir ve Amazon&#8217;un sundu\u011fu avantajlardan istifade edebiliriz.<\/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..<\/p>\n<p>Not : \u00d6rnek \u00e7al\u0131\u015fman\u0131n github adresine a\u015fa\u011f\u0131dan eri\u015febilirsiniz.<br \/>\n<a href=\"https:\/\/github.com\/gncyyldz\/AmazonSQS.Example\" rel=\"noopener\" target=\"_blank\">https:\/\/github.com\/gncyyldz\/AmazonSQS.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, Biliyorsunuz ki, bir yaz\u0131l\u0131m i\u00e7in \u00f6nem arz eden bir\u00e7ok fakt\u00f6r aras\u0131ndan \u00f6l\u00e7eklenebilirlik ve g\u00fcvenilir mesajla\u015fma yap\u0131lanmas\u0131 olduk\u00e7a kritik arz etmektedir. Bu ihtiya\u00e7lara kar\u015f\u0131n kullanabilece\u011fimiz muhtelif teknolojiler olmas\u0131n\u0131n yan\u0131nda Amazon SQS&#8217;de imdad\u0131m\u0131za yeti\u015fmekte 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":27152,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4692,5089,2668],"tags":[5093,5090,5091,2679,5106,5105,5107,4016,4017,5101,5100,5102,5108,4018,5103,5092,5099,5104],"class_list":["post-27121","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-amazon-s3","category-amazon-sqs","category-asp-net-core-2","tag-amazon-simple-queue-service","tag-amazon-sqs","tag-amazon-sqs-scalable-messaging","tag-asp-net-core","tag-dead-letter-queue","tag-dead-letter-queue-dlq","tag-dlq","tag-enterprise-service-bus","tag-esb","tag-fifo-first-in-first-out-queues","tag-fifo-queues","tag-first-in-first-out-queues","tag-kebabcaseendpointnameformatter","tag-masstransit","tag-message-processing","tag-scalable-messaging","tag-standard-queues","tag-visibility-timeout"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/27121","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=27121"}],"version-history":[{"count":12,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/27121\/revisions"}],"predecessor-version":[{"id":27151,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/27121\/revisions\/27151"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/27152"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=27121"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=27121"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=27121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}