﻿
{"id":28771,"date":"2026-07-16T04:50:00","date_gmt":"2026-07-16T04:50:00","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=28771"},"modified":"2026-07-16T04:50:00","modified_gmt":"2026-07-16T04:50:00","slug":"nette-nats-jetstream-ile-calismak","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/nette-nats-jetstream-ile-calismak\/","title":{"rendered":".NET&#8217;te NATS JetStream \u0130le \u00c7al\u0131\u015fmak"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-4.png\" alt=\".NET&#039;te NATS JetStream \u0130le \u00c7al\u0131\u015fmak\" width=\"1536\" height=\"1024\" class=\"alignleft size-full wp-image-28794\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-4.png 1536w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-4-300x200.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-4-1024x683.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-4-768x512.png 768w\" sizes=\"auto, (max-width: 1536px) 100vw, 1536px\" \/><\/a>Merhaba,<br \/>\n<br \/>\nMicroservice mimarileri yayg\u0131nla\u015ft\u0131k\u00e7a uygulamalar aras\u0131ndaki ileti\u015fim de giderek daha kritik bir hal almaktad\u0131r. Bir sipari\u015f olu\u015fturuldu\u011funda stok servisinin haberdar edilmesi, \u00f6deme tamamland\u0131\u011f\u0131nda e-posta g\u00f6nderilmesi veya arka planda \u00e7al\u0131\u015fan onlarca servisin birbirleriyle g\u00fcvenilir bir \u015fekilde haberle\u015fmesi art\u0131k modern yaz\u0131l\u0131m geli\u015ftirmenin temel ihtiya\u00e7lar\u0131ndan birisidir. Bu noktada mesajla\u015fma sistemleri (message broker) devreye girmektedir. Uzun y\u0131llard\u0131r <a href=\"https:\/\/www.gencayyildiz.com\/blog\/category\/rabbitmq\/\" target=\"_blank\">RabbitMQ<\/a>, <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/kafka\/\" target=\"_blank\">Apache Kafka<\/a> ve Azure Service Bus gibi \u00e7\u00f6z\u00fcmler bu ihtiyac\u0131 kar\u015f\u0131l\u0131yor olsa da son y\u0131llarda performans\u0131, d\u00fc\u015f\u00fck gecikme s\u00fcresi ve sade mimarisiyle \u00f6ne \u00e7\u0131kan <em><strong>NATS<\/strong><\/em> ve onun kal\u0131c\u0131 mesajla\u015fma katman\u0131 olan <em><strong>JetStream<\/strong><\/em>, \u00f6zellikle microserve tabanl\u0131 .NET uygulamalar\u0131nda g\u00fc\u00e7l\u00fc bir alternatif haline gelmektedir. Bu i\u00e7eri\u011fimizde, <em>NATS<\/em> ve <em>JetStream<\/em>&#8216;in ne oldu\u011funu, birbirlerinden hangi noktalarda ayr\u0131ld\u0131klar\u0131n\u0131, hangi problemleri \u00e7\u00f6zd\u00fcklerini ve Asp.NET Core uygulamalar\u0131nda nas\u0131l kullan\u0131labileceklerini ad\u0131m ad\u0131m inceleyecek ve ayr\u0131ca makalenin sonunda yaln\u0131zca temel <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/publish-subscribe-pattern\/\" target=\"_blank\">Publish\/Subscribe<\/a> yap\u0131s\u0131n\u0131 de\u011fil, kal\u0131c\u0131 mesajlar (Persistence), ACK mekanizmas\u0131, Durable Consumer, Stream yap\u0131lar\u0131 ve g\u00fcvenilir event i\u015fleme gibi production ortamlar\u0131nda ihtiya\u00e7 duyulan bir\u00e7ok \u00f6zellikleri de uygulamal\u0131 olarak irdelemi\u015f olaca\u011f\u0131z.<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_88 counter-hierarchy ez-toc-counter ez-toc-light-blue ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Ba\u015fl\u0131klar<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u0130\u00e7indekiler Tablosunu A\u00e7\/Kapat\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-nats-jetstream-ile-calismak\/#NATS_Nedir\" >NATS Nedir?<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-nats-jetstream-ile-calismak\/#NATSin_Calisma_Mantigi_Nasildir\" >NATS&#8217;\u0131n \u00c7al\u0131\u015fma Mant\u0131\u011f\u0131 Nas\u0131ld\u0131r?<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-nats-jetstream-ile-calismak\/#JetStream_Nedir\" >JetStream Nedir?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-nats-jetstream-ile-calismak\/#Kullanimini_Inceleyelim%E2%80%A6\" >Kullan\u0131m\u0131n\u0131 \u0130nceleyelim&#8230;<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-nats-jetstream-ile-calismak\/#NATS_Serverin_Kurulumu_Docker\" >NATS Server&#8217;\u0131n Kurulumu (Docker)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-nats-jetstream-ile-calismak\/#AspNET_Core_Uzerinden_Core_NATSa_Baglanma\" >Asp.NET Core \u00dczerinden Core NATS&#8217;a Ba\u011flanma<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-nats-jetstream-ile-calismak\/#Mesaj_Yayinlama_ve_Subscriber_Olusturma\" >Mesaj Yay\u0131nlama ve Subscriber Olu\u015fturma<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-nats-jetstream-ile-calismak\/#Console_Applicationdan_Subscriber_Olusturma\" >Console Application&#8217;dan Subscriber Olu\u015fturma<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-nats-jetstream-ile-calismak\/#Islem_Tamamlandiktan_Sonra_ACK_Gonderin\" >\u0130\u015flem Tamamland\u0131ktan Sonra ACK G\u00f6nderin!<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-nats-jetstream-ile-calismak\/#Consumerlari_Idempotent_Olarak_Ayarlayin\" >Consumer&#8217;lar\u0131 Idempotent Olarak Ayarlay\u0131n!<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"NATS_Nedir\"><\/span>NATS Nedir?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>NATS, distributed sistemler ve microservice mimariler i\u00e7in geli\u015ftirilmi\u015f, y\u00fcksek performansl\u0131 ve d\u00fc\u015f\u00fck gecikmeli (low latency) bir mesajla\u015fma sistemidir (ya da bir ba\u015fka deyi\u015fle message broker&#8217;d\u0131r) Temel amac\u0131, uygulamalar\u0131n birbirleriyle do\u011frudan ba\u011flant\u0131 kurmas\u0131na gerek kalmaks\u0131z\u0131n g\u00fcvenilir ve h\u0131zl\u0131 bir \u015fekilde haberle\u015febilmelerini sa\u011flamakt\u0131r.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"NATSin_Calisma_Mantigi_Nasildir\"><\/span>NATS&#8217;\u0131n \u00c7al\u0131\u015fma Mant\u0131\u011f\u0131 Nas\u0131ld\u0131r?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>NATS&#8217;\u0131n temel \u00e7al\u0131\u015fma prensibi Puclic\/Subscribe mant\u0131\u011f\u0131na dayanmaktad\u0131r. Bir <strong><em>subject<\/em><\/strong>&#8216;e mesaj yay\u0131nland\u0131\u011f\u0131 taktirde, o subject&#8217;e abone olan\/dinleyen herkese bu mesaj g\u00f6nderilecektir. E\u011fer subject&#8217;i kimse dinlemiyorsa, mesaj kaybolacakt\u0131r. Yani anlayaca\u011f\u0131n\u0131z canl\u0131 bildirim senaryolar\u0131 i\u00e7in olduk\u00e7a uygundur ancak i\u015f kuyru\u011fu dedi\u011fimiz (work queue) i\u00e7in hi\u00e7te de\u011fildir!<\/p>\n<blockquote><p><em>Esas\u0131nda NATS&#8217;te queue diye bir kavram yoktur. Onun yerine <strong>subject<\/strong> kavram\u0131 vard\u0131r. <strong>Subject<\/strong>, mesajlar\u0131n hangi topic&#8217;e ait oldu\u011funu belirten mant\u0131ksal kanald\u0131r. Producer mesaj\u0131n\u0131 belirli bir subject&#8217;e yay\u0131nlar, bu subject&#8217;i dinleyen t\u00fcm subscriber&#8217;lar ise mesaj\u0131 elde edebilirler.<\/em><\/p><\/blockquote>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak.png\" alt=\".NET&#039;te NATS JetStream \u0130le \u00c7al\u0131\u015fmak\" width=\"766\" height=\"493\" class=\"aligncenter size-full wp-image-28775\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak.png 766w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-300x193.png 300w\" sizes=\"auto, (max-width: 766px) 100vw, 766px\" \/><\/a><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-1.png\" alt=\".NET&#039;te NATS JetStream \u0130le \u00c7al\u0131\u015fmak\" width=\"771\" height=\"418\" class=\"aligncenter size-full wp-image-28777\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-1.png 771w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-1-300x163.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-1-768x416.png 768w\" sizes=\"auto, (max-width: 771px) 100vw, 771px\" \/><\/a><\/p>\n<h2><span class=\"ez-toc-section\" id=\"JetStream_Nedir\"><\/span>JetStream Nedir?<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<blockquote><p><em>JetStream, NATS&#8217;in persistent messaging katman\u0131d\u0131r.<\/em><\/p><\/blockquote>\n<p>NATS&#8217;in varsay\u0131lan \u00e7al\u0131\u015fma mant\u0131\u011f\u0131nda mesajlar yaln\u0131zca o anda subscribe olmu\u015f olanlara iletilecektir. E\u011fer ilgili subscriber \u00e7al\u0131\u015fm\u0131yorsa veya o subject&#8217;i dinleyen hi\u00e7bir uygulama yoksa, mesaj kal\u0131c\u0131 olarak saklanmayacak ve kaybolacakt\u0131r.<\/p>\n<p>Bu davran\u0131\u015f ger\u00e7ek zamanl\u0131 (real-time) haberle\u015fme senaryolar\u0131 i\u00e7in olduk\u00e7a avantajl\u0131d\u0131r. \u00c7\u00fcnk\u00fc NATS&#8217;in bu kadar y\u00fcksek performans sunmas\u0131n\u0131n en \u00f6nemli sebeplerinden biri de mesajlar\u0131 varsay\u0131lan olarak diske yazmamas\u0131d\u0131r.<\/p>\n<p>Ancak hak verirsiniz ki her sistem canl\u0131 bildirim mant\u0131\u011f\u0131yla \u00e7al\u0131\u015fmamaktad\u0131r. \u00d6rne\u011fin, bir e-ticaret uygulamas\u0131nda olu\u015fturulan sipari\u015f, tamamlanan \u00f6deme veya ger\u00e7ekle\u015ftirilen banka transferi gibi olaylar\u0131n kaybolmas\u0131 kabul edilebilir bir durum de\u011fildir \ud83d\ude42 E\u011fer ilgili servis o anda \u00e7al\u0131\u015fm\u0131yorsa bile, sistem aya\u011fa kalkt\u0131\u011f\u0131nda bu mesaj\u0131n al\u0131n\u0131p i\u015flenebilmesi gerekmektedir.<\/p>\n<p>\u0130\u015fte JetStream, tam olarak bu problemi \u00e7\u00f6zmek i\u00e7in geli\u015ftirilmi\u015ftir. JetStream, NATS&#8217;in \u00fczerine eklenen bir persistence (kal\u0131c\u0131 mesajla\u015fma) katman\u0131d\u0131r. Mesajlar\u0131 yaln\u0131zca iletmekle kalmamakta, ayn\u0131 zamanda belirlenen kurallara g\u00f6re diskte saklamakta, gerekti\u011finde ise tekrar t\u00fcketilmesini sa\u011flayarak, mesajlar\u0131n g\u00fcvenilir bir \u015fekilde i\u015flenmesini takip etmektedir.<\/p>\n<p>B\u00f6ylece NATS, yaln\u0131zca anl\u0131k mesajla\u015fma yapan bir message broker olmaktan \u00e7\u0131kabilmekte ve g\u00fcvenilir mesaj teslimi (reliable messaging) yapabilen ve event streaming yetene\u011fine sahip olan g\u00fc\u00e7l\u00fc bir platform haline gelmektedir.<\/p>\n<p>JetStream sayesinde;<\/p>\n<ul style=\"font-size:14px;\">\n<li>Mesajlar kal\u0131c\u0131 olarak saklanabilmektedir.<\/li>\n<li>Daha sonra sisteme kat\u0131lan consumer&#8217;lar ge\u00e7mi\u015f mesajlar\u0131 okuyabilmektedir.<\/li>\n<li>\u0130\u015flenemeyen mesajlar tekrar i\u015flenebilmektedir (retry)<\/li>\n<li>Consumer&#8217;\u0131n mesaj\u0131 ba\u015far\u0131yla i\u015fledi\u011fi ACK mekanizmas\u0131yla do\u011frulanabilmektedir.<\/li>\n<li>Consumer kapansa bile kald\u0131\u011f\u0131 yerden devam edebilmektedir (durable consumer)<\/li>\n<li>\u0130stenildi\u011finde ge\u00e7mi\u015f mesajlar yeniden oynat\u0131labilmektedir (replay)<\/li>\n<\/ul>\n<blockquote><p><em>K\u0131saca JetStream&#8217;in temel amac\u0131, Core NATS&#8217;in h\u0131z\u0131ndan vazge\u00e7meden, mesajlar\u0131n g\u00fcvenilir bir \u015fekilde saklanmas\u0131n\u0131 ve t\u00fcketilmesini sa\u011flamakt\u0131r.<\/em><\/p><\/blockquote>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-2.png\" alt=\".NET&#039;te NATS JetStream \u0130le \u00c7al\u0131\u015fmak\" width=\"861\" height=\"685\" class=\"aligncenter size-full wp-image-28780\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-2.png 861w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-2-300x239.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-2-768x611.png 768w\" sizes=\"auto, (max-width: 861px) 100vw, 861px\" \/><\/a><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Kullanimini_Inceleyelim%E2%80%A6\"><\/span>Kullan\u0131m\u0131n\u0131 \u0130nceleyelim&#8230;<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>NATS ve JetStream&#8217;in hangi problemleri \u00e7\u00f6zd\u00fc\u011f\u00fcn\u00fc ve birbirlerinden hangi noktalarda ayr\u0131ld\u0131klar\u0131n\u0131 inceledi\u011fimize g\u00f6re, art\u0131k bunlar\u0131 .NET uygulamalar\u0131nda nas\u0131l kullanabilece\u011fimize ge\u00e7ebiliriz. Bu a\u015famada, \u00f6ncelikle NATS sunucusunun kurulumuna odaklanacak, ard\u0131ndan bu sunucuya ba\u011flant\u0131 kurarak, mesaj yay\u0131nlama ve dinleme i\u015flemlerini ele al\u0131yor olaca\u011f\u0131z. Devam\u0131nda ise ayn\u0131 \u00f6rne\u011fi JetStream deste\u011fiyle geli\u015ftirerek mesajlar\u0131n kal\u0131c\u0131 olarak saklanmas\u0131n\u0131 sa\u011flayacak ve nihai olarak da ACK mekanizmas\u0131n\u0131 ve g\u00fcvenilir mesaj t\u00fcketimini de uygulamal\u0131 olarak inceliyor olaca\u011f\u0131z.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"NATS_Serverin_Kurulumu_Docker\"><\/span>NATS Server&#8217;\u0131n Kurulumu (Docker)<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>NATS ile ilgili \u00e7al\u0131\u015fmalara ge\u00e7meden \u00f6nce mesajlar\u0131 y\u00f6netecek olan NATS Server&#8217;\u0131 aya\u011fa kald\u0131rmam\u0131z gerekmektedir. Bunun i\u00e7in Core NATS&#8217;\u0131 JetStream deste\u011fiyle birlikte Docker ortam\u0131nda \u00e7al\u0131\u015ft\u0131rabilmek i\u00e7in a\u015fa\u011f\u0131daki talimattan istifade edebiliriz:<\/p>\n<p><code style=\"background: #0f172a;color: #38bdf8;padding: 16px 20px;border-radius: 12px;font-family: system-ui, -apple-system, sans-serif;border: 1px solid #334155;margin: 1.2em 0;box-shadow: 0 4px 15px rgba(0,0,0,0.25);text-decoration: none;font-weight: 500;word-break: break-all;transition: color 0.2s;\"><strong style=\"color:#60a5fa;font-size:15px;\">docker run -d --name nats -p 4222:4222 -p 8222:8222 nats:latest -js -m 8222<\/strong><\/code><\/p>\n<p>Bu talimatta kulland\u0131\u011f\u0131m\u0131z <code>-js<\/code> parametresi ile NATS Server&#8217;da JetStream \u00f6zelli\u011fi aktif bir \u015fekilde gelmektedir. <code>-m 8222<\/code> parametresi ise NATS Server&#8217;\u0131n monitoring dashboard&#8217;unu <a href=\"http:\/\/localhost:8222\/\" target=\"_blank\">http:\/\/localhost:8222\/<\/a> portunda aktifle\u015ftirecektir.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"AspNET_Core_Uzerinden_Core_NATSa_Baglanma\"><\/span>Asp.NET Core \u00dczerinden Core NATS&#8217;a Ba\u011flanma<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Asp.NET Core&#8217;dan NATS&#8217;a ba\u011flant\u0131 sa\u011flayabilmek i\u00e7in \u00f6ncelikle a\u015fa\u011f\u0131daki iki paketin uygulamaya y\u00fcklenmesi gerekmektedir:<\/p>\n<div style=\"margin: 36px 0;padding: 18px 20px;border: 1px solid #c7d2fe;border-radius: 6px;background: #eef2ff;font-family: system-ui, sans-serif;\">\n<div style=\"font-size: 13px;font-weight: 600;color: #3730a3;margin-bottom: 8px;\">\n        Gerekli K\u00fct\u00fcphaneler\n    <\/div>\n<div style=\"font-size: 15px;line-height: 1.7;color: #1e293b;\">\n<ul>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/NATS.Net\/\" target=\"_blank\">NATS.Net<\/a><\/li>\n<li><a href=\"https:\/\/www.nuget.org\/packages\/NATS.Extensions.Microsoft.DependencyInjection\" target=\"_blank\">NATS.Extensions.Microsoft.DependencyInjection<\/a><\/li>\n<\/ul><\/div>\n<\/div>\n<p>Ard\u0131ndan a\u015fa\u011f\u0131daki yap\u0131land\u0131rmalar e\u015fli\u011finde servisler uygulamaya eklenmelidir:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nbuilder.Services.AddNatsClient(natsBuilder =&gt;\r\n    natsBuilder.ConfigureConnection(natsConnection =&gt; new NatsConnection(NatsOpts.Default with { Url = &quot;nats:\/\/localhost:4222&quot; })));\r\n\r\nbuilder.Services.AddSingleton(serviceProvider =&gt;\r\n    serviceProvider.GetRequiredService&lt;INatsConnection&gt;().CreateJetStreamContext());\r\n<\/pre>\n<\/div>\n<p>Burada <code>AddNatsClient<\/code> metodu ile NATS&#8217;a ait servisler uygulaman\u0131n IoC container&#8217;\u0131na y\u00fcklenmekte ve bir yandan da NATS Server&#8217;a ba\u011flant\u0131 ger\u00e7ekle\u015ftirilmektedir. <code>CreateJetStreamContext<\/code> metodu ise bu NATS ba\u011flant\u0131s\u0131 \u00fczerinden JetStream \u00f6zelliklerine eri\u015fim sa\u011flamaktad\u0131r.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Mesaj_Yayinlama_ve_Subscriber_Olusturma\"><\/span>Mesaj Yay\u0131nlama ve Subscriber Olu\u015fturma<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Asp.NET Core \u00fczerinden mesaj yay\u0131nlamay\u0131 \u00f6rneklendirebilmek i\u00e7in a\u015fa\u011f\u0131daki gibi basit bir endpoint olu\u015fturulmas\u0131 yeterli olacakt\u0131r kanaatindeyim:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napp.MapGet(&quot;\/create-job&quot;, async (INatsJSContext natsJSContext, CancellationToken cancellationToken) =&gt;\r\n{\r\n    PubAckResponse pubAckResponse = await natsJSContext.PublishAsync(\r\n                                            subject: Subjects.JobsSubject,\r\n                                            data: new Message(Text: &quot;Naber d\u00fcyna!&quot;, Date: DateTime.UtcNow),\r\n                                            cancellationToken: cancellationToken);\r\n    pubAckResponse.EnsureSuccess();\r\n\r\n    return TypedResults.Ok();\r\n});\r\n<\/pre>\n<\/div>\n<p>Ve bu mesaj\u0131 yine Asp.NET Core&#8217;da t\u00fcketebilmek i\u00e7in de a\u015fa\u011f\u0131daki gibi bir background service tasarlanabilir:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class JowWorkerBackgroundService(INatsJSContext natsJSContext) : BackgroundService\r\n    {\r\n        protected override async Task ExecuteAsync(CancellationToken stoppingToken)\r\n        {\r\n            await natsJSContext.CreateStreamAsync(new StreamConfig(&quot;JOBS&quot;, &#x5B;&quot;jobs-subject&quot;])\r\n            {\r\n                Retention = StreamConfigRetention.Workqueue,\r\n                Storage = StreamConfigStorage.File\r\n            });\r\n\r\n            var consumer = await natsJSContext.CreateOrUpdateConsumerAsync(&quot;JOBS&quot;, new ConsumerConfig(&quot;JOBS-CONSUMER&quot;)\r\n            {\r\n                AckWait = TimeSpan.FromSeconds(30),\r\n                AckPolicy = ConsumerConfigAckPolicy.Explicit,\r\n                MaxDeliver = 5\r\n            }, cancellationToken: stoppingToken);\r\n\r\n            await foreach (var message in consumer.ConsumeAsync&lt;Message&gt;(cancellationToken: stoppingToken))\r\n            {\r\n                await Console.Out.WriteLineAsync($&quot;Message : {message.Data.Text}&quot;);\r\n                await Console.Out.WriteLineAsync($&quot;Date : {message.Data.Date}&quot;);\r\n                await Console.Out.WriteLineAsync($&quot;****************&quot;);\r\n                await message.AckAsync();\r\n            }\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Burada \u00f6nemli g\u00f6rd\u00fc\u011f\u00fcm baz\u0131 noktalar\u0131 izah etmekte fayda g\u00f6rmekteyim; <code>CreateStreamAsync<\/code> metodu ile mesajlar\u0131 kal\u0131c\u0131 olarak saklayabilmek i\u00e7in bir stream olu\u015fturulmaktad\u0131r. Normal \u015fartlarda NATS, <code>fire-and-forget<\/code> davran\u0131\u015f\u0131 sergiledi\u011fi, yani al\u0131c\u0131 yoksa mesajlar kaybolaca\u011f\u0131 i\u00e7in bu \u00f6zellik tam da bu noktada JetStream ile devreye sokulmu\u015f olacakt\u0131r. Dikkat ederseniz <code>Storage<\/code> property&#8217;sine <em>&#8216;File&#8217;<\/em> de\u011feri verilmi\u015ftir. B\u00f6ylece mesajlar disk&#8217;te saklanacak ve sunucu kapansa dahi korunacakt\u0131rlar. E\u011fer bu property&#8217;e <em>&#8216;Memory&#8217;<\/em> de\u011feri verilmi\u015f olsayd\u0131 mesajlar bellekte saklanacakt\u0131 ve sunucu kapand\u0131\u011f\u0131 taktirde do\u011fal olarak kaybolacaklard\u0131&#8230;<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-3.png\" alt=\".NET&#039;te NATS JetStream \u0130le \u00c7al\u0131\u015fmak\" width=\"305\" height=\"492\" class=\"alignleft size-full wp-image-28783\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-3.png 305w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/07\/NETte-NATS-JetStream-Ile-Calismak-3-186x300.png 186w\" sizes=\"auto, (max-width: 305px) 100vw, 305px\" \/><\/a><em><strong>Ee peki hoca, mesajlar disk&#8217;te kal\u0131c\u0131 hale getirildi\u011finde nerede tutuluyorlar?<\/strong><\/em> sorunuzu duyar gibiyim&#8230; Bunun i\u00e7in NATS&#8217;in dashboard&#8217;undan JetStream verilerine <a href=\"http:\/\/localhost:8222\/jsz\" target=\"_blank\">http:\/\/localhost:8222\/jsz<\/a> adresinden bakmam\u0131z yeterli olacakt\u0131r.<\/p>\n<p>Dikkat ederseniz yandaki g\u00f6rselde de vurguland\u0131\u011f\u0131 gibi <em>store_dir<\/em> alan\u0131 mesajlar\u0131n kal\u0131c\u0131 olarak sakland\u0131\u011f\u0131 path&#8217;i bizlere vermektedir.<\/p>\n<p><code>Retention<\/code> property&#8217;sine gelirsek e\u011fer mesajlar\u0131n ne zaman silinece\u011fini belirleyen bir \u00f6zelliktir. Burada <em>&#8216;Workqueue&#8217;<\/em> diyerek ilgili mesaj\u0131n ACK edildi\u011fi taktirde silinece\u011fini ifade etmi\u015f oluyoruz. Ayr\u0131ca <em>&#8216;Limits&#8217;<\/em> diyerek belirleyebilece\u011fimiz boyut, say\u0131 veya s\u00fcre limitine g\u00f6re silmeyi ger\u00e7ekle\u015ftirtebiliriz ya da Interest diyerek de hi\u00e7 consumer kalmad\u0131\u011f\u0131 taktirde mesajlar\u0131 sildiretebiliriz.<\/p>\n<p>Diyelim ki, \u00f6rnekte oldu\u011fu gibi bu alan <em>&#8216;Workqueue&#8217;<\/em> olarak yap\u0131land\u0131r\u0131lm\u0131\u015f olmas\u0131na ra\u011fmen, foreach d\u00f6ng\u00fcs\u00fc i\u00e7erisinde <code>AckAsync<\/code> \u00e7a\u011fr\u0131s\u0131 yap\u0131lmam\u0131\u015f olsayd\u0131, mesaj <code>AckWait<\/code> s\u00fcresi dolduktan sonra yeniden subscriber taraf\u0131ndan teslim al\u0131nacakt\u0131.<\/p>\n<p><code>CreateOrUpdateConsumerAsync<\/code> metoduna gelirsek e\u011fer bunla da ad\u0131 \u00fczerinde olu\u015fturulan stream&#8217;i okuyan\/t\u00fcketen bir consumer olu\u015fturulmaktad\u0131r. Burada da ak\u0131llara muhtemelen <em><strong>birden fazla consumer olu\u015fturursak ne olur?<\/strong><\/em> sorusu gelecektir. Bu sorunun iki t\u00fcrl\u00fc cevab\u0131n\u0131 verebiliriz;<\/p>\n<ul style=\"font-size:14px;\">\n<li><em><strong>Ayn\u0131 isimde farkl\u0131 makinelerde consumer olu\u015fturulursa&#8230;<\/strong><\/em>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\/\/ Makine 1\r\nnew ConsumerConfig(&quot;JOBS-CONSUMER&quot;)\r\n\r\n\/\/ Makine 2\r\nnew ConsumerConfig(&quot;JOBS-CONSUMER&quot;)  \/\/ AYNI \u0130S\u0130M\r\n\r\n\/\/ Makine 3\r\nnew ConsumerConfig(&quot;JOBS-CONSUMER&quot;)  \/\/ AYNI \u0130S\u0130M\r\n<\/pre>\n<\/div>\n<p>Bu durumda mesajlar makineler aras\u0131nda payla\u015ft\u0131r\u0131lacak ve b\u00f6ylece load balancing davran\u0131\u015f\u0131 sergilenmi\u015f olacakt\u0131r. Her mesaj sadece bir worker&#8217;a g\u00f6nderilecektir&#8230;<\/p>\n<div style=\"background:#0d0d0d;color:#e6e6e6;font-family:Consolas,'Courier New',monospace;white-space:pre;line-height:0.8;padding:12px;width:150px;font-size:12px;\">Mesaj 1 \u2192 Makine 1<br \/>\nMesaj 2 \u2192 Makine 2<br \/>\nMesaj 3 \u2192 Makine 1\n<\/div>\n<\/li>\n<li><em><strong>Farkl\u0131 isimlerde consumer&#8217;lar olu\u015fturulursa&#8230;<\/strong><\/em>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\/\/ Worker 1\r\nnew ConsumerConfig(&quot;JOBS-CONSUMER-1&quot;)\r\n\r\n\/\/ Worker 2\r\nnew ConsumerConfig(&quot;JOBS-CONSUMER-2&quot;)  \/\/ FARKLI \u0130S\u0130M\r\n\r\n\/\/ Worker 3\r\nnew ConsumerConfig(&quot;JOBS-CONSUMER-3&quot;)  \/\/ FARKLI \u0130S\u0130M\r\n<\/pre>\n<\/div>\n<p>Bu durumda da birbirlerinden ger\u00e7ekten farkl\u0131 consumer&#8217;lar \u00fcretilmi\u015f olacakt\u0131r. Dolay\u0131s\u0131yla mesajlar hepsine g\u00f6nderilmi\u015f olacakt\u0131r.\n<\/li>\n<\/ul>\n<h5><span class=\"ez-toc-section\" id=\"Console_Applicationdan_Subscriber_Olusturma\"><\/span>Console Application&#8217;dan Subscriber Olu\u015fturma<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Ayr\u0131ca Asp.NET Core&#8217;daki background service&#8217;in d\u0131\u015f\u0131nda bir console uygulamas\u0131ndan da nas\u0131l subscriber olu\u015fturabilece\u011fimizi ele almakta fayda g\u00f6rmekteyim. Bunun i\u00e7in ilgili console uygulamas\u0131na <a href=\"https:\/\/www.nuget.org\/packages\/NATS.Net\/\" target=\"_blank\">NATS.Net<\/a> k\u00fct\u00fcphanesi y\u00fcklenmeli ve a\u015fa\u011f\u0131daki gibi bir \u00e7al\u0131\u015fma ger\u00e7ekle\u015ftirilmelidir:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing NATS.JetStream.Demo.Shared;\r\nusing NATS.Net;\r\n\r\nawait using var natsClient = new NatsClient();\r\n\r\nawait foreach (var message in natsClient.Connection.SubscribeAsync&lt;Message&gt;(subject: Subjects.JobsSubject))\r\n{\r\n    await Console.Out.WriteLineAsync($&quot;Message : {message.Data.Text}&quot;);\r\n    await Console.Out.WriteLineAsync($&quot;Date : {message.Data.Date}&quot;);\r\n    await Console.Out.WriteLineAsync($&quot;****************&quot;);\r\n}\r\n<\/pre>\n<\/div>\n<h4><span class=\"ez-toc-section\" id=\"Islem_Tamamlandiktan_Sonra_ACK_Gonderin\"><\/span>\u0130\u015flem Tamamland\u0131ktan Sonra ACK G\u00f6nderin!<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>JetStream ile \u00e7al\u0131\u015fan consumer uygulamalar\u0131nda dikkat edilmesi gereken en \u00f6nemli husus, ACK (Acknowledgement) mesaj\u0131n\u0131n i\u015f mant\u0131\u011f\u0131 ba\u015far\u0131yla tamamland\u0131ktan sonra g\u00f6nderilmesidir. Bunun nedeni, JetStream&#8217;in sundu\u011fu at-least-once delivery (en az bir kez teslimat) garantisine davran\u0131\u015fsal olarak riayet edebilmektir. Bu garanti sayesinde bir consumer, kendisine iletilen mesajlar\u0131 i\u015flerken beklenmedik bir \u015fekilde kapanabilir yahut ACK g\u00f6ndermeden \u00f6nce hata alabilir. B\u00f6yle bir durumda JetStream, mesajlar\u0131n kaybolmas\u0131n\u0131 \u00f6nlemek i\u00e7in belirli bir s\u00fcre sonra ayn\u0131 mesaj(lar)\u0131 yeniden ilgili consumer&#8217;a teslim etmelidir. Aksi taktirde mesaja dair i\u015flem tamamlanmadan \u00f6nce ACK g\u00f6nderilirse JetStream, ilgili mesaj\u0131n ba\u015far\u0131yla i\u015flendi\u011fini varsayacak ve b\u00f6ylece bahsedilen bu riskler ciddi olarak g\u00f6ze al\u0131nm\u0131\u015f olacakt\u0131r. Bu nedenle mesaj al\u0131nd\u0131ktan sonra i\u015flenmesi beklenmeli ve ba\u015far\u0131yla i\u015flendiyse ACK g\u00f6nderilmelidir.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Consumerlari_Idempotent_Olarak_Ayarlayin\"><\/span>Consumer&#8217;lar\u0131 Idempotent Olarak Ayarlay\u0131n!<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Bununla birlikte at-least-once delivery modelinin do\u011fal bir sonucu olarak ayn\u0131 mesaj\u0131n birden fazla kez i\u015flenmesi de s\u00f6z konusu olabilir. Yani consumer bir mesaj\u0131 ba\u015far\u0131yla i\u015flemi\u015f ancak ACK g\u00f6nderilmedi\u011fi i\u00e7in JetStream taraf\u0131ndan ayn\u0131 mesaj (t\u00fcrl\u00fc nedenlerden dolay\u0131) tekrar g\u00f6nderilmi\u015f olabilir. Evet&#8230; JetStream, mesajlar\u0131n consumer&#8217;lar taraf\u0131ndan i\u015flenip i\u015flenmedi\u011fini bilememektedir. Bu nedenle consumer uygulamalar\u0131n\u0131n da <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/idempotent\/\" target=\"_blank\">idempotent<\/a> olarak tasarlanmas\u0131 b\u00fcy\u00fck \u00f6nem ta\u015f\u0131maktad\u0131r. Ba\u015fka bir ifadeyle, ayn\u0131 mesaj birden fazla kez al\u0131nsa bile sistem her seferinde ayn\u0131 sonucu \u00fcretmeli ve ayn\u0131 i\u015flemi tekrar tekrar ger\u00e7ekle\u015ftirmemelidir. <\/p>\n<p>Nihai olarak;<br \/>\nBu makale boyunca NATS ve JetStream&#8217;in temel \u00e7al\u0131\u015fma mant\u0131\u011f\u0131n\u0131, birbirlerinden hangi noktalarda ayr\u0131ld\u0131klar\u0131n\u0131 ve .NET uygulamalar\u0131nda nas\u0131l kullan\u0131labileceklerini ad\u0131m ad\u0131m incelemi\u015f olduk. G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere NATS, d\u00fc\u015f\u00fck gecikme s\u00fcreleriyle i\u015flevsellik g\u00f6steren, son derece h\u0131zl\u0131 bir message broker&#8217;d\u0131r. Varsay\u0131lan olarak mesajlar\u0131 kal\u0131c\u0131 \u015fekilde saklamad\u0131\u011f\u0131 i\u00e7in canl\u0131 bildirimler ve ger\u00e7ek zamanl\u0131 haberle\u015fmeler gibi senaryolara olduk\u00e7a uyum g\u00f6stermektedir. Ancak mesaj kayb\u0131n\u0131n kabul edilemeyece\u011fi i\u015f ak\u0131\u015flar\u0131nda yeterli olmayaca\u011f\u0131 i\u00e7in JetStream imdad\u0131na yeti\u015fmektedir. JetStream ile NATS&#8217;in \u00fczerine kal\u0131c\u0131 mesajla\u015fma, ACK mekanizmas\u0131, retry, replay ve durable consumer gibi g\u00fcvenilir bir mesajla\u015fma altyap\u0131s\u0131 sunan \u00f6zellikler eklenmektedir.<\/p>\n<p>.NET taraf\u0131ndan olaya bakarsak e\u011fer NATS.NET paketi sayesinde hem Core NATS&#8217;in hem de JetStream yap\u0131land\u0131rmas\u0131n\u0131n olduk\u00e7a sade ve geli\u015ftirici dostu oldu\u011funu g\u00f6rmekteyiz. Birka\u00e7 sat\u0131r kodla mesaj yay\u0131nlayabilmekte, farkl\u0131 servislerde bu mesajlar\u0131 dinleyebilmekte ve JetStream sayesinde production ortamlar\u0131nda ihtiya\u00e7 duyulan g\u00fcvenilir mesaj i\u015fleme senaryolar\u0131n\u0131 kolayl\u0131kla hayata ge\u00e7irebilmekteyiz.<\/p>\n<p>Umar\u0131m bu i\u00e7erik, NATS ve JetStream&#8217;e ba\u015flang\u0131\u00e7 yapman\u0131z i\u00e7in faydal\u0131 bir kaynak olmu\u015ftur. <\/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<div style=\"max-width:720px;margin:24px auto;padding:18px 20px;border-radius:12px;background:linear-gradient(135deg,#0d1117,#161b22);border:1px solid #30363d;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;color:#e6edf3;box-shadow:0 10px 30px rgba(0,0,0,.35);\">\n<div style=\"display:flex;align-items:center;gap:14px;margin-bottom:12px;\">\n    <svg style=\"width:34px;height:34px;fill:#58a6ff;flex-shrink:0;\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n      <path d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82a7.65 7.65 0 012-.27c.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z\"><\/path>\n    <\/svg><\/p>\n<div>\n<div style=\"font-size:18px;font-weight:600;line-height:1.2;\">\u00d6rnek \u00e7al\u0131\u015fmaya a\u015fa\u011f\u0131daki GitHub reposundan eri\u015febilirsiniz.<\/div>\n<div style=\"font-size:13px;color:#8b949e;\">https:\/\/github.com\/gncyyldz\/NATS.JetStream.Demo.API<\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div style=\"font-size:14px;line-height:1.6;color:#c9d1d9;margin-bottom:14px;\">\n    Bu repository, ilgili konuya dair \u00f6rnek \u00e7al\u0131\u015fman\u0131n kaynak kodlar\u0131n\u0131 ve mimari yap\u0131s\u0131n\u0131 i\u00e7ermektedir. Detaylar i\u00e7in GitHub \u00fczerinden incelemede bulunabilirsiniz.\n  <\/div>\n<p>  <a href=\"https:\/\/github.com\/gncyyldz\/NATS.JetStream.Demo.API\" target=\"_blank\" rel=\"noopener noreferrer\"\n     style=\"display:inline-block;padding:10px 16px;border-radius:8px;background:#238636;color:#ffffff;text-decoration:none;font-size:14px;font-weight:600;transition:all .2s ease;\"><br \/>\n    GitHub\u2019da G\u00f6r\u00fcnt\u00fcle \u2192<br \/>\n  <\/a><\/p>\n<\/div>\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, Microservice mimarileri yayg\u0131nla\u015ft\u0131k\u00e7a uygulamalar aras\u0131ndaki ileti\u015fim de giderek daha kritik bir hal almaktad\u0131r. Bir sipari\u015f olu\u015fturuldu\u011funda stok servisinin haberdar edilmesi, \u00f6deme tamamland\u0131\u011f\u0131nda e-posta g\u00f6nderilmesi veya arka planda \u00e7al\u0131\u015fan onlarca servisin birbirleriyle g\u00fcvenilir bir&#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":28794,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3573],"tags":[5738,5734,3575,5733,5736,5735],"class_list":["post-28771","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-microservices","tag-at-least-once-delivery","tag-jetstream","tag-microservice","tag-nats","tag-publish-subscriber","tag-reliable-messaging"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28771","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=28771"}],"version-history":[{"count":14,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28771\/revisions"}],"predecessor-version":[{"id":28795,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28771\/revisions\/28795"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/28794"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=28771"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=28771"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=28771"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}