<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Sebahattin Tonbul | Blog</title>
	<atom:link href="http://www.sebahattint.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.sebahattint.com/</link>
	<description>Senior Software Developer</description>
	<lastBuildDate>Sun, 29 Jun 2025 12:56:00 +0000</lastBuildDate>
	<language>tr</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/03/cropped-logo2.png?fit=32%2C32&#038;ssl=1</url>
	<title>Sebahattin Tonbul | Blog</title>
	<link>https://www.sebahattint.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Kafka Nedir? .Net Core ile Kullanımı</title>
		<link>https://www.sebahattint.com/kafka-nedir-net-core-ile-kullanimi/</link>
					<comments>https://www.sebahattint.com/kafka-nedir-net-core-ile-kullanimi/#respond</comments>
		
		<dc:creator><![CDATA[Sebahattin]]></dc:creator>
		<pubDate>Sun, 29 Jun 2025 12:51:53 +0000</pubDate>
				<category><![CDATA[C Sharp (C#)]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Kafka]]></category>
		<category><![CDATA[Message Brokers]]></category>
		<category><![CDATA[.net core]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[kafka]]></category>
		<category><![CDATA[kafka architecture]]></category>
		<category><![CDATA[kafka broker]]></category>
		<category><![CDATA[kafka ui]]></category>
		<category><![CDATA[producer]]></category>
		<category><![CDATA[zookeeper]]></category>
		<guid isPermaLink="false">https://www.sebahattint.com/?p=460</guid>

					<description><![CDATA[<p>Apache Kafka, yüksek hacimli gerçek zamanlı (real-time) veri akışlarını güvenli ve hızlı bir şekilde işlemek için kullanılan dağıtık bir message queue sistemidir. İlk olarak Linkedin tarafından geliştirilmiş ve sonrasında Apache&#8230;</p>
<p><a href="https://www.sebahattint.com/kafka-nedir-net-core-ile-kullanimi/">Kafka Nedir? .Net Core ile Kullanımı</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Apache Kafka</strong>, yüksek hacimli gerçek zamanlı (real-time) veri akışlarını güvenli ve hızlı bir şekilde işlemek için kullanılan dağıtık bir message queue sistemidir.</p>



<p class="wp-block-paragraph">İlk olarak Linkedin tarafından geliştirilmiş ve sonrasında <strong>Apache Software Foundation</strong> çatısı altında open source haline getirilmiştir.</p>



<h3 class="wp-block-heading">Ne zaman kullanmalıyız?</h3>



<ul class="wp-block-list">
<li>Gerçek zamanlı veri işleme</li>



<li>Mikroservisler arası iletişim</li>



<li>Log toplama</li>



<li>Event sourcing</li>



<li>Stream processing </li>
</ul>



<h3 class="wp-block-heading">Kafka Mimarisi</h3>



<figure class="wp-block-image size-large is-resized"><img data-recalc-dims="1" fetchpriority="high" decoding="async" width="854" height="1024" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/kafka_architecture.png?resize=854%2C1024&#038;ssl=1" alt="" class="wp-image-483" style="width:823px;height:auto" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/kafka_architecture.png?resize=854%2C1024&amp;ssl=1 854w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/kafka_architecture.png?resize=250%2C300&amp;ssl=1 250w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/kafka_architecture.png?resize=768%2C920&amp;ssl=1 768w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/kafka_architecture.png?resize=1282%2C1536&amp;ssl=1 1282w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/kafka_architecture.png?w=1346&amp;ssl=1 1346w" sizes="(max-width: 854px) 100vw, 854px" /><figcaption class="wp-element-caption">via https://www.cloudduggu.com/kafka/architecture/</figcaption></figure>



<p class="wp-block-paragraph"></p>



<h3 class="wp-block-heading has-text-align-left">Kafka, aşağıdaki bileşenlerden oluşmaktadır:</h3>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<p class="wp-block-paragraph"><strong>Producer:</strong> Data&#8217;yı Kafka’ya gönderen bileşendir.</p>



<p class="wp-block-paragraph"><strong>Consumer:</strong> Kafka’daki datayı okuyan bileşendir.</p>



<p class="wp-block-paragraph"><strong>Kafka Broker:</strong> Kafka’nın kendisidir, mesajları alır, saklar ve dağıtır. Her broker, Kafka cluster’ının bir parçasıdır.</p>



<p class="wp-block-paragraph"><strong>Topic:</strong> Mesajların kategorize edildiği yapıdır. (Örnek: order-created, order-status-changed)</p>



<p class="wp-block-paragraph"><strong>Partition:</strong> Topic &#8216;ler bölünerek dağıtılabilir, bu da consumer lar tarafından datanın paralel işlemesini sağlar. Ayrıca Kafka, bir partition <strong>aynı anda sadece bir consumer</strong> tarafından okunabilir kuralına uyar. Ama bir consumer, <strong>birden fazla partitio</strong>n okuyabilir.</p>



<p class="wp-block-paragraph"><strong>Offset:</strong> Her consumer, okuduğu son mesajın &#8220;offset&#8221; numarasını tutar.</p>



<p class="wp-block-paragraph"><strong>Zookeeper:</strong>  Dağıtık sistemlerin koordinasyonunu sağlamak için kullanılan bir servis olup, özellikle birden fazla instance içeren sistemlerin yapılandırılması ve senkronize çalışması için gereklidir. Kafka Cluster&#8217;da node durumunu izlemek, topic ve mesajların listesini tutmak için kullanılır. Bu nedenle Kafka kurulumundan önce Zookeper &#8216;ın kurulması zorunludur.</p>



<p class="wp-block-paragraph">Şimdi <strong>.Net Core ile Kafka</strong> kullanımıyla ilgili yapacağımız örnek için gerekli kurulumları yapalım.</p>



<h3 class="wp-block-heading">Kafkayı Docker &#8216;da Çalıştırma</h3>



<p class="wp-block-paragraph">Zookeeper ve Kafka kurulumu için <strong>docker-compose.yml</strong> dosyamızın içeriği:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">YAML</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.5.0
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    ports:
      - "2181:2181"

  kafka:
    image: confluentinc/cp-kafka:7.5.0
    depends_on:
      - zookeeper
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: PLAINTEXT://:9092
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">services</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">zookeeper</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">image</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">confluentinc/cp-zookeeper:7.5.0</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">environment</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">ZOOKEEPER_CLIENT_PORT</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">2181</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">ZOOKEEPER_TICK_TIME</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">2000</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">ports</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #CE9178">&quot;2181:2181&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">kafka</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">image</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">confluentinc/cp-kafka:7.5.0</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">depends_on</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #CE9178">zookeeper</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">ports</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #CE9178">&quot;9092:9092&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">environment</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">KAFKA_BROKER_ID</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">KAFKA_ZOOKEEPER_CONNECT</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">zookeeper:2181</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">KAFKA_LISTENERS</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">PLAINTEXT://:9092</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">KAFKA_ADVERTISED_LISTENERS</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">PLAINTEXT://localhost:9092</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #569CD6">KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">1</span></span></code></pre></div>
</div></div>



<p class="wp-block-paragraph">Cmd veya git bash ile <strong>docker-compose up -d</strong> komutunu çalıştırın. Zookeeper ve Kafka imajları indirildikten sonra kurulacaktır. Aşağıdaki gibi Docker Desktop tada 2 servisinde ayağa kalktığını görebilirsiniz.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" decoding="async" width="1024" height="115" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-7.png?resize=1024%2C115&#038;ssl=1" alt="" class="wp-image-465" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-7.png?resize=1024%2C115&amp;ssl=1 1024w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-7.png?resize=300%2C34&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-7.png?resize=768%2C86&amp;ssl=1 768w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-7.png?w=1216&amp;ssl=1 1216w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Producer ve Consumer uygulamalarımızı yazalım.</p>



<h3 class="wp-block-heading">Hava Durumu Takibi Uygulama Örneği</h3>



<p class="wp-block-paragraph">.NET Core ile Kafka kullanarak basit bir hava durumu takip uygulaması geliştireceğiz. <strong>Producer</strong> olan uygulamamız, belirli aralıklarla sıcaklık verileri üretecek ve Kafka &#8216;ya iletecek. <strong>Consumer</strong> tarafındada bu değerleri okurken eğer sıcaklık belirli bir eşiğin üzerine çıkarsa, ekrana bir uyarı mesajı basacağız. Gerçek dünya projelerinde bu adımda genellikle email / notification gönderimi ya da socket üzerinden Client &#8216;ları bilgilendirme gibi işlemler gerçekleştirilebilir. </p>



<p class="wp-block-paragraph">Oluşturduğum test projesinin yapısı aşağıdaki gibidir, basit bir kurgu yaptım.</p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained"><div class="wp-block-image">
<figure class="alignleft size-full"><img data-recalc-dims="1" decoding="async" width="531" height="272" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-11.png?resize=531%2C272&#038;ssl=1" alt="" class="wp-image-476" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-11.png?w=531&amp;ssl=1 531w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-11.png?resize=300%2C154&amp;ssl=1 300w" sizes="(max-width: 531px) 100vw, 531px" /></figure>
</div></div></div>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="800" height="1" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=800%2C1&#038;ssl=1" alt="" class="wp-image-505" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?w=800&amp;ssl=1 800w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=300%2C1&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=150%2C1&amp;ssl=1 150w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=768%2C1&amp;ssl=1 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<p class="wp-block-paragraph">Öncelikle hava durumu verilerini üretecek <strong>Producer </strong>uygulamamızı yazalım. Bunun için yeni bir Console App açıyoruz ve aşağıdaki Confluent.Kafka paketini yüklüyoruz. Bu işlemi Consumer Console App &#8216;imiz için de yapacağız.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>dotnet add package Confluent.Kafka</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">dotnet</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">add</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">package</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Confluent.Kafka</span></span></code></pre></div>



<h3 class="wp-block-heading"><strong>Producer </strong></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>using Confluent.Kafka;
using Kafka.Dto;
using System.Text.Json;

var config = new ProducerConfig { BootstrapServers = "localhost:9092" };
var producer = new ProducerBuilder&lt;Null, string>(config).Build();

var cities = new[] { "Antalya", "Adana", "Amasya" };
var rand = new Random();

while (true)
{
    KafkaWeatherDto data = new KafkaWeatherDto
    {
        City = cities&#91;rand.Next(cities.Length)&#93;,
        Temperature = rand.Next(1, 50),
        Humidity = rand.Next(30, 90),
        Date = DateTime.Now
    };

    string jsonData = JsonSerializer.Serialize(data);
    await producer.ProduceAsync("WeatherTopic", new Message&lt;Null, string>
    {
        Value = jsonData
    });

    Console.WriteLine($"Data gönderildi: {jsonData}");
    await Task.Delay(2000);
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Confluent</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Kafka</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Kafka</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Dto</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">System</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Json</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ProducerConfig</span><span style="color: #D4D4D4"> { </span><span style="color: #9CDCFE">BootstrapServers</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;localhost:9092&quot;</span><span style="color: #D4D4D4"> };</span></span>
<span class="line"><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">producer</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ProducerBuilder</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">Null</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4">&gt;(</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">Build</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">cities</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4">[] { </span><span style="color: #CE9178">&quot;Antalya&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;Adana&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;Amasya&quot;</span><span style="color: #D4D4D4"> };</span></span>
<span class="line"><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">rand</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Random</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">while</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">KafkaWeatherDto</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">KafkaWeatherDto</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">City</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">cities</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">rand</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Next</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">cities</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Length</span><span style="color: #D4D4D4">)],</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">Temperature</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">rand</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Next</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">50</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">Humidity</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">rand</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Next</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">30</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">90</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">Date</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">DateTime</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Now</span></span>
<span class="line"><span style="color: #D4D4D4">    };</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">jsonData</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">JsonSerializer</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Serialize</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">producer</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">ProduceAsync</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;WeatherTopic&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Message</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">Null</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">jsonData</span></span>
<span class="line"><span style="color: #D4D4D4">    });</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">Console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">WriteLine</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">$&quot;Data gönderildi: {</span><span style="color: #9CDCFE">jsonData</span><span style="color: #CE9178">}&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Task</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Delay</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">2000</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Üst kısımda konfigurasyonları ve tanımlamaları yaptıktan sonra while bloğu içerisinde işlemlerimizi gerçekleştiriyoruz. Burada da KafkaWeatherModel tipindeki modelimizi serialize ediyor ve ProduceAsync ile WeatherTopic &#8216;ine iletiyoruz. Senaryomuz gereği 2 sn de bir bu datanın topic e iletilmesini sağlıyoruz. Producer projesini ayağa kaldırdığımızda çıktısı şu şekilde olacaktır:</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="890" height="311" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-9.png?resize=890%2C311&#038;ssl=1" alt="" class="wp-image-470" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-9.png?w=890&amp;ssl=1 890w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-9.png?resize=300%2C105&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-9.png?resize=768%2C268&amp;ssl=1 768w" sizes="auto, (max-width: 890px) 100vw, 890px" /></figure>



<h3 class="wp-block-heading"><strong>Consumer</strong></h3>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>using Confluent.Kafka;
using Kafka.Dto;
using System.Text.Json;

var config = new ConsumerConfig
{
    BootstrapServers = "localhost:9092",
    GroupId = "WeatherConsumerGroup",
    AutoOffsetReset = AutoOffsetReset.Earliest
};

var consumer = new ConsumerBuilder&lt;Null, string>(config).Build();
consumer.Subscribe("WeatherTopic");

while (true)
{
    var consume = consumer.Consume();
    var kafkaWeatherModel = JsonSerializer.Deserialize&lt;KafkaWeatherDto>(consume.Message.Value);

    if (kafkaWeatherModel != null)
    {
        Console.WriteLine($"{kafkaWeatherModel.City} > Sıcaklık : {kafkaWeatherModel.Temperature} , Nem : {kafkaWeatherModel.Humidity}");

        if (kafkaWeatherModel.Temperature > 35)
            Console.WriteLine($"DİKKAT : {kafkaWeatherModel.City} şehrinde sıcaklık çok yüksek : {kafkaWeatherModel.Temperature}");
    }
}
</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Confluent</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Kafka</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Kafka</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Dto</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">System</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Json</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ConsumerConfig</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">BootstrapServers</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;localhost:9092&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">GroupId</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;WeatherConsumerGroup&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">AutoOffsetReset</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">AutoOffsetReset</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Earliest</span></span>
<span class="line"><span style="color: #D4D4D4">};</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">consumer</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ConsumerBuilder</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">Null</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4">&gt;(</span><span style="color: #9CDCFE">config</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">Build</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #9CDCFE">consumer</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Subscribe</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;WeatherTopic&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">while</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">consume</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">consumer</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Consume</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">kafkaWeatherModel</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">JsonSerializer</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Deserialize</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">KafkaWeatherDto</span><span style="color: #D4D4D4">&gt;(</span><span style="color: #9CDCFE">consume</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Message</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Value</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">kafkaWeatherModel</span><span style="color: #D4D4D4"> != </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">Console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">WriteLine</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">$&quot;{</span><span style="color: #9CDCFE">kafkaWeatherModel</span><span style="color: #CE9178">.</span><span style="color: #9CDCFE">City</span><span style="color: #CE9178">} &gt; Sıcaklık : {</span><span style="color: #9CDCFE">kafkaWeatherModel</span><span style="color: #CE9178">.</span><span style="color: #9CDCFE">Temperature</span><span style="color: #CE9178">} , Nem : {</span><span style="color: #9CDCFE">kafkaWeatherModel</span><span style="color: #CE9178">.</span><span style="color: #9CDCFE">Humidity</span><span style="color: #CE9178">}&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">kafkaWeatherModel</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Temperature</span><span style="color: #D4D4D4"> &gt; </span><span style="color: #B5CEA8">35</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">Console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">WriteLine</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">$&quot;DİKKAT : {</span><span style="color: #9CDCFE">kafkaWeatherModel</span><span style="color: #CE9178">.</span><span style="color: #9CDCFE">City</span><span style="color: #CE9178">} şehrinde sıcaklık çok yüksek : {</span><span style="color: #9CDCFE">kafkaWeatherModel</span><span style="color: #CE9178">.</span><span style="color: #9CDCFE">Temperature</span><span style="color: #CE9178">}&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Consumer tarafında yine Kafka ile ilgili yapılandırmamızı yapıyoruz. <strong>BootstrapServers </strong>ile Kafka adresimizi belirtiyoruz. <strong>GroupId</strong>, Kafka &#8216;daki consumer group adıdır. <strong>Aynı GroupId &#8216;ye sahip consumer’lar aynı gruba aittir</strong> ve partition &#8216;ları paylaşarak çalışır. Bu sayede Kafka her mesajı bir grup içinde sadece bir consumer a iletir. Örneğin:  2 partition varsa ve aynı GroupId &#8216;ye sahip 2 consumer varsa her biri 1 partition dinler.</p>



<p class="wp-block-paragraph"><strong>AutoOffsetReset = AutoOffsetReset.Earliest</strong> ayarı consumer daha önce hiç mesaj okumamışsa veya kaldığı yerin kaydı yoksa, nereden başlayacağını belirler. <strong>Earliest </strong>en eski mesajlardan, <strong>Latest </strong>ise en son gelen mesajlardan okumaya başla demektir. Biz kendi örneğimizde bu değeri Earliest olarak ayarladık. </p>


<div class="wp-block-image">
<figure class="alignleft size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="795" height="465" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-8.png?resize=795%2C465&#038;ssl=1" alt="" class="wp-image-469" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-8.png?w=795&amp;ssl=1 795w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-8.png?resize=300%2C175&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-8.png?resize=768%2C449&amp;ssl=1 768w" sizes="auto, (max-width: 795px) 100vw, 795px" /></figure>
</div>


<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="800" height="1" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=800%2C1&#038;ssl=1" alt="" class="wp-image-505" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?w=800&amp;ssl=1 800w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=300%2C1&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=150%2C1&amp;ssl=1 150w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=768%2C1&amp;ssl=1 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<p class="wp-block-paragraph">Consumer tarafında ekran görüntüsünde de görüldüğü üzere, sıcaklıklar belli bir derecenin üzerine çıktığında uyarı mesajını ekrana bastık. Bu örnek basit olsa da, temelleri öğrendikten sonra senaryo kolaylıkla genişletilebilir. Gerçek hayat uygulamalarında bu aşamada farklı aksiyonlar alınabilir. İlgili veriler veritabanına kaydedilebilir. Kaydedilen bilgiler grafikler ile görselleştirilebilir. Gerisi kendi uygulamanızın ve sizin ihtiyaçlarınıza göre şekillenecektir.</p>



<p class="wp-block-paragraph"><strong>BONUS</strong> olarak Kafka tarafında nelerimiz oluşmuş <strong>Kafka UI</strong> &#8216;da görmeyelim mi ? (<a href="https://www.youtube.com/watch?v=ANnoNIMPWnQ">https://www.youtube.com/watch?v=ANnoNIMPWnQ</a>)</p>



<p class="wp-block-paragraph"><strong>Broker &#8216;larımız:</strong></p>


<div class="wp-block-image">
<figure class="alignleft size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="232" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-12.png?resize=1024%2C232&#038;ssl=1" alt="" class="wp-image-478" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-12.png?resize=1024%2C232&amp;ssl=1 1024w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-12.png?resize=300%2C68&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-12.png?resize=768%2C174&amp;ssl=1 768w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-12.png?w=1396&amp;ssl=1 1396w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="800" height="1" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=800%2C1&#038;ssl=1" alt="" class="wp-image-505" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?w=800&amp;ssl=1 800w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=300%2C1&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=150%2C1&amp;ssl=1 150w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=768%2C1&amp;ssl=1 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<p class="has-text-align-left wp-block-paragraph"><strong>Topic &#8216;lerimiz:</strong></p>


<div class="wp-block-image">
<figure class="alignleft size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="166" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-13.png?resize=1024%2C166&#038;ssl=1" alt="" class="wp-image-479" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-13.png?resize=1024%2C166&amp;ssl=1 1024w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-13.png?resize=300%2C49&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-13.png?resize=768%2C125&amp;ssl=1 768w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-13.png?resize=1536%2C250&amp;ssl=1 1536w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-13.png?w=1902&amp;ssl=1 1902w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="800" height="1" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=800%2C1&#038;ssl=1" alt="" class="wp-image-505" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?w=800&amp;ssl=1 800w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=300%2C1&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=150%2C1&amp;ssl=1 150w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=768%2C1&amp;ssl=1 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<p class="wp-block-paragraph"><strong>Topic Detayı:</strong> 1 adet partition &#8216;ımızın olduğu görünüyor. İstenirse partition sayısı Producer tarafında ayarlanabilir.</p>


<div class="wp-block-image">
<figure class="alignleft size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="169" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-15.png?resize=1024%2C169&#038;ssl=1" alt="" class="wp-image-482" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-15.png?resize=1024%2C169&amp;ssl=1 1024w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-15.png?resize=300%2C49&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-15.png?resize=768%2C127&amp;ssl=1 768w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-15.png?resize=1536%2C253&amp;ssl=1 1536w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-15.png?w=1904&amp;ssl=1 1904w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="800" height="1" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=800%2C1&#038;ssl=1" alt="" class="wp-image-505" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?w=800&amp;ssl=1 800w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=300%2C1&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=150%2C1&amp;ssl=1 150w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=768%2C1&amp;ssl=1 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<p class="wp-block-paragraph"><strong>Consumer &#8216;larımızın listesi:</strong></p>


<div class="wp-block-image">
<figure class="alignleft size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="132" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-14.png?resize=1024%2C132&#038;ssl=1" alt="" class="wp-image-480" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-14.png?resize=1024%2C132&amp;ssl=1 1024w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-14.png?resize=300%2C39&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-14.png?resize=768%2C99&amp;ssl=1 768w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-14.png?resize=1536%2C198&amp;ssl=1 1536w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-14.png?w=1904&amp;ssl=1 1904w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</div>


<p class="wp-block-paragraph"></p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="800" height="1" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=800%2C1&#038;ssl=1" alt="" class="wp-image-505" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?w=800&amp;ssl=1 800w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=300%2C1&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=150%2C1&amp;ssl=1 150w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Line.png?resize=768%2C1&amp;ssl=1 768w" sizes="auto, (max-width: 800px) 100vw, 800px" /></figure>



<p class="wp-block-paragraph">Bir makalenin daha sonuna geldik <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> , yeni makalelerde görüşmek üzere.</p>



<p class="wp-block-paragraph">Faydalandığım linkler:</p>



<p class="wp-block-paragraph"><a href="http://interviewbit.com/blog/kafka-architecture/">http://interviewbit.com/blog/kafka-architecture/</a></p>



<p class="wp-block-paragraph"><a href="https://www.cloudduggu.com/kafka/architecture">https://www.cloudduggu.com/kafka/architecture</a></p>
<p><a href="https://www.sebahattint.com/kafka-nedir-net-core-ile-kullanimi/">Kafka Nedir? .Net Core ile Kullanımı</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sebahattint.com/kafka-nedir-net-core-ile-kullanimi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>HybridCache Nedir?</title>
		<link>https://www.sebahattint.com/hybridcache-nedir/</link>
					<comments>https://www.sebahattint.com/hybridcache-nedir/#respond</comments>
		
		<dc:creator><![CDATA[Sebahattin]]></dc:creator>
		<pubDate>Sun, 22 Jun 2025 21:51:42 +0000</pubDate>
				<category><![CDATA[C Sharp (C#)]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[Redis]]></category>
		<category><![CDATA[distributed cache]]></category>
		<category><![CDATA[docker]]></category>
		<category><![CDATA[dotnet10]]></category>
		<category><![CDATA[dotnet9]]></category>
		<category><![CDATA[hybrid cache]]></category>
		<category><![CDATA[hybridcache]]></category>
		<category><![CDATA[memory cache]]></category>
		<category><![CDATA[redis]]></category>
		<guid isPermaLink="false">https://www.sebahattint.com/?p=419</guid>

					<description><![CDATA[<p>.Net 9 ile gelen HybridCache, memory cache ve distributed cache çözümlerini bir araya getirerek her ikisinin avantajlarını birlikte sunar. Bu özelliği kullanabilmek için Microsoft.Extensions.Caching.Hybrid paketini projenize eklemelisiniz. .Net 9 kullanıyorsanız,&#8230;</p>
<p><a href="https://www.sebahattint.com/hybridcache-nedir/">HybridCache Nedir?</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">.Net 9 ile gelen HybridCache, memory cache ve distributed cache çözümlerini bir araya getirerek her ikisinin avantajlarını birlikte sunar. Bu özelliği kullanabilmek için <strong>Microsoft.Extensions.Caching.Hybrid</strong> paketini projenize eklemelisiniz. .Net 9 kullanıyorsanız, <strong>en az 9.0.100-preview.4</strong> Sdk sürümünü yüklemeniz gerekir. .Net 10 ile bu özellik artık <strong>stabil</strong> olarak desteklenmektedir.</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="662" height="308" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/HybridCache.png?resize=662%2C308&#038;ssl=1" alt="HybridCache" class="wp-image-431" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/HybridCache.png?w=662&amp;ssl=1 662w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/HybridCache.png?resize=300%2C140&amp;ssl=1 300w" sizes="auto, (max-width: 662px) 100vw, 662px" /><figcaption class="wp-element-caption">HybridCache</figcaption></figure>



<h2 class="wp-block-heading"><strong>Neden HybridCache?</strong></h2>



<p class="wp-block-paragraph">.Net uygulamalarında genelde iki seçeneğimiz var:</p>



<ol class="wp-block-list">
<li><strong>IMemoryCache </strong>: Uygulama sunucusunun belleğinde tutulan hızlı bir cache. Ancak birden fazla sunucuda çalışan uygulamalarda, yapısı gereği verilerde tutarsızlığa neden olur. </li>



<li><strong>IDistributedCache </strong>: Tüm sunucular aynı cache’i paylaşır ama erişim hızı memory cache kadar hızlı değildir. (Örn: Redis)</li>
</ol>



<p class="wp-block-paragraph"><strong>HybridCache</strong>, iki kullanımı da aynı anda destekleyerek bize kullanım kolaylığı ve ekstra performans sağlar. Örnek ile beraber HybridCache &#8216;in çalışma mantığını detaylı bir şekilde anlatacağım.</p>



<h2 class="wp-block-heading"><strong>HybridCache Kullanımı</strong></h2>



<p class="wp-block-paragraph">Statik olarak oluşturacağımız kullanıcı listesini cache &#8216;leyen bir örnek yapmak için hemen docker da bir Redis ayağa kaldıralım ve geliştirmelere başlayalım. </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><textarea class="code-block-pro-copy-button-textarea" aria-hidden="true" readonly>docker run -d &#8211;name redis-hybridcache -p 6379:6379 redis</textarea><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">docker</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">run</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-d</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">--name</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">redis-hybridcache</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">-p</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">6379</span><span style="color: #CE9178">:6379</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">redis</span></span></code></pre></div>



<p class="wp-block-paragraph">Redis &#8216;i çalışır hale getirdiysek, yeni bir web projesi açalım ve Redis, HybridCache paketlerini yükleyelim:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">Bash</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><textarea class="code-block-pro-copy-button-textarea" aria-hidden="true" readonly>dotnet add package Microsoft.Extensions.Caching.StackExchangeRedis
dotnet add package Microsoft.Extensions.Caching.Hybrid</textarea><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">dotnet</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">add</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">package</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Microsoft.Extensions.Caching.StackExchangeRedis</span></span>
<span class="line"><span style="color: #DCDCAA">dotnet</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">add</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">package</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">Microsoft.Extensions.Caching.Hybrid</span></span></code></pre></div>



<p class="wp-block-paragraph"> Daha sonra <strong>Program.cs</strong> mize şu satırları ekleyelim:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><textarea class="code-block-pro-copy-button-textarea" aria-hidden="true" readonly>builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = &#8220;localhost:6379&#8221;;
});

builder.Services.AddHybridCache();</textarea><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #9CDCFE">builder</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Services</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">AddStackExchangeRedisCache</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">options</span><span style="color: #D4D4D4"> =&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">options</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Configuration</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;localhost:6379&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">builder</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Services</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">AddHybridCache</span><span style="color: #D4D4D4">();</span></span></code></pre></div>



<p class="wp-block-paragraph">Burada basit konfigürasyonlarla Redis ve HybridCache implementasyonlarını yaptık. Hybrid Cache, Redis yapılandırmamızı otomatik olarak görecek ve birlikte sorunsuz çalışacaktır.</p>



<p class="wp-block-paragraph">Test metodumuzu içerecek olan UserController adında yeni bir controller açıp içeriğini şu şekilde düzenleyelim. </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><textarea class="code-block-pro-copy-button-textarea" aria-hidden="true" readonly>using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Caching.Hybrid;

namespace HybridCacheTest.Controllers;

[Route(&#8220;user&#8221;)]
public class UserController : Controller
{
    private readonly HybridCache _hybridCache;

    public UserController(HybridCache hybridCache)
    {
        _hybridCache = hybridCache;
    }

    [Route(&#8220;list&#8221;)]
    public async Task&lt;string> GetUsers()
    {
        string cacheKey = $&#8221;UserList&#8221;;
        
        var cacheOptions = new HybridCacheEntryOptions
        {
            Expiration = TimeSpan.FromMinutes(10)
        };

        var userList = await _hybridCache.GetOrCreateAsync(cacheKey, async data => await GetUserList(), cacheOptions);

        if (userList != null)
            return &#8220;Kullanıcı listesi alındı.&#8221;;
        else
            return &#8220;Kullanıcı listesi boş.&#8221;;
    }

    /// &lt;summary>
    /// Normalde servis katmanı aracılığı ile alınması gerekir ama örnek için controller içinden kullanıcı listesi oluşturup onu dönüyoruz.
    /// &lt;/summary>
    /// &lt;returns>&lt;/returns>
    private async Task&lt;List&lt;UserDto>> GetUserList()
    {
        return new List&lt;UserDto>()
        {
            new UserDto() { Id = 1, Name = &#8220;Test 1&#8221;},
            new UserDto() { Id = 1, Name = &#8220;Test 2&#8221;}
        };
    }
}
</textarea><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Microsoft</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">AspNetCore</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Mvc</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Microsoft</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Extensions</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Caching</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Hybrid</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">HybridCacheTest</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Controllers</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">[</span><span style="color: #4EC9B0">Route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;user&quot;</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">UserController</span><span style="color: #D4D4D4"> : </span><span style="color: #4EC9B0">Controller</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">readonly</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">HybridCache</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_hybridCache</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">UserController</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">HybridCache</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">hybridCache</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">_hybridCache</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">hybridCache</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #4EC9B0">Route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;list&quot;</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Task</span><span style="color: #D4D4D4">&lt;</span><span style="color: #569CD6">string</span><span style="color: #D4D4D4">&gt; </span><span style="color: #DCDCAA">GetUsers</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">cacheKey</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">$&quot;UserList&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">cacheOptions</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">HybridCacheEntryOptions</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">Expiration</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">TimeSpan</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">FromMinutes</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        };</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">userList</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_hybridCache</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetOrCreateAsync</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">cacheKey</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #569CD6">await</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">GetUserList</span><span style="color: #D4D4D4">(), </span><span style="color: #9CDCFE">cacheOptions</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">userList</span><span style="color: #D4D4D4"> != </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;Kullanıcı listesi alındı.&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;Kullanıcı listesi boş.&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    /// </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">summary</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #6A9955">    /// Normalde servis katmanı aracılığı ile alınması gerekir ama örnek için controller içinden kullanıcı listesi oluşturup onu dönüyoruz.</span></span>
<span class="line"><span style="color: #6A9955">    /// </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">summary</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #6A9955">    /// </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">returns</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">returns</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Task</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">List</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">UserDto</span><span style="color: #D4D4D4">&gt;&gt; </span><span style="color: #DCDCAA">GetUserList</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">List</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">UserDto</span><span style="color: #D4D4D4">&gt;()</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">UserDto</span><span style="color: #D4D4D4">() { </span><span style="color: #9CDCFE">Id</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">Name</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;Test 1&quot;</span><span style="color: #D4D4D4">},</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">UserDto</span><span style="color: #D4D4D4">() { </span><span style="color: #9CDCFE">Id</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">Name</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;Test 2&quot;</span><span style="color: #D4D4D4">}</span></span>
<span class="line"><span style="color: #D4D4D4">        };</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">Browser&#8217;dan /user/list adresine gidildiğinde, GetUsers() metodumuz çalışacak ve kullanıcı listesini cache &#8216;e alacaktır. Örneğimizi tamamladık, şimdi çalıştıralım.</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="852" height="195" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-5.png?resize=852%2C195&#038;ssl=1" alt="" class="wp-image-425" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-5.png?w=852&amp;ssl=1 852w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-5.png?resize=300%2C69&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-5.png?resize=768%2C176&amp;ssl=1 768w" sizes="auto, (max-width: 852px) 100vw, 852px" /></figure>



<p class="wp-block-paragraph"><strong>_hybridCache.GetOrCreateAsync</strong> satırı şu işlemleri yapar;</p>



<ol class="wp-block-list">
<li>Öncelikle &#8220;UserList&#8221; key &#8216;i memory cache&#8217;te var mı diye kontrol eder.</li>



<li>Memory cache&#8217;te yoksa distributed cache&#8217;e (Redis) bakar.</li>



<li>Data burada da yoksa ilgili metod çağrılır ve sonuç hem Redis&#8217;e hem de memory cache&#8217;e eklenir.</li>
</ol>



<p class="wp-block-paragraph">Böylece HybridCache <strong>ikinci istekte datayı Memory Cache &#8216;ten</strong> alıp, Client &#8216;a ileteceği için çok <strong>daha hızlı</strong> response dönecektir. Burada cache key lerimize vereceğimiz <strong>Expiration</strong> sürelerine dikkat etmeliyiz. Aksi durumda uygulamamızın çalıştığı sunucu belleğine fazla yük bindirmiş oluruz.</p>



<p class="wp-block-paragraph">Ek açıklamalardan sonra Redis &#8216;i kontrol ettiğimizde, &#8220;UserList&#8221; key &#8216;ine ait data aşağıdaki gibi görünecektir :</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="204" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-6.png?resize=1024%2C204&#038;ssl=1" alt="" class="wp-image-427" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-6.png?resize=1024%2C204&amp;ssl=1 1024w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-6.png?resize=300%2C60&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-6.png?resize=768%2C153&amp;ssl=1 768w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-6.png?w=1080&amp;ssl=1 1080w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph"><strong>Cache Remove</strong> işleminde ise ilgili data hem memory cache hem de distributed cache den silinir ve böylece tutarlılık sağlanmış olur.</p>



<p class="wp-block-paragraph"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a1.png" alt="⚡" class="wp-smiley" style="height: 1em; max-height: 1em;" /><strong>Kritik Bilgi</strong> : Ani olarak <strong>birden fazla istek</strong> geldiğinde bile veri kaynağına 1 kez gidilir ve cache üretilir. Diğer client lar datayı cache üzerinden alırlar.</p>



<p class="wp-block-paragraph">Bu makalede elimden geldiğince HybridCache &#8216;i anlatmaya çalıştım, umarım faydalı olmuştur.</p>



<p class="wp-block-paragraph">Sonraki makalede görüşmek üzere <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph"><strong>Faydalandığım linkler:</strong></p>



<p class="wp-block-paragraph"><a href="https://devblogs.microsoft.com/dotnet/hybrid-cache-is-now-ga/">https://devblogs.microsoft.com/dotnet/hybrid-cache-is-now-ga/</a></p>



<p class="wp-block-paragraph"><a href="https://medium.com/c-sharp-programming/exploring-hybridcache-in-net-9-a-game-changer-for-asp-net-core-applications-5afc321c0690">https://medium.com/c-sharp-programming/exploring-hybridcache-in-net-9-a-game-changer-for-asp-net-core-applications-5afc321c0690</a></p>
<p><a href="https://www.sebahattint.com/hybridcache-nedir/">HybridCache Nedir?</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sebahattint.com/hybridcache-nedir/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Circuit Breaker Pattern Nedir?</title>
		<link>https://www.sebahattint.com/circuit-breaker-pattern-nedir/</link>
					<comments>https://www.sebahattint.com/circuit-breaker-pattern-nedir/#respond</comments>
		
		<dc:creator><![CDATA[Sebahattin]]></dc:creator>
		<pubDate>Tue, 17 Jun 2025 01:37:07 +0000</pubDate>
				<category><![CDATA[C Sharp (C#)]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[circuit breaker]]></category>
		<category><![CDATA[circuit breaker pattern]]></category>
		<category><![CDATA[circuit breaker pattern nedir]]></category>
		<category><![CDATA[circuit breaker states]]></category>
		<category><![CDATA[microservices]]></category>
		<category><![CDATA[polly]]></category>
		<guid isPermaLink="false">https://www.sebahattint.com/?p=265</guid>

					<description><![CDATA[<p>Dağıtık (distributed) sistemlerde en çok kullanılan patternlerden biridir. Geliştirdiğimiz uygulamalar artık tek bir sunucuda çalışan monolith uygulamalar değil, onlarca servisten, api ’den ve external kaynaklardan oluşuyor. Birbirine entegre çalışan böyle&#8230;</p>
<p><a href="https://www.sebahattint.com/circuit-breaker-pattern-nedir/">Circuit Breaker Pattern Nedir?</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Dağıtık (distributed) sistemlerde en çok kullanılan patternlerden biridir. Geliştirdiğimiz uygulamalar artık tek bir sunucuda çalışan monolith uygulamalar değil, onlarca servisten, api ’den ve external kaynaklardan oluşuyor. Birbirine entegre çalışan böyle sistemlerde bir servisten bile sonuç alınamaması ciddi sorunlara yol açabilir ve tüm sistemimizi etkileyebilir. Bu problemin önüne geçmek için projelerimizde <strong>Circuit Breaker (Devre Kesici)</strong> tasarım desenini kullanabiliriz.</p>



<p class="wp-block-paragraph"><strong>Neden bu pattern i kullanmalıyım?</strong></p>



<ul class="wp-block-list">
<li>Bir mikro servis ya da external api yavaş çalışıyor veya hiç cevap vermiyorsa, atılan her request sistem kaynaklarını boşa tüketecek ve cloud sistemlerde çalıştığımızı düşünürsek doğrudan maliyetlerimize de etki edecektir.</li>



<li>Genel sistem performansına olumlu etkileri vardır.</li>



<li>Circuit Breaker, belirli bir hata oranı aşıldığında ilgili servise yeni requestlerin atılmasını engeller.</li>
</ul>



<p class="wp-block-paragraph"><strong>Circuit Breaker &#8216;ın 3 state &#8216;i vardır:</strong></p>



<p class="wp-block-paragraph"><strong>Closed (Kapalı)</strong>: Sistemin normal olduğu ve requestlerin servise gönderilebildiği durumdur.<br><strong>Open (Açık)</strong>       : Hata oranı belirlenen eşiği aşmıştır. Artık yeni istekler gönderilmez, hemen hata döner.<br><strong>Half-Open (Yarı Açık)</strong>: Belirli bir süre bekledikten sonra test amaçlı birkaç istek gönderilir. Eğer bunlar başarılı olursa devre tekrar kapalı hale gelir.</p>



<p class="wp-block-paragraph">Aşağıdaki grafikte her durum için sayaç işlemlerini görebilirsiniz.</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="651" height="539" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/circuit-breaker-diagram.png?resize=651%2C539&#038;ssl=1" alt="circuit-breaker-diagram" class="wp-image-402" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/circuit-breaker-diagram.png?w=651&amp;ssl=1 651w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/circuit-breaker-diagram.png?resize=300%2C248&amp;ssl=1 300w" sizes="auto, (max-width: 651px) 100vw, 651px" /></figure>



<h2 class="wp-block-heading"><strong>.Net Core ile</strong> <strong>Polly Kullanarak Circuit Breaker İmplementasyonu</strong></h2>



<p class="wp-block-paragraph">Bir web uygulaması açalım ve örnek bir implementasyon yapalım. Polly ve Microsoft.Extensions.Http.Polly paketlerini Nuget ten yükleyelim. </p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="965" height="317" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-3.png?resize=965%2C317&#038;ssl=1" alt="" class="wp-image-403" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-3.png?w=965&amp;ssl=1 965w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-3.png?resize=300%2C99&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-3.png?resize=768%2C252&amp;ssl=1 768w" sizes="auto, (max-width: 965px) 100vw, 965px" /></figure>



<p class="wp-block-paragraph">Appsettings.json &#8216;daki ayarlarımız:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JSON</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><textarea class="code-block-pro-copy-button-textarea" aria-hidden="true" readonly>&#8220;CircuitBreakerSettings&#8221;: {
  &#8220;ExceptionsAllowedBeforeBreaking&#8221;: 5,
  &#8220;DurationOfBreakInSeconds&#8221;: 30
}</textarea><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #CE9178">&quot;CircuitBreakerSettings&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">&quot;ExceptionsAllowedBeforeBreaking&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">&quot;DurationOfBreakInSeconds&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">30</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Daha sonra <strong>Program.cs</strong> de implementasyonumuzu aşağıdaki gibi yapabiliriz:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><textarea class="code-block-pro-copy-button-textarea" aria-hidden="true" readonly>var circuitBreakerSettings = new CircuitBreakerSettings();
builder.Configuration.GetSection(nameof(CircuitBreakerSettings)).Bind(circuitBreakerSettings);

// Circuit Breaker policy oluştur
var circuitBreakerPolicy = Policy
    .Handle&lt;HttpRequestException>()
    .OrResult&lt;HttpResponseMessage>(msg => !msg.IsSuccessStatusCode)
    .CircuitBreakerAsync(
        handledEventsAllowedBeforeBreaking: circuitBreakerSettings.ExceptionsAllowedBeforeBreaking,
        durationOfBreak: TimeSpan.FromSeconds(circuitBreakerSettings.DurationOfBreakInSeconds),
        onBreak: (outcome, breakDelay) =>
        {
            if (outcome.Exception != null)
            {
                Debug.WriteLine($&#8221;Circuit breaker açıldı: {outcome.Exception.Message}. Yeni istek için bekleme süresi: {breakDelay}&#8221;);
            }
            else
            {
                Debug.WriteLine($&#8221;Circuit breaker açıldı. StatusCode: {outcome.Result.StatusCode}. Yeni istek için bekleme süresi: {breakDelay}&#8221;);
            }
        },
        onReset: () =>
        {
            Debug.WriteLine(&#8220;Circuit breaker kapandı.&#8221;);
        },
        onHalfOpen: () =>
        {
            Debug.WriteLine(&#8220;Circuit breaker yarı açık. Dış servise erişim test ediliyor&#8230;&#8221;);
        }
    );

// HTTP client&#8217;a policy handler ekle
builder.Services.AddHttpClient&lt;ITestApiClient, TestApiClient>().AddPolicyHandler(circuitBreakerPolicy);</textarea><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">circuitBreakerSettings</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">CircuitBreakerSettings</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #9CDCFE">builder</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Configuration</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetSection</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">nameof</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">CircuitBreakerSettings</span><span style="color: #D4D4D4">)).</span><span style="color: #DCDCAA">Bind</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">circuitBreakerSettings</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// Circuit Breaker policy oluştur</span></span>
<span class="line"><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">circuitBreakerPolicy</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">Policy</span></span>
<span class="line"><span style="color: #D4D4D4">    .</span><span style="color: #DCDCAA">Handle</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">HttpRequestException</span><span style="color: #D4D4D4">&gt;()</span></span>
<span class="line"><span style="color: #D4D4D4">    .</span><span style="color: #DCDCAA">OrResult</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">HttpResponseMessage</span><span style="color: #D4D4D4">&gt;(</span><span style="color: #9CDCFE">msg</span><span style="color: #D4D4D4"> =&gt; !</span><span style="color: #9CDCFE">msg</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">IsSuccessStatusCode</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    .</span><span style="color: #DCDCAA">CircuitBreakerAsync</span><span style="color: #D4D4D4">(</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">handledEventsAllowedBeforeBreaking</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">circuitBreakerSettings</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">ExceptionsAllowedBeforeBreaking</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">durationOfBreak</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">TimeSpan</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">FromSeconds</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">circuitBreakerSettings</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">DurationOfBreakInSeconds</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">onBreak</span><span style="color: #D4D4D4">: (</span><span style="color: #9CDCFE">outcome</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">breakDelay</span><span style="color: #D4D4D4">) =&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">outcome</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Exception</span><span style="color: #D4D4D4"> != </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">Debug</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">WriteLine</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">$&quot;Circuit breaker açıldı: {</span><span style="color: #9CDCFE">outcome</span><span style="color: #CE9178">.</span><span style="color: #9CDCFE">Exception</span><span style="color: #CE9178">.</span><span style="color: #9CDCFE">Message</span><span style="color: #CE9178">}. Yeni istek için bekleme süresi: {</span><span style="color: #9CDCFE">breakDelay</span><span style="color: #CE9178">}&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">else</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">Debug</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">WriteLine</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">$&quot;Circuit breaker açıldı. StatusCode: {</span><span style="color: #9CDCFE">outcome</span><span style="color: #CE9178">.</span><span style="color: #9CDCFE">Result</span><span style="color: #CE9178">.</span><span style="color: #9CDCFE">StatusCode</span><span style="color: #CE9178">}. Yeni istek için bekleme süresi: {</span><span style="color: #9CDCFE">breakDelay</span><span style="color: #CE9178">}&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        },</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">onReset</span><span style="color: #D4D4D4">: () =&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">Debug</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">WriteLine</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Circuit breaker kapandı.&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        },</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">onHalfOpen</span><span style="color: #D4D4D4">: () =&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">Debug</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">WriteLine</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Circuit breaker yarı açık. Dış servise erişim test ediliyor...&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// HTTP client&#39;a policy handler ekle</span></span>
<span class="line"><span style="color: #9CDCFE">builder</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Services</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">AddHttpClient</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">ITestApiClient</span><span style="color: #D4D4D4">, </span><span style="color: #4EC9B0">TestApiClient</span><span style="color: #D4D4D4">&gt;().</span><span style="color: #DCDCAA">AddPolicyHandler</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">circuitBreakerPolicy</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<p class="wp-block-paragraph">Sadece bu kısmı özetleyecek olursak:</p>



<p class="wp-block-paragraph">Ayarlarımızı CircuitBreakerSettings class ına bind ediyoruz. Bu örnekte 5 başarısız istekten sonra 30 saniye isteklere ara verecek şekilde konfigürasyonumuzu yaptık. Oluşturduğumuz policy sayesinde HttpRequestException ile fırlatılan hatalar ve başarısız HTTP response lar yakalanıyor, 5 hatadan sonra devre açılıyor (onBreak). Devre kapandığında (onReset) veya yarı açık hale geldiğinde (onHalfOpen) action larımız çalışıyor. Son olarak oluşturduğumuz policy &#8216;i HttpClient ’a doğrudan bağlıyoruz. </p>



<p class="wp-block-paragraph">Basit bir request içeren ITestApiClient.cs ve TestApiClient.cs class larımız:</p>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><textarea class="code-block-pro-copy-button-textarea" aria-hidden="true" readonly>public interface ITestApiClient
{
    Task&lt;string> GetDataAsync();
}</textarea><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">interface</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ITestApiClient</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #4EC9B0">Task</span><span style="color: #D4D4D4">&lt;</span><span style="color: #569CD6">string</span><span style="color: #D4D4D4">&gt; </span><span style="color: #DCDCAA">GetDataAsync</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><textarea class="code-block-pro-copy-button-textarea" aria-hidden="true" readonly>public class TestApiClient : ITestApiClient
{
    private readonly HttpClient _httpClient;

    public TestApiClient(HttpClient httpClient)
    {
        _httpClient = httpClient;
    }

    public async Task&lt;string> GetDataAsync()
    {
        var response = await _httpClient.GetAsync(&#8220;https://dummyjson.com/products/333&#8221;); // Hata oluşması için olmayan bir ürün Id verdim

        response.EnsureSuccessStatusCode(); // Başarısız durumlarda exception fırlatır ve Circuit Breaker devreye girer

        return await response.Content.ReadAsStringAsync();
    }
}</textarea><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">TestApiClient</span><span style="color: #D4D4D4"> : </span><span style="color: #4EC9B0">ITestApiClient</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">readonly</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">HttpClient</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_httpClient</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">TestApiClient</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">HttpClient</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">httpClient</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">_httpClient</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">httpClient</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Task</span><span style="color: #D4D4D4">&lt;</span><span style="color: #569CD6">string</span><span style="color: #D4D4D4">&gt; </span><span style="color: #DCDCAA">GetDataAsync</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">response</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_httpClient</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetAsync</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;https://dummyjson.com/products/333&quot;</span><span style="color: #D4D4D4">); </span><span style="color: #6A9955">// Hata oluşması için olmayan bir ürün Id verdim</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">response</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">EnsureSuccessStatusCode</span><span style="color: #D4D4D4">(); </span><span style="color: #6A9955">// Başarısız durumlarda exception fırlatır ve Circuit Breaker devreye girer</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">response</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Content</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">ReadAsStringAsync</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>
</div></div>



<p class="wp-block-paragraph">Son olarak HomeController.cs:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><textarea class="code-block-pro-copy-button-textarea" aria-hidden="true" readonly>public class HomeController : Controller
{
    private readonly ITestApiClient _apiClient;

    public HomeController(ITestApiClient apiClient)
    {
        _apiClient = apiClient;
    }

    [HttpGet(&#8220;test&#8221;)]
    public async Task&lt;IActionResult> Test()
    {
        var data = await _apiClient.GetDataAsync();

        return Ok(data);
    }
}</textarea><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">HomeController</span><span style="color: #D4D4D4"> : </span><span style="color: #4EC9B0">Controller</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">readonly</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ITestApiClient</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_apiClient</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">HomeController</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">ITestApiClient</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">apiClient</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">_apiClient</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">apiClient</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #4EC9B0">HttpGet</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;test&quot;</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Task</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">IActionResult</span><span style="color: #D4D4D4">&gt; </span><span style="color: #DCDCAA">Test</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_apiClient</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetDataAsync</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Ok</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">data</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">5 istekten sonra Circuit Breaker devreye girecek şekilde yapılandırmamızı tamamladıktan sonra sonuç :</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1004" height="240" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-4.png?resize=1004%2C240&#038;ssl=1" alt="" class="wp-image-404" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-4.png?w=1004&amp;ssl=1 1004w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-4.png?resize=300%2C72&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-4.png?resize=768%2C184&amp;ssl=1 768w" sizes="auto, (max-width: 1004px) 100vw, 1004px" /></figure>



<p class="wp-block-paragraph">Circuit Breaker Pattern &#8216;i ile ilgili anlatacaklarım bu kadar. Pattern &#8216;in anlaşılabilir olması için kurguyu basit tutmaya çalıştım. Umarım faydalı olmuştur.</p>



<p class="wp-block-paragraph">Sonraki yazılarda görüşmek dileğiyle&#8230;</p>



<p class="wp-block-paragraph">Faydalandığım linkler:</p>



<p class="wp-block-paragraph"><a href="https://learn.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker">https://learn.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker</a></p>



<p class="wp-block-paragraph"><a href="https://medium.com/@90mandalchandan/implementing-circuit-breaker-in-net-core-with-polly-32c62a9984e4">https://medium.com/@90mandalchandan/implementing-circuit-breaker-in-net-core-with-polly-32c62a9984e4</a></p>
<p><a href="https://www.sebahattint.com/circuit-breaker-pattern-nedir/">Circuit Breaker Pattern Nedir?</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sebahattint.com/circuit-breaker-pattern-nedir/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Fuzzy Query Nedir? Elasticsearch ve Kibana Console &#8211; Dev Tools Örneği</title>
		<link>https://www.sebahattint.com/fuzzy-query-nedir-elasticsearch-ve-kibana-console-dev-tools-ornegi/</link>
					<comments>https://www.sebahattint.com/fuzzy-query-nedir-elasticsearch-ve-kibana-console-dev-tools-ornegi/#respond</comments>
		
		<dc:creator><![CDATA[Sebahattin]]></dc:creator>
		<pubDate>Mon, 09 Jun 2025 00:05:37 +0000</pubDate>
				<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Elasticsearch]]></category>
		<category><![CDATA[Kibana]]></category>
		<category><![CDATA[dev tools]]></category>
		<category><![CDATA[elasticsearch]]></category>
		<category><![CDATA[Fuzzy]]></category>
		<category><![CDATA[Fuzzy Query]]></category>
		<category><![CDATA[fuzzy search]]></category>
		<category><![CDATA[kibana]]></category>
		<guid isPermaLink="false">https://www.sebahattint.com/?p=357</guid>

					<description><![CDATA[<p>Bu makalede Fuzzy Query&#8217;den bahsedeceğim. Örneklerimizi Docker Desktop &#8216;a kuracağımız elasticsearch ve kibana konteynerleri üzerinde gerçekleştireceğiz. Bu şekilde daha hızlı uygulanabilir örnekler elde edebileceğimizi düşünüyorum. Ek olarak bonus bir framework&#8230;</p>
<p><a href="https://www.sebahattint.com/fuzzy-query-nedir-elasticsearch-ve-kibana-console-dev-tools-ornegi/">Fuzzy Query Nedir? Elasticsearch ve Kibana Console &#8211; Dev Tools Örneği</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Bu makalede Fuzzy Query&#8217;den bahsedeceğim. Örneklerimizi Docker Desktop &#8216;a kuracağımız elasticsearch ve kibana konteynerleri üzerinde gerçekleştireceğiz. Bu şekilde daha hızlı uygulanabilir örnekler elde edebileceğimizi düşünüyorum. Ek olarak bonus bir framework ten de bahsedeceğim. Özetle akış şu şekilde olacak :</p>



<ul class="wp-block-list">
<li>Fuzzy Query Nedir?</li>



<li>Docker Desktop &#8216;a Elasticsearch ve Kibana Kurulumu</li>



<li>Kibana Console &#8211; Dev Tools
<ul class="wp-block-list">
<li>Yeni Index Oluşturma</li>



<li>Bulk Data Girişi</li>



<li>Fuzzy Query Örneği</li>



<li>Boosting Kullanımı</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Fuzzy Query Nedir?</h2>



<p class="wp-block-paragraph"><strong>Fuzzy Query</strong>, arama sorgularında hatalı yazılmış, eksik, fazla karakter içeren veya benzer kelimeleri de eşleştirmek için kullanılan bir tekniktir. Kısaca &#8220;benzer eşleşme&#8221; yapar. Yani ilgili data içerisinde sorgulanan terim ile tam olarak eşleşmeyen ama benzer olan sonuçları da getirir. Bu işlem arka planda genellikle <strong>Levenshtein Distance</strong> (Levenshtein Mesafesi) algoritması kullanılarak gerçekleştirilir. Konuyla ilgili detayları incelemek isterseniz daha önce yazdığım &#8220;<a href="https://www.sebahattint.com/levenshtein-mesafesi-levenshtein-distance-nedir/">Levenshtein Mesafesi (Levenshtein Distance) Nedir?</a>&#8221; blog yazısını inceleyebilirsiniz.</p>



<h2 class="wp-block-heading">Docker Desktop &#8216;a Elasticsearch ve Kibana Kurulumu</h2>



<p class="wp-block-paragraph">Docker-compose.yml dosya içeriği aşağıdaki gibi. Dosyayı herhangi bir klasöre attıktan sonra docker-compose up komutu ile konteyner larını kurulmasını ve ayağa kalkmasını sağlayabilirsiniz.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">YAML</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><textarea class="code-block-pro-copy-button-textarea" aria-hidden="true" readonly>version: &#8216;3.8&#8217;
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.7.1
    expose: 
      &#8211; 9200
    environment:
      &#8211; xpack.security.enabled=false
      &#8211; &#8220;discovery.type=single-node&#8221;
      &#8211; ELASTIC_USERNAME=elastic
      &#8211; ELASTIC_PASSWORD=DkIedPPSCb
    networks:
      &#8211; es-net
    ports:
      &#8211; 9200:9200
    volumes:
      &#8211; elasticsearch-data:/usr/share/elasticsearch/data
  kibana:
    image: docker.elastic.co/kibana/kibana:8.7.1
    environment:
      &#8211; ELASTICSEARCH_HOSTS=http://elasticsearch:9200
    expose:
      &#8211; 5601
    networks:
      &#8211; es-net
    depends_on:
      &#8211; elasticsearch
    ports:
      &#8211; 5601:5601
    volumes:
      &#8211; kibana-data:/usr/share/kibana/data
networks:
  es-net:
    driver: bridge
volumes:
  elasticsearch-data:
    driver: local
  kibana-data:
    driver: local</textarea><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">version</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&#39;3.8&#39;</span></span>
<span class="line"><span style="color: #569CD6">services</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">elasticsearch</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">image</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">docker.elastic.co/elasticsearch/elasticsearch:8.7.1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">expose</span><span style="color: #D4D4D4">: </span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #B5CEA8">9200</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">environment</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #CE9178">xpack.security.enabled=false</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #CE9178">&quot;discovery.type=single-node&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #CE9178">ELASTIC_USERNAME=elastic</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #CE9178">ELASTIC_PASSWORD=DkIedPPSCb</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">networks</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #CE9178">es-net</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">ports</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #CE9178">9200:9200</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">volumes</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #CE9178">elasticsearch-data:/usr/share/elasticsearch/data</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">kibana</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">image</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">docker.elastic.co/kibana/kibana:8.7.1</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">environment</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #CE9178">ELASTICSEARCH_HOSTS=http://elasticsearch:9200</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">expose</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #B5CEA8">5601</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">networks</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #CE9178">es-net</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">depends_on</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #CE9178">elasticsearch</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">ports</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #CE9178">5601:5601</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">volumes</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">      - </span><span style="color: #CE9178">kibana-data:/usr/share/kibana/data</span></span>
<span class="line"><span style="color: #569CD6">networks</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">es-net</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">driver</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">bridge</span></span>
<span class="line"><span style="color: #569CD6">volumes</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">elasticsearch-data</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">driver</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">local</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #569CD6">kibana-data</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">driver</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">local</span></span></code></pre></div>



<h2 class="wp-block-heading">Kibana Console &#8211; Dev Tools</h2>



<p class="wp-block-paragraph">Kurulumu tamamladıysanız, Kibana Console Dev Tools arayüzüne <a href="http://localhost:5601/app/dev_tools#/console">http://localhost:5601/app/dev_tools#/console</a> bu şekilde erişebiliyor olmalısınız. Öncelikle örnek verilerimizi tutacağımız <strong>products_st</strong> adında yeni bir index oluşturalım.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JSON</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><textarea class="code-block-pro-copy-button-textarea" aria-hidden="true" readonly>PUT /products_st
{
  &#8220;mappings&#8221;: {
    &#8220;properties&#8221;: {
      &#8220;name&#8221;: {
        &#8220;type&#8221;: &#8220;text&#8221;
      },
      &#8220;price&#8221;: {
        &#8220;type&#8221;: &#8220;float&#8221;
      }
    }
  }
}</textarea><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">PUT /products_st</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">&quot;mappings&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;properties&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">&quot;type&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;text&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">      },</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">&quot;type&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;float&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">      }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Daha sonra index içerisine bulk olarak dummy data gönderelim. Sorgu sonucunda bulacağımız her sonuç score unun farklı olduğunu görebilmek için yazım hataları olan veya benzer kayıtları bilerek ekledim.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JSON</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><textarea class="code-block-pro-copy-button-textarea" aria-hidden="true" readonly>POST /products_st/_bulk
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 1 } }
{ &#8220;name&#8221;: &#8220;Ekran Kartı&#8221;, &#8220;price&#8221;: 8500.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 2 } }
{ &#8220;name&#8221;: &#8220;Anakart&#8221;, &#8220;price&#8221;: 3200.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 3 } }
{ &#8220;name&#8221;: &#8220;İşlemci&#8221;, &#8220;price&#8221;: 6700.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 4 } }
{ &#8220;name&#8221;: &#8220;RAM Bellek&#8221;, &#8220;price&#8221;: 1200.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 5 } }
{ &#8220;name&#8221;: &#8220;SSD Disk&#8221;, &#8220;price&#8221;: 2100.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 6 } }
{ &#8220;name&#8221;: &#8220;HDD Disk&#8221;, &#8220;price&#8221;: 950.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 7 } }
{ &#8220;name&#8221;: &#8220;Kasa&#8221;, &#8220;price&#8221;: 1800.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 8 } }
{ &#8220;name&#8221;: &#8220;Güç Kaynağı&#8221;, &#8220;price&#8221;: 1100.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 9 } }
{ &#8220;name&#8221;: &#8220;Monitör&#8221;, &#8220;price&#8221;: 4500.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 10 } }
{ &#8220;name&#8221;: &#8220;Klavye&#8221;, &#8220;price&#8221;: 650.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 11 } }
{ &#8220;name&#8221;: &#8220;Mouse&#8221;, &#8220;price&#8221;: 350.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 12 } }
{ &#8220;name&#8221;: &#8220;Kulaklık&#8221;, &#8220;price&#8221;: 800.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 13 } }
{ &#8220;name&#8221;: &#8220;Ekran Karı&#8221;, &#8220;price&#8221;: 8400.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 14 } }
{ &#8220;name&#8221;: &#8220;Ekran Kart&#8221;, &#8220;price&#8221;: 8300.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 15 } }
{ &#8220;name&#8221;: &#8220;Ekraan Kartı&#8221;, &#8220;price&#8221;: 8600.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 16 } }
{ &#8220;name&#8221;: &#8220;Ankart&#8221;, &#8220;price&#8221;: 3100.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 17 } }
{ &#8220;name&#8221;: &#8220;Ana Kart&#8221;, &#8220;price&#8221;: 3300.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 18 } }
{ &#8220;name&#8221;: &#8220;Ram Belleği&#8221;, &#8220;price&#8221;: 1250.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 19 } }
{ &#8220;name&#8221;: &#8220;Ram Belleg&#8221;, &#8220;price&#8221;: 1190.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 20 } }
{ &#8220;name&#8221;: &#8220;SsdDisc&#8221;, &#8220;price&#8221;: 2050.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 21 } }
{ &#8220;name&#8221;: &#8220;HDDDisc&#8221;, &#8220;price&#8221;: 940.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 22 } }
{ &#8220;name&#8221;: &#8220;Kasaa&#8221;, &#8220;price&#8221;: 1790.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 23 } }
{ &#8220;name&#8221;: &#8220;Guc Kaynagı&#8221;, &#8220;price&#8221;: 1120.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 24 } }
{ &#8220;name&#8221;: &#8220;Monotor&#8221;, &#8220;price&#8221;: 4400.0 }
{ &#8220;index&#8221;: { &#8220;_id&#8221;: 25 } }
{ &#8220;name&#8221;: &#8220;Monitr&#8221;, &#8220;price&#8221;: 4550.0 }</textarea><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">POST /products_st/_bulk</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Ekran Kartı&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">8500.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Anakart&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">3200.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;İşlemci&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">6700.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;RAM Bellek&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">1200.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;SSD Disk&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">2100.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">6</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;HDD Disk&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">950.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">7</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Kasa&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">1800.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">8</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Güç Kaynağı&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">1100.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">9</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Monitör&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">4500.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Klavye&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">650.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">11</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Mouse&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">350.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">12</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Kulaklık&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">800.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">13</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Ekran Karı&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">8400.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">14</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Ekran Kart&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">8300.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">15</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Ekraan Kartı&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">8600.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">16</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Ankart&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">3100.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">17</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Ana Kart&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">3300.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">18</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Ram Belleği&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">1250.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">19</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Ram Belleg&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">1190.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">20</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;SsdDisc&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">2050.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">21</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;HDDDisc&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">940.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">22</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Kasaa&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">1790.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">23</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Guc Kaynagı&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">1120.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">24</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Monotor&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">4400.0</span><span style="color: #D4D4D4"> }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;index&quot;</span><span style="color: #D4D4D4">: { </span><span style="color: #9CDCFE">&quot;_id&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">25</span><span style="color: #D4D4D4"> } }</span></span>
<span class="line"><span style="color: #D4D4D4">{ </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;Monitr&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">&quot;price&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">4550.0</span><span style="color: #D4D4D4"> }</span></span></code></pre></div>



<p class="wp-block-paragraph">Buraya kadar herşey tamamsa artık Fuzzy Query mizi Dev Tools üzerinde yazarak nasıl çıktı elde ettiğimizi görebiliriz. Öncelikle bütün kayıtları çekerek datamızın varlığını kontrol edelim.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JSON</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><textarea class="code-block-pro-copy-button-textarea" aria-hidden="true" readonly>GET products_st/_search
{
  &#8220;size&#8221;:50,
  &#8220;query&#8221;: {&#8220;match_all&#8221;: {}}
}</textarea><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">GET products_st/_search</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">&quot;size&quot;</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">50</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">&quot;query&quot;</span><span style="color: #D4D4D4">: {</span><span style="color: #9CDCFE">&quot;match_all&quot;</span><span style="color: #D4D4D4">: {}}</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Sorguyu çalıştırdığımızda 25 kaydın gelmesi gerekiyor. Burada &#8220;size&#8221; değerini vermezseniz default olarak 10 kayıt gelecektir.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="464" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-1.png?resize=1024%2C464&#038;ssl=1" alt="elasticsearch-kibana-console-dev-tools" class="wp-image-388" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-1.png?resize=1024%2C464&amp;ssl=1 1024w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-1.png?resize=300%2C136&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-1.png?resize=768%2C348&amp;ssl=1 768w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-1.png?resize=1536%2C696&amp;ssl=1 1536w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-1.png?w=1910&amp;ssl=1 1910w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Şimdi &#8220;ekran&#8221; kelimesini Fuzzy Query ile aratarak eşleşmeleri bulalım ve score larını inceleyelim.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JSON</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><textarea class="code-block-pro-copy-button-textarea" aria-hidden="true" readonly>GET /products_st/_search
{
  &#8220;query&#8221;: {
    &#8220;bool&#8221;: {
      &#8220;must&#8221;: {
        &#8220;fuzzy&#8221;: {
          &#8220;name&#8221;: {
            &#8220;value&#8221;: &#8220;ekran&#8221;,
            &#8220;fuzziness&#8221;: &#8220;AUTO&#8221;
          }
        }
      }
    }
  }
}</textarea><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">GET /products_st/_search</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">&quot;query&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;bool&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">&quot;must&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">&quot;fuzzy&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">          </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">&quot;value&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;ekran&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">&quot;fuzziness&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;AUTO&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">          }</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">      }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="488" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-2.png?resize=1024%2C488&#038;ssl=1" alt="" class="wp-image-389" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-2.png?resize=1024%2C488&amp;ssl=1 1024w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-2.png?resize=300%2C143&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-2.png?resize=768%2C366&amp;ssl=1 768w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-2.png?resize=1536%2C733&amp;ssl=1 1536w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/image-2.png?w=1916&amp;ssl=1 1916w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Yukarıda gördüğünüz gibi bulunan her sonuç için bir<strong> _score</strong> değeri üretiliyor. En yüksek score en iyi eşleşen sonuç anlamına geliyor. Sorgudaki <strong>&#8220;fuzziness&#8221;: &#8220;AUTO&#8221;</strong> değeri Fuzzy Query’nin ne kadar toleranslı olacağını otomatik olarak belirlememizi sağlıyor. Fakat sayısal bir değer verirsek : Örneğin değer olarak &#8220;2&#8221; verilirse, 2 karakter farkı tolere eder.</p>



<p class="wp-block-paragraph"><strong>Alan bazında boosting</strong> vererek ağırlığa göre arama yapmak isterseniz, her alan için boost tanımlayabilir, boosting sayesinde her alana bir ağırlık katsayısı (boost) verebilirsiniz. Böylece daha yüksek boost alan, daha yüksek _score üretir ve daha üst sıralara çıkar.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JSON</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><textarea class="code-block-pro-copy-button-textarea" aria-hidden="true" readonly>GET /products_st/_search
{
  &#8220;query&#8221;: {
    &#8220;fuzzy&#8221;: {
      &#8220;name&#8221;: {
        &#8220;value&#8221;: &#8220;kart&#8221;,
        &#8220;fuzziness&#8221;: &#8220;AUTO&#8221;,
        &#8220;boost&#8221;: 3.0
      }
    }
  }
}</textarea><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">GET /products_st/_search</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">&quot;query&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;fuzzy&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">&quot;name&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">&quot;value&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;kart&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">&quot;fuzziness&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;AUTO&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">&quot;boost&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">3.0</span></span>
<span class="line"><span style="color: #D4D4D4">      }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Birden fazla alan için tanımlama yapmak isterseniz, multi_match kullanabilirsiniz. Index imizde &#8220;description&#8221; adında yeni bir alanın daha olduğunu varsayarsak:</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JSON</span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><textarea class="code-block-pro-copy-button-textarea" aria-hidden="true" readonly>GET /products_st/_search
{
  &#8220;query&#8221;: {
    &#8220;multi_match&#8221;: {
      &#8220;query&#8221;: &#8220;kart&#8221;,
      &#8220;fields&#8221;: [
        &#8220;name^2&#8221;,
        &#8220;description^1&#8221;
      ],
      &#8220;fuzziness&#8221;: &#8220;AUTO&#8221;
    }
  }
}
</textarea><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">GET /products_st/_search</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #9CDCFE">&quot;query&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">&quot;multi_match&quot;</span><span style="color: #D4D4D4">: {</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">&quot;query&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;kart&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">&quot;fields&quot;</span><span style="color: #D4D4D4">: [</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;name^2&quot;</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&quot;description^1&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">      ],</span></span>
<span class="line"><span style="color: #D4D4D4">      </span><span style="color: #9CDCFE">&quot;fuzziness&quot;</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;AUTO&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">  }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span></code></pre></div>



<p class="wp-block-paragraph">&#8220;name&#8221; için 2, &#8220;description&#8221; için 1 olarak ağırlık verebilir ve bu ağırlıklara göre _score ların üretilmesi sağlanabilir.</p>



<p class="wp-block-paragraph">Bu konu ile ilgili .Net üzerinde örnekte yapmak istiyorum ama makaleyi daha fazla uzatmamak için burada bitiriyorum. .Net için örnek yapmak isterseniz Elastic.Clients.Elasticsearch paketini kullanabilirsiniz (Github: <a href="https://github.com/elastic/elasticsearch-net">https://github.com/elastic/elasticsearch-net</a>). Elasticsearch ten bağımsız projenizde Fuzzy Query kullanmak isterseniz, yine aynı algoritmayı kullanan FuzzySharp &#8216;ı (<a href="https://github.com/JakeBayer/FuzzySharp">https://github.com/JakeBayer/FuzzySharp</a>) tercih edebilirsiniz.</p>



<p class="wp-block-paragraph">Başka bir makalede görüşmek üzere. </p>



<p class="wp-block-paragraph"></p>
<p><a href="https://www.sebahattint.com/fuzzy-query-nedir-elasticsearch-ve-kibana-console-dev-tools-ornegi/">Fuzzy Query Nedir? Elasticsearch ve Kibana Console &#8211; Dev Tools Örneği</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sebahattint.com/fuzzy-query-nedir-elasticsearch-ve-kibana-console-dev-tools-ornegi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Levenshtein Mesafesi (Levenshtein Distance) Nedir?</title>
		<link>https://www.sebahattint.com/levenshtein-mesafesi-levenshtein-distance-nedir/</link>
					<comments>https://www.sebahattint.com/levenshtein-mesafesi-levenshtein-distance-nedir/#respond</comments>
		
		<dc:creator><![CDATA[Sebahattin]]></dc:creator>
		<pubDate>Tue, 03 Jun 2025 18:25:01 +0000</pubDate>
				<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[didyoumean]]></category>
		<category><![CDATA[fuzzysearch]]></category>
		<category><![CDATA[levenshtein]]></category>
		<category><![CDATA[levenshtein distance]]></category>
		<category><![CDATA[levenshtein mesafesi]]></category>
		<category><![CDATA[string compare]]></category>
		<category><![CDATA[string karşılaştırma]]></category>
		<category><![CDATA[veri temizleme]]></category>
		<guid isPermaLink="false">https://www.sebahattint.com/?p=373</guid>

					<description><![CDATA[<p>Levenshtein Mesafesi algoritması, iki kelimenin birbirine dönüşümü için minimum ne kadar işlem yapılması gerektiğini hesaplayan bir algoritmadır. Hatalı kelimeleri veya birbirine yakın bilgilere sahip verileri bu algoritma ile ortaya çıkarabiliriz.&#8230;</p>
<p><a href="https://www.sebahattint.com/levenshtein-mesafesi-levenshtein-distance-nedir/">Levenshtein Mesafesi (Levenshtein Distance) Nedir?</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph"><strong>Levenshtein Mesafesi</strong> algoritması, iki kelimenin birbirine dönüşümü için <strong>minimum</strong> ne kadar işlem yapılması gerektiğini hesaplayan bir algoritmadır. Hatalı kelimeleri veya birbirine yakın bilgilere sahip verileri bu algoritma ile ortaya çıkarabiliriz. Bu yazı içerisinde vereceğim örnekler ile neyden bahsettiğimi daha detaylı anlatmaya çalışacağım. </p>



<h2 class="wp-block-heading">Nerelerde Kullanılır?</h2>



<p class="wp-block-paragraph">Levenshtein Mesafesi kullanım alanları için birçok örnek verebiliriz:</p>



<ul class="wp-block-list">
<li><strong>Form doğrulama</strong>: Ad, soyad gibi alanlarda olası yazım hatalarını yakalayabilir.</li>



<li><strong>Veri temizliği</strong>: Veri tabanındaki benzer kayıtları gruplayabilir. Örn: benzer üyelik tespiti gibi.</li>



<li><strong>OCR sonrası düzeltme</strong>: Görüntüden alınan metindeki hataların belirlenmesinde kullanılabilir.</li>



<li><strong>Arama motorları</strong>: Hatalı yazılmış sorgulara öneriler sunar.</li>
</ul>



<h2 class="wp-block-heading">Nasıl Hesaplanır ve Örnekler</h2>



<p class="wp-block-paragraph">Levenshtein algoritması, dinamik programlama kullanır. Her iki string’e ait karakterler bir matrisin satır ve sütunlarına yerleştirilir. Bu matrisin her hücresinde, iki kelimenin o ana kadar olan kısmı arasındaki minimum dönüşüm maliyeti hesaplanır.</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="635" height="275" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Levenshtein_Distance_sebahattint.jpg?resize=635%2C275&#038;ssl=1" alt="" class="wp-image-374" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Levenshtein_Distance_sebahattint.jpg?w=635&amp;ssl=1 635w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2025/06/Levenshtein_Distance_sebahattint.jpg?resize=300%2C130&amp;ssl=1 300w" sizes="auto, (max-width: 635px) 100vw, 635px" /></figure>



<p class="wp-block-paragraph"><strong>1.Örnek:</strong> Sarı ile renklendirdiğim alandaki minimum değer alınır, &#8220;s&#8221; ve &#8220;t&#8221; birbirinden farklı karakterler ise minimum değere 1 eklenerek, kesişen hücreye yazılır. Bu örneğin ilk adımı için hesaplarsak, minimum değerimiz sıfır olacak, &#8220;s&#8221; ve &#8220;t&#8221; birbirinden farklı olduğu için +1 yaptığımızda yeni hücreye yazacağımız değer 0+1 = <strong>1</strong> olacaktır. Aynı işlemi bir sağa geçerek yaptığımızda tabloda göründüğü gibi 2 sayısını elde ediyoruz. Hesaplama algoritmasını diğer hücreler içinde aynı şekilde uygulandığında <strong>1.Örnek</strong> için bulacağımız sayı <strong>4</strong> olacaktır. Yani &#8220;shine&#8221; ve &#8220;train&#8221; kelimeleri arasındaki dönüşüm için minimum 4 işleme ihtiyaç var demektir.</p>



<p class="wp-block-paragraph"><strong>2.Örnek:</strong> İlk örnekte bahsettiğim gibi, algoritmayı bu örnek için de uyguladığımızda minimum işlem sayısını 3 olarak buluruz.</p>



<h2 class="wp-block-heading">Özet</h2>



<p class="wp-block-paragraph">Levenshtein Mesafesi, basit ama güçlü bir metin benzerliği algoritmasıdır. Hatalı girişleri yakalamak, öneriler sunmak veya veri temizliği yapmak isterseniz alternatif olarak bu algoritmadan faydalanabilirsiniz. Bu algoritma Elasticsearch &#8216;de de kullanılıyor, yakın zamanda bununla ilgili bir yazı da paylaşacağım.</p>



<p class="wp-block-paragraph">Yeni bir yazıda görüşmek üzere <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<h2 class="wp-block-heading">Faydalandığım Linkler</h2>



<p class="wp-block-paragraph"><a href="https://devopedia.org/levenshtein-distance">https://devopedia.org/levenshtein-distance</a></p>



<p class="wp-block-paragraph"><a href="https://www.youtube.com/watch?v=Dd_NgYVOdLk">https://www.youtube.com/watch?v=Dd_NgYVOdLk</a></p>
<p><a href="https://www.sebahattint.com/levenshtein-mesafesi-levenshtein-distance-nedir/">Levenshtein Mesafesi (Levenshtein Distance) Nedir?</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sebahattint.com/levenshtein-mesafesi-levenshtein-distance-nedir/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>.NET Core ile Performans Optimizasyonu: İpuçları ve Teknikler</title>
		<link>https://www.sebahattint.com/net-core-ile-performans-optimizasyonu-ipuclari-ve-teknikler/</link>
					<comments>https://www.sebahattint.com/net-core-ile-performans-optimizasyonu-ipuclari-ve-teknikler/#respond</comments>
		
		<dc:creator><![CDATA[Sebahattin]]></dc:creator>
		<pubDate>Wed, 28 Aug 2024 10:48:11 +0000</pubDate>
				<category><![CDATA[C Sharp (C#)]]></category>
		<category><![CDATA[Genel]]></category>
		<category><![CDATA[.net core performance]]></category>
		<category><![CDATA[async await]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[distributed systems]]></category>
		<category><![CDATA[garbage collection]]></category>
		<category><![CDATA[performance]]></category>
		<guid isPermaLink="false">https://www.sebahattint.com/?p=332</guid>

					<description><![CDATA[<p>.NET Core, performans odaklıdır. Ancak, en iyi sonuçları elde etmek için uygulamalarımızda belirli optimizasyon tekniklerini kullanmamız gerekir. </p>
<p><a href="https://www.sebahattint.com/net-core-ile-performans-optimizasyonu-ipuclari-ve-teknikler/">.NET Core ile Performans Optimizasyonu: İpuçları ve Teknikler</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">.NET Core, performans odaklıdır. Ancak, en iyi sonuçları elde etmek için uygulamalarımızda belirli optimizasyon tekniklerini kullanmamız gerekir. Bu yazıda, .NET Core ile performans optimizasyonu için uygulanabilir en iyi tekniklere olabildiğince değinmeye çalışacağım.</p>



<h4 class="wp-block-heading">1. <strong>Asenkron Programlama ve I/O İşlemleri</strong></h4>



<p class="wp-block-paragraph">Asenkron programlama, uygulamalarımızın uzun süren I/O işlemleri sırasında bloklanmasını önler. Örneğin, bir veritabanı sorgusunun sonuçlanmasını beklerken diğer işlemler devam edebilir, böylece uygulamamızın yanıt süresi önemli ölçüde kısalır.</p>



<p class="wp-block-paragraph">Asenkron programlama sayesinde, özellikle web uygulamalarında kullanıcı deneyimi iyileştirilir ve uygulamanızın genel performansı artar.</p>



<h4 class="wp-block-heading">2. <strong>Bellek Yönetimi ve Garbage Collection</strong></h4>



<p class="wp-block-paragraph">Performans optimizasyonu için, bellek kullanımını minimize etmek ve gereksiz nesne oluşturmalardan kaçınmak önemlidir. <strong>IDisposable</strong> interface ini kullanarak bellek yönetimini kontrol altında tutabilir ve <strong>using</strong> ifadesiyle kaynakları doğru bir şekilde Dispose edebilirsiniz.</p>



<h4 class="wp-block-heading">3. Önbellekleme (Caching)</h4>



<p class="wp-block-paragraph">Önbellekleme, sık kullanılan verilerin bellekte tutulmasıyla uygulamamızın performansını artırabilir. .NET Core&#8217;da <strong>MemoryCache</strong> ve <strong>DistributedCache</strong> gibi önbellekleme stratejileri kullanarak, veritabanı sorgularını azaltabilir ve yanıt sürelerini iyileştirebilirsiniz.</p>



<p class="wp-block-paragraph">Örneğin, bir web uygulamasında kullanıcı bilgilerini sık sık sorguluyorsanız, bu bilgileri cache leyerek her seferinde veritabanına gitme ihtiyacını ortadan kaldırabilirsiniz. Ayrıca, <strong>&#8220;Response Caching&#8221;</strong> kullanarak statik içerikleri cache leyebilir ve client lara daha hızlı yanıt dönebilirsiniz. Basitçe bir örnek vermek gerekirse :</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" data-code="public class HomeController: Controller
{
    [HttpGet]
    [ResponseCache(Duration = 180, Location = ResponseCacheLocation.Any)]
    public IActionResult GetData()
    {
        return Ok($&quot;Responses are generated on {DateTime.Now}&quot;);
    }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">HomeController</span><span style="color: #D4D4D4">: </span><span style="color: #4EC9B0">Controller</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #4EC9B0">HttpGet</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #4EC9B0">ResponseCache</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">Duration</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">180</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">Location</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">ResponseCacheLocation</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Any</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">IActionResult</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">GetData</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Ok</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">$&quot;Responses are generated on {</span><span style="color: #9CDCFE">DateTime</span><span style="color: #CE9178">.</span><span style="color: #9CDCFE">Now</span><span style="color: #CE9178">}&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<h4 class="wp-block-heading">4. Veritabanı Optimizasyonu</h4>



<p class="wp-block-paragraph">Veritabanı, bir uygulamanın performansını doğrudan etkileyen bileşenlerden biridir. .NET Core’da Entity Framework Core gibi ORM (Object-Relational Mapping) araçları kullanırken, sorguları optimize etmek büyük önem taşır.</p>



<p class="wp-block-paragraph">AsNoTracking özelliğini kullanarak sorguların izleme yapılmadan çalışmasını sağlayabilir ve böylece performansı artırabilirsiniz. Ayrıca, veritabanı tarafında indeksler oluşturmak, gereksiz veri yükünü azaltır ve sorgu sürelerini kısaltır. Daha gelişmiş optimizasyonlar için, <strong>SQL Execution Plan</strong> hazırlanıp inceleyebilir ve karmaşık işlemleri Stored Procedure&#8217;lar ile gerçekleştirebilirsiniz.</p>



<h4 class="wp-block-heading">5. <strong>HTTP Performans Optimizasyonu</strong></h4>



<p class="wp-block-paragraph">HTTP istek ve yanıtlarının optimize edilmesi, özellikle web uygulamalarında kritik bir rol oynar. HTTP isteklerini <strong>gzip </strong>veya <strong>brotli</strong> gibi sıkıştırma teknikleriyle sıkıştırmak, bant genişliği kullanımını azaltır ve yanıt sürelerini hızlandırır.</p>



<p class="wp-block-paragraph">.NET Core&#8217;da middleware kullanarak bu tür optimizasyonları kolayca uygulayabilirsiniz. Ayrıca, HttpClient gibi araçları kullanırken yeniden kullanılabilir <strong>HttpMessageHandler</strong> instance ları oluşturmak, bellek tüketimini ve bağlantı açma maliyetlerini azaltır.</p>



<figure class="wp-block-image size-full is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="686" height="347" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-11.png?resize=686%2C347&#038;ssl=1" alt="" class="wp-image-340" style="width:840px;height:auto" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-11.png?w=686&amp;ssl=1 686w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-11.png?resize=300%2C152&amp;ssl=1 300w" sizes="auto, (max-width: 686px) 100vw, 686px" /></figure>



<h4 class="wp-block-heading">6. <strong>Multithreading ve Paralel Programlama</strong></h4>



<p class="wp-block-paragraph">Multithreading ve paralel programlama, CPU kaynaklarını en iyi şekilde kullanarak uygulamanızın performansını artırabilir. .NET Core’da <strong>Task Parallel Library (TPL) </strong>ve<strong> PLINQ (Parallel LINQ)</strong> kullanarak, büyük veri kümeleri üzerinde paralel işlemler gerçekleştirebilirsiniz.</p>



<p class="wp-block-paragraph">Örneğin, bir görüntü işleme uygulamasında her bir resmi farklı bir iş parçacığında işlemek, işlem süresini büyük ölçüde kısaltabilir. Ancak, multithreading kullanırken iş parçacıkları arasındaki veri tutarlılığı ve kilitlenmelere (deadlock) dikkat etmek önemlidir.</p>



<h4 class="wp-block-heading">7. <strong>Dağıtık Sistemlerde Performans</strong></h4>



<p class="wp-block-paragraph">Mikroservis mimarisi gibi dağıtık sistemlerde performansını optimize etmek, hem iletişim hem de veri tutarlılığı açısından önemlidir. Mikroservisler arasında mesajlaşma ve veri paylaşımı yaparken gecikmeleri minimize etmek için <strong>RabbitMQ, Kafka</strong> gibi mesajlaşma kuyruklarını kullanabilirsiniz.</p>



<p class="wp-block-paragraph">Ayrıca, dağıtık izleme (distributed tracing) araçlarıyla, mikroservisler arasında geçen süreyi izleyebilir ve performansı optimize etmek için gerekli düzenlemeleri yapabilirsiniz.</p>



<h4 class="wp-block-heading">8. DevOps ile Performans İzleme ve Sürekli İyileştirme</h4>



<p class="wp-block-paragraph">Performans optimizasyonu sadece geliştirme aşamasında değil, uygulamanın yayınlanması ve bakım sürecinde de önemlidir. DevOps süreçlerine performans izleme ve iyileştirme adımlarını entegre ederek, uygulamanızın performansını sürekli olarak takip edebilir ve iyileştirebilirsiniz.</p>



<p class="wp-block-paragraph">CI/CD pipeline&#8217;larına performans testlerini entegre etmek, her kod değişikliğinde performansın etkilenip etkilenmediğini kontrol etmenizi sağlar. Azure DevOps, Jenkins gibi araçlar kullanarak performans metriklerini sürekli izleyebilir ve gerektiğinde hızlı bir şekilde müdahale edebilirsiniz.</p>



<p class="wp-block-paragraph">Bu makalede amacım bazı şeylere dikkat çekmekti. Buradaki anahtar kelimelerin size bir faydası olduysa ne mutlu bana <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph">Sonraki yazıda görüşmek üzere.</p>
<p><a href="https://www.sebahattint.com/net-core-ile-performans-optimizasyonu-ipuclari-ve-teknikler/">.NET Core ile Performans Optimizasyonu: İpuçları ve Teknikler</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sebahattint.com/net-core-ile-performans-optimizasyonu-ipuclari-ve-teknikler/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>.Net Core 8 ile SignalR Kullanımı</title>
		<link>https://www.sebahattint.com/net-core-8-ile-signalr-kullanimi/</link>
					<comments>https://www.sebahattint.com/net-core-8-ile-signalr-kullanimi/#respond</comments>
		
		<dc:creator><![CDATA[Sebahattin]]></dc:creator>
		<pubDate>Wed, 28 Aug 2024 07:02:59 +0000</pubDate>
				<category><![CDATA[C Sharp (C#)]]></category>
		<category><![CDATA[signalr]]></category>
		<category><![CDATA[socket]]></category>
		<category><![CDATA[websocket]]></category>
		<guid isPermaLink="false">https://www.sebahattint.com/?p=314</guid>

					<description><![CDATA[<p>.NET Core 8 ile real time web uygulamaları geliştirmek, SignalR sayesinde oldukça kolaydır. SignalR, client ve server arasında düşük gecikmeli, iki yönlü iletişimi mümkün kılarak, özellikle chat uygulamaları gibi gerçek zamanlı veriye ihtiyaç duyan projelerde kullanılır.</p>
<p><a href="https://www.sebahattint.com/net-core-8-ile-signalr-kullanimi/">.Net Core 8 ile SignalR Kullanımı</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">.NET Core 8 ile real time web uygulamaları geliştirmek, SignalR sayesinde oldukça kolaydır. SignalR, client ve server arasında düşük gecikmeli, iki yönlü iletişimi mümkün kılarak, özellikle chat uygulamaları gibi gerçek zamanlı veriye ihtiyaç duyan projelerde kullanılır. Bu makalede, .NET Core 8 ile SignalR kullanarak basit bir chat uygulaması geliştireceğiz. </p>



<h5 class="wp-block-heading"><strong>SignalR Nedir?</strong></h5>



<p class="wp-block-paragraph">SignalR, ASP.NET Core çatısı altında bulunan bir kütüphanedir. İstemciler ile sunucu arasında çift yönlü, asenkron bir iletişim sağlar ve uygulamanızda gerçek zamanlı özellikler eklemenizi kolaylaştırır. Buna farklı bir örnek daha vermek gerekirse;  bildirimler. Bildirimler bulunduğunuz web sitesinde sayfa yenilenmeden ekranınıza düşebilir. </p>



<p class="wp-block-paragraph">Yeni proje oluşturarak örneğimize başlayalım.</p>


<div class="wp-block-image">
<figure class="aligncenter size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="961" height="425" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-6.png?resize=961%2C425&#038;ssl=1" alt="" class="wp-image-317" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-6.png?w=961&amp;ssl=1 961w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-6.png?resize=300%2C133&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-6.png?resize=768%2C340&amp;ssl=1 768w" sizes="auto, (max-width: 961px) 100vw, 961px" /></figure>
</div>


<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">Projemize SignalR ı eklemek için Solution Explorer dan projeye sağ tıklayın > Add > Add Client-Side Library. Provider, Library ve diğer bilgileri aşağıdaki gibi düzenleyip Install edin.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="570" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-8.png?resize=1024%2C570&#038;ssl=1" alt="" class="wp-image-319" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-8.png?resize=1024%2C570&amp;ssl=1 1024w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-8.png?resize=300%2C167&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-8.png?resize=768%2C427&amp;ssl=1 768w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-8.png?w=1130&amp;ssl=1 1130w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Şimdi mesajlaşmayı yönetecek olan hub ımızı oluşturabiliriz.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" data-code="using Microsoft.AspNetCore.SignalR;

namespace SignalRTest.Hubs
{
    public class ChatHub : Hub
    {
        public async Task SendMessage(string user, string message)
        {
            await Clients.All.SendAsync(&quot;ReceiveMessage&quot;, user, message);
        }
    }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Microsoft</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">AspNetCore</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">SignalR</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">SignalRTest</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Hubs</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ChatHub</span><span style="color: #D4D4D4"> : </span><span style="color: #4EC9B0">Hub</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Task</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">SendMessage</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">user</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Clients</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">All</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">SendAsync</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;ReceiveMessage&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">user</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Hub ımızı oluşturduktan sonra Program.cs de SignalR ı inject edelim ve routingini verelim.</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="909" height="661" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-10.png?resize=909%2C661&#038;ssl=1" alt="" class="wp-image-323" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-10.png?w=909&amp;ssl=1 909w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-10.png?resize=300%2C218&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-10.png?resize=768%2C558&amp;ssl=1 768w" sizes="auto, (max-width: 909px) 100vw, 909px" /></figure>



<p class="wp-block-paragraph">Home/Index.cshtml içeriğini aşağıdaki gibi düzenleyelim. Bu tasarımı kullanarak mesaj gönderecek ve gönderilen mesajları sayfada göreceğiz.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">HTML</span><span role="button" tabindex="0" data-code="&lt;div class=&quot;container&quot;&gt;
    &lt;div class=&quot;row p-1&quot;&gt;
        &lt;div class=&quot;col-1&quot;&gt;User&lt;/div&gt;
        &lt;div class=&quot;col-5&quot;&gt;&lt;input type=&quot;text&quot; id=&quot;userInput&quot; /&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&quot;row p-1&quot;&gt;
        &lt;div class=&quot;col-1&quot;&gt;Message&lt;/div&gt;
        &lt;div class=&quot;col-5&quot;&gt;&lt;input type=&quot;text&quot; class=&quot;w-100&quot; id=&quot;messageInput&quot; /&gt;&lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&quot;row p-1&quot;&gt;
        &lt;div class=&quot;col-6 text-end&quot;&gt;
            &lt;input type=&quot;button&quot; id=&quot;sendButton&quot; value=&quot;Send Message&quot; /&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&quot;row p-1&quot;&gt;
        &lt;div class=&quot;col-6&quot;&gt;
            &lt;hr /&gt;
        &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class=&quot;row p-1&quot;&gt;
        &lt;div class=&quot;col-6&quot;&gt;
            &lt;ul id=&quot;messagesList&quot;&gt;&lt;/ul&gt;
        &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;
&lt;script src=&quot;~/js/signalr/dist/browser/signalr.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;~/js/chat.js&quot;&gt;&lt;/script&gt;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;container&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;row p-1&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;col-1&quot;</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">User</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;col-5&quot;</span><span style="color: #808080">&gt;&lt;</span><span style="color: #569CD6">input</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;text&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;userInput&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;row p-1&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;col-1&quot;</span><span style="color: #808080">&gt;</span><span style="color: #D4D4D4">Message</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;col-5&quot;</span><span style="color: #808080">&gt;&lt;</span><span style="color: #569CD6">input</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;text&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;w-100&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;messageInput&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;row p-1&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;col-6 text-end&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">input</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;button&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;sendButton&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">value</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;Send Message&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;row p-1&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;col-6&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">hr</span><span style="color: #D4D4D4"> </span><span style="color: #808080">/&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;row p-1&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">div</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">class</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;col-6&quot;</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">ul</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;messagesList&quot;</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">ul</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">div</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">script</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">src</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;~/js/signalr/dist/browser/signalr.js&quot;</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">script</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">script</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">src</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;~/js/chat.js&quot;</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">script</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<p class="wp-block-paragraph">Son olarak chat.js i hazırlayalım.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">JavaScript</span><span role="button" tabindex="0" data-code="&quot;use strict&quot;;

var connection = new signalR.HubConnectionBuilder().withUrl(&quot;/chatHub&quot;).build();

document.getElementById(&quot;sendButton&quot;).disabled = true;

connection.on(&quot;ReceiveMessage&quot;, function (user, message) {
    var li = document.createElement(&quot;li&quot;);
    document.getElementById(&quot;messagesList&quot;).appendChild(li);
    li.textContent = `${user} says ${message}`;
});

connection.start().then(function () {
    document.getElementById(&quot;sendButton&quot;).disabled = false;
}).catch(function (err) {
    return console.error(err.toString());
});

document.getElementById(&quot;sendButton&quot;).addEventListener(&quot;click&quot;, function (event) {
    var user = document.getElementById(&quot;userInput&quot;).value;
    var message = document.getElementById(&quot;messageInput&quot;).value;
    connection.invoke(&quot;SendMessage&quot;, user, message).catch(function (err) {
        return console.error(err.toString());
    });
    event.preventDefault();
});" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #CE9178">&quot;use strict&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">connection</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">signalR</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">HubConnectionBuilder</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">withUrl</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;/chatHub&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">build</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">document</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getElementById</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;sendButton&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #9CDCFE">disabled</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">connection</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">on</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;ReceiveMessage&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">user</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">li</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">document</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">createElement</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;li&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">document</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getElementById</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;messagesList&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">appendChild</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">li</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">li</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">textContent</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">`</span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">user</span><span style="color: #569CD6">}</span><span style="color: #CE9178"> says </span><span style="color: #569CD6">${</span><span style="color: #9CDCFE">message</span><span style="color: #569CD6">}</span><span style="color: #CE9178">`</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">connection</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">start</span><span style="color: #D4D4D4">().</span><span style="color: #DCDCAA">then</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> () {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">document</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getElementById</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;sendButton&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #9CDCFE">disabled</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}).</span><span style="color: #DCDCAA">catch</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">err</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">error</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">err</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">toString</span><span style="color: #D4D4D4">());</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">document</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getElementById</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;sendButton&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">addEventListener</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;click&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">event</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">user</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">document</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getElementById</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;userInput&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #9CDCFE">value</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">document</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">getElementById</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;messageInput&quot;</span><span style="color: #D4D4D4">).</span><span style="color: #9CDCFE">value</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">connection</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">invoke</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;SendMessage&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">user</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">catch</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">function</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">err</span><span style="color: #D4D4D4">) {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">error</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">err</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">toString</span><span style="color: #D4D4D4">());</span></span>
<span class="line"><span style="color: #D4D4D4">    });</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">event</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">preventDefault</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span></code></pre></div>



<p class="wp-block-paragraph">Bu script, bir SignalR bağlantısı kurarak kullanıcıların <strong>real time </strong>mesaj gönderip almasını sağlar. Gönderilen her mesaj, sunucuya iletilir ve sunucudan gelen mesajlar diğer tüm istemcilere iletilir. <strong>Bu sayede kullanıcılar, diğer kullanıcıların mesajlarını anında görebilir.</strong> </p>



<p class="wp-block-paragraph"><strong>Test:</strong></p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="483" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-9.png?resize=1024%2C483&#038;ssl=1" alt="" class="wp-image-322" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-9.png?resize=1024%2C483&amp;ssl=1 1024w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-9.png?resize=300%2C142&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-9.png?resize=768%2C362&amp;ssl=1 768w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-9.png?w=1227&amp;ssl=1 1227w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Bu makalede, SignalR ile basit bir chat uygulaması geliştirdik. SignalR’ın sağladığı kolay entegrasyon ve güçlü özellikler sayesinde, gerçek zamanlı iletişim gerektiren projelerde oldukça etkili çözümler üretebilirsiniz. Gerçek zamanlı web uygulamaları geliştirmek için SignalR gibi güçlü araçların yanı sıra, <strong>WebSocket </strong>protokolü ve <strong>gRPC </strong>gibi diğer teknolojilere de göz atabilirsiniz. Bu sayede farklı senaryolar için en uygun çözümü bulabilirsiniz.</p>



<p class="wp-block-paragraph">Yeni bir yazıda görüşmek dileğiyle.<br>Kalın sağlıcakla.</p>
<p><a href="https://www.sebahattint.com/net-core-8-ile-signalr-kullanimi/">.Net Core 8 ile SignalR Kullanımı</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sebahattint.com/net-core-8-ile-signalr-kullanimi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Webhook Nedir?</title>
		<link>https://www.sebahattint.com/webhook-nedir/</link>
					<comments>https://www.sebahattint.com/webhook-nedir/#respond</comments>
		
		<dc:creator><![CDATA[Sebahattin]]></dc:creator>
		<pubDate>Wed, 28 Aug 2024 05:23:58 +0000</pubDate>
				<category><![CDATA[C Sharp (C#)]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[RabbitMQ]]></category>
		<category><![CDATA[pubsub]]></category>
		<category><![CDATA[rabbitmq]]></category>
		<category><![CDATA[webhook]]></category>
		<guid isPermaLink="false">https://www.sebahattint.com/?p=262</guid>

					<description><![CDATA[<p>İki farklı uygulama veya sistem arasında gerçek zamanlı iletişim sağlayan bir mekanizmadır. </p>
<p><a href="https://www.sebahattint.com/webhook-nedir/">Webhook Nedir?</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">İki farklı uygulama veya sistem arasında gerçek zamanlı iletişim sağlayan bir mekanizmadır. Genellikle bir web uygulamasının diğerine otomatik olarak bilgi göndermesi veya işlem yapması gerektiğinde kullanılır. Bir uygulamada belirli bir olay meydana geldiğinde, örneğin bir form doldurulduğunda veya bir ödeme işlemi tamamlandığında, bu olaya ilişkin bilgileri içeren bir HTTP isteği, webhook aracılığıyla başka bir uygulamaya gönderilir.</p>



<p class="wp-block-paragraph">Webhook&#8217;lar sayesinde ilgili endpointlere istek atılarak gerçekleştirilen kontrollere gerek kalmaz. Bu sayede sunucu tarafı gereksiz yükten kurtulmuş olur. Ayrıca Data Consistency (Veri Tutarlılığı) &#8216;de sağlanmış olur.</p>



<p class="wp-block-paragraph">Webhook&#8217;lar için aşağıdaki senaryoları örnek olarak verebiliriz:</p>



<ol class="wp-block-list">
<li>Ödeme işlemi tamamlandığında müşteriye otomatik bir e-posta gönderme.</li>



<li>Bir blog gönderisi yayınlandığında sosyal medya platformlarında otomatik olarak paylaşım yapma.</li>



<li>Bir müşteri destek bileti oluşturulduğunda destek ekibine bildirim gönderme.</li>



<li>Bir siparişte güncelleme yapıldığında ilgili yerlere bildirim gönderme.</li>
</ol>



<p class="wp-block-paragraph">Webhook&#8217;lar, bir uygulamadan diğerine gerçek zamanlı veri iletimi sağladıkları için iş süreçlerini otomatikleştirmek ve entegrasyonları kolaylaştırmak için oldukça kullanışlıdır.</p>



<p class="wp-block-paragraph">Biz örnek senaryo için yukarıda bahsettiğimiz senaryolardan en sonuncusunu uygulayabiliriz. İlk önce boş bir solution açalım ve içerisine 2 adet web api projesi ekleyelim. Ben isimlendirmelerimi aşağıdaki gibi yaptım.</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="535" height="513" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image.png?resize=535%2C513&#038;ssl=1" alt="" class="wp-image-305" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image.png?w=535&amp;ssl=1 535w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image.png?resize=300%2C288&amp;ssl=1 300w" sizes="auto, (max-width: 535px) 100vw, 535px" /></figure>



<p class="wp-block-paragraph"><strong>Order.Api :</strong> Sipariş güncelleme, Subscribe olma ve Notification.Api servisini tetikleyen işlemleri içerecek. Bu apide RabbitMq ile ilgili işlemler yapacağımız için RabbitMQ.Client paketini nuget üzerinden yüklemeyi unutmayınız.</p>



<p class="wp-block-paragraph"><strong>Notification.Api :</strong> Bildirim gönderecek servisimiz. Tabi bunu kodlamayacağız, tetiklendiğine dair ekrana mesaj basmamız yeterli.</p>



<p class="wp-block-paragraph">Öncelikle Order.Api projemizde OrderController adında yeni bir controller oluşturalım.. Unutmayın burada sadece bir örnek çalışıyoruz bu işlemler farklı mimarilerde de uygulanabilir veya daha clean yazılabilir <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Bağımlılıkları azaltmak ve daha esnek bir yapı elde etmek için bağımlılıkları interface ler aracılığıyla tanımlamak daha iyi olabilir. Bu, servislerin test edilebilirliğini artırır ve gelecekte başka bir mesajlaşma sistemi ya da farklı bir implemantasyon kullanmak istediğinizde kodu daha kolay değiştirebilmenizi sağlar. </p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" data-code=" [ApiController]
 [Route(&quot;api/[controller]&quot;)]
 public class OrderController : ControllerBase
 {
     private readonly RabbitMqPublisher _publisher;
     private readonly WebhookSubscriptionService _subscriptionService;

     public OrderController(RabbitMqPublisher publisher, WebhookSubscriptionService subscriptionService)
     {
         _publisher = publisher;
         _subscriptionService = subscriptionService;
     }

     [HttpPost(&quot;subscribe&quot;)]
     public IActionResult Subscribe([FromBody] string webhookUrl)
     {
         var subscription = new WebhookSubscription
         {
             WebhookUrl = webhookUrl
         };
         _subscriptionService.AddSubscription(subscription);
         return Ok(subscription);
     }

     [HttpPost(&quot;update&quot;)]
     public IActionResult UpdateOrder([FromBody] OrderUpdateRequest orderUpdateRequest)
     {
         var message = new OrderUpdateMessage
         {
             OrderId = orderUpdateRequest.OrderId,
             Status = orderUpdateRequest.Status,
             UpdatedDate = orderUpdateRequest.UpdatedDate
         };

         _publisher.PublishOrderUpdate(message);

         return Ok(&quot;Sipariş başarıyla güncellendi ve RabbitMq kuyruğuna gönderildi.&quot;);
     }
 }" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4"> [</span><span style="color: #4EC9B0">ApiController</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4"> [</span><span style="color: #4EC9B0">Route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;api/[controller]&quot;</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"><span style="color: #D4D4D4"> </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">OrderController</span><span style="color: #D4D4D4"> : </span><span style="color: #4EC9B0">ControllerBase</span></span>
<span class="line"><span style="color: #D4D4D4"> {</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">readonly</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">RabbitMqPublisher</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_publisher</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">readonly</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">WebhookSubscriptionService</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_subscriptionService</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">OrderController</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">RabbitMqPublisher</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">publisher</span><span style="color: #D4D4D4">, </span><span style="color: #4EC9B0">WebhookSubscriptionService</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">subscriptionService</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">     {</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #9CDCFE">_publisher</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">publisher</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #9CDCFE">_subscriptionService</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">subscriptionService</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">     }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">     [</span><span style="color: #4EC9B0">HttpPost</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;subscribe&quot;</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">IActionResult</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Subscribe</span><span style="color: #D4D4D4">([</span><span style="color: #4EC9B0">FromBody</span><span style="color: #D4D4D4">] </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">webhookUrl</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">     {</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">subscription</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">WebhookSubscription</span></span>
<span class="line"><span style="color: #D4D4D4">         {</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #9CDCFE">WebhookUrl</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">webhookUrl</span></span>
<span class="line"><span style="color: #D4D4D4">         };</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #9CDCFE">_subscriptionService</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">AddSubscription</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">subscription</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Ok</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">subscription</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">     }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">     [</span><span style="color: #4EC9B0">HttpPost</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;update&quot;</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"><span style="color: #D4D4D4">     </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">IActionResult</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">UpdateOrder</span><span style="color: #D4D4D4">([</span><span style="color: #4EC9B0">FromBody</span><span style="color: #D4D4D4">] </span><span style="color: #4EC9B0">OrderUpdateRequest</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">orderUpdateRequest</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">     {</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">OrderUpdateMessage</span></span>
<span class="line"><span style="color: #D4D4D4">         {</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #9CDCFE">OrderId</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">orderUpdateRequest</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">OrderId</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #9CDCFE">Status</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">orderUpdateRequest</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Status</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">             </span><span style="color: #9CDCFE">UpdatedDate</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">orderUpdateRequest</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">UpdatedDate</span></span>
<span class="line"><span style="color: #D4D4D4">         };</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #9CDCFE">_publisher</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">PublishOrderUpdate</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Ok</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Sipariş başarıyla güncellendi ve RabbitMq kuyruğuna gönderildi.&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">     }</span></span>
<span class="line"><span style="color: #D4D4D4"> }</span></span></code></pre></div>



<p class="wp-block-paragraph">Order.Api içerisinde Models klasörü altına :</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" data-code="namespace Order.Api.Models
{
    public class OrderUpdateRequest
    {
        public int OrderId { get; set; }
        public string Status { get; set; }
        public DateTime UpdatedDate { get; set; }
    }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Order</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Api</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Models</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">OrderUpdateRequest</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">OrderId</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Status</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DateTime</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">UpdatedDate</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" data-code="namespace Order.Api.Models
{
    public class OrderUpdateMessage
    {
        public int OrderId { get; set; }
        public string Status { get; set; }
        public DateTime UpdatedDate { get; set; }
    }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Order</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Api</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Models</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">OrderUpdateMessage</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">OrderId</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Status</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DateTime</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">UpdatedDate</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" data-code="namespace Order.Api.Models
{
    public class WebhookSubscription
    {
        public Guid Id { get; set; } = Guid.NewGuid();
        public string WebhookUrl { get; set; }
        public DateTime SubscribedDate { get; set; } = DateTime.UtcNow;
    }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Order</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Api</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Models</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">WebhookSubscription</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Guid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Id</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; } = </span><span style="color: #9CDCFE">Guid</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">NewGuid</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">WebhookUrl</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">DateTime</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">SubscribedDate</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; } = </span><span style="color: #9CDCFE">DateTime</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">UtcNow</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">OrderUpdateRequest, OrderUpdateMessage, WebhookSubscription model / dto larını oluşturalım.</p>



<p class="wp-block-paragraph">Şimdi gerekli servislerimizi yazalım. Öncelikle siparişte bir güncelleme olduğunda bu işlemi kuyruğa atacak RabbitMqPublisher class ımızı oluşturalım.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" data-code="using Order.Api.Models;
using RabbitMQ.Client;
using System.Text.Json;
using System.Text;

namespace Order.Api.Services
{
    public class RabbitMqPublisher
    {
        private readonly IConnection _connection;
        private string _queueName = &quot;order_updated_queue&quot;;

        public RabbitMqPublisher()
        {
            var factory = new ConnectionFactory() { HostName = &quot;localhost&quot; };
            _connection = factory.CreateConnection();
        }

        public void PublishOrderUpdate(OrderUpdateMessage message)
        {
            using (var channel = _connection.CreateModel())
            {
                channel.QueueDeclare(queue: _queueName, durable: false, exclusive: false, autoDelete: false, arguments: null);

                var body = Encoding.UTF8.GetBytes(JsonSerializer.Serialize(message));

                channel.BasicPublish(exchange: &quot;&quot;, routingKey: _queueName, basicProperties: null, body: body);
            }
        }
    }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Order</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Api</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Models</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">RabbitMQ</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Client</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">System</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Json</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">System</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Order</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Api</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Services</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">RabbitMqPublisher</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">readonly</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">IConnection</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_connection</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_queueName</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;order_updated_queue&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">RabbitMqPublisher</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">factory</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ConnectionFactory</span><span style="color: #D4D4D4">() { </span><span style="color: #9CDCFE">HostName</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;localhost&quot;</span><span style="color: #D4D4D4"> };</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">_connection</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">factory</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">CreateConnection</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">PublishOrderUpdate</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">OrderUpdateMessage</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">channel</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">_connection</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">CreateModel</span><span style="color: #D4D4D4">())</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">channel</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">QueueDeclare</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">queue</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">_queueName</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">durable</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">exclusive</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">autoDelete</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">arguments</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">body</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">Encoding</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">UTF8</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetBytes</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">JsonSerializer</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Serialize</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">));</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">channel</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">BasicPublish</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">exchange</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">routingKey</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">_queueName</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">basicProperties</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">body</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">body</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Subscribe ve Remove Subscribe işlemlerini içeren class ımız.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" data-code="using Order.Api.Models;

namespace Order.Api.Services
{
    public class WebhookSubscriptionService
    {
        private readonly List&lt;WebhookSubscription&gt; _subscriptions = new List&lt;WebhookSubscription&gt;();

        public IEnumerable&lt;WebhookSubscription&gt; GetAllSubscriptions()
        {
            return _subscriptions;
        }

        public void AddSubscription(WebhookSubscription subscription)
        {
            _subscriptions.Add(subscription);
        }

        public void RemoveSubscription(Guid id)
        {
            var subscription = _subscriptions.FirstOrDefault(s =&gt; s.Id == id);
            if (subscription != null)
            {
                _subscriptions.Remove(subscription);
            }
        }
    }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Order</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Api</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Models</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Order</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Api</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Services</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">WebhookSubscriptionService</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">readonly</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">List</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">WebhookSubscription</span><span style="color: #D4D4D4">&gt; </span><span style="color: #9CDCFE">_subscriptions</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">List</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">WebhookSubscription</span><span style="color: #D4D4D4">&gt;();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">IEnumerable</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">WebhookSubscription</span><span style="color: #D4D4D4">&gt; </span><span style="color: #DCDCAA">GetAllSubscriptions</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_subscriptions</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">AddSubscription</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">WebhookSubscription</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">subscription</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">_subscriptions</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Add</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">subscription</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">RemoveSubscription</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">Guid</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">subscription</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">_subscriptions</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">FirstOrDefault</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">s</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">s</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Id</span><span style="color: #D4D4D4"> == </span><span style="color: #9CDCFE">id</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">subscription</span><span style="color: #D4D4D4"> != </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">_subscriptions</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Remove</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">subscription</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Subscribe olan clientların bilgisini DB de tutmamız daha doğru olacaktır fakat burada konuya odaklandığım için DB işlemlerini yapmayacağım. Dilerseniz siz geliştirirken o şekilde yapabilir, webhookurl dışında farklı bilgiler de tutabilirsiniz.</p>



<p class="wp-block-paragraph">Son olarak kuyruğu dinleyen ve bir mesaj geldiğinde Subscribe olmuş clientları bilgilendirecek olan class ımızı yazalım.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" data-code="using Order.Api.Models;
using RabbitMQ.Client.Events;
using RabbitMQ.Client;
using System.Text.Json;
using System.Text;

namespace Order.Api.Services
{
    public class WebhookNotificationService
    {
        private readonly WebhookSubscriptionService _subscriptionService;
        private readonly IHttpClientFactory _httpClientFactory;
        private readonly IConnection _connection;
        private readonly IModel _channel;
        private string _queueName = &quot;order_updated_queue&quot;;

        public WebhookNotificationService(WebhookSubscriptionService subscriptionService, IHttpClientFactory httpClientFactory)
        {
            _subscriptionService = subscriptionService;
            _httpClientFactory = httpClientFactory;

            var factory = new ConnectionFactory() { HostName = &quot;localhost&quot;, Port = 5672 };
            _connection = factory.CreateConnection();
            _channel = _connection.CreateModel();

            _channel.QueueDeclare(queue: _queueName, durable: false, exclusive: false, autoDelete: false, arguments: null);
        }

        public void Start()
        {
            var consumer = new EventingBasicConsumer(_channel);
            consumer.Received += async (model, ea) =&gt;
            {
                var body = ea.Body.ToArray();
                var message = JsonSerializer.Deserialize&lt;OrderUpdateMessage&gt;(Encoding.UTF8.GetString(body));

                if (message != null)
                {
                    await NotifySubscribers(message);
                }
            };

            _channel.BasicConsume(queue: _queueName, autoAck: true, consumer: consumer);
        }

        private async Task NotifySubscribers(OrderUpdateMessage message)
        {
            var client = _httpClientFactory.CreateClient();

            var webhookPayload = new
            {
                orderId = message.OrderId,
                status = message.Status,
                updatedDate = message.UpdatedDate
            };

            var jsonPayload = JsonSerializer.Serialize(webhookPayload);
            var content = new StringContent(jsonPayload, Encoding.UTF8, &quot;application/json&quot;);

            foreach (var subscription in _subscriptionService.GetAllSubscriptions())
            {
                await client.PostAsync(subscription.WebhookUrl, content);
            }
        }
    }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Order</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Api</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Models</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">RabbitMQ</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Client</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Events</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">RabbitMQ</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Client</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">System</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Json</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">System</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Text</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Order</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Api</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Services</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">WebhookNotificationService</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">readonly</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">WebhookSubscriptionService</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_subscriptionService</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">readonly</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">IHttpClientFactory</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_httpClientFactory</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">readonly</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">IConnection</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_connection</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">readonly</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">IModel</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_channel</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_queueName</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;order_updated_queue&quot;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">WebhookNotificationService</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">WebhookSubscriptionService</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">subscriptionService</span><span style="color: #D4D4D4">, </span><span style="color: #4EC9B0">IHttpClientFactory</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">httpClientFactory</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">_subscriptionService</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">subscriptionService</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">_httpClientFactory</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">httpClientFactory</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">factory</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ConnectionFactory</span><span style="color: #D4D4D4">() { </span><span style="color: #9CDCFE">HostName</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;localhost&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">Port</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">5672</span><span style="color: #D4D4D4"> };</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">_connection</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">factory</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">CreateConnection</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">_channel</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">_connection</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">CreateModel</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">_channel</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">QueueDeclare</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">queue</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">_queueName</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">durable</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">exclusive</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">autoDelete</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">false</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">arguments</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Start</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">consumer</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">EventingBasicConsumer</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">_channel</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">consumer</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Received</span><span style="color: #D4D4D4"> += </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">model</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">ea</span><span style="color: #D4D4D4">) =&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">body</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">ea</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Body</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">ToArray</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">JsonSerializer</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Deserialize</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">OrderUpdateMessage</span><span style="color: #D4D4D4">&gt;(</span><span style="color: #9CDCFE">Encoding</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">UTF8</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetString</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">body</span><span style="color: #D4D4D4">));</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> (</span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4"> != </span><span style="color: #569CD6">null</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                {</span></span>
<span class="line"><span style="color: #D4D4D4">                    </span><span style="color: #569CD6">await</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">NotifySubscribers</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">                }</span></span>
<span class="line"><span style="color: #D4D4D4">            };</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">_channel</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">BasicConsume</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">queue</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">_queueName</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">autoAck</span><span style="color: #D4D4D4">: </span><span style="color: #569CD6">true</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">consumer</span><span style="color: #D4D4D4">: </span><span style="color: #9CDCFE">consumer</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Task</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">NotifySubscribers</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">OrderUpdateMessage</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">client</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">_httpClientFactory</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">CreateClient</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">webhookPayload</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">orderId</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">OrderId</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">status</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Status</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #9CDCFE">updatedDate</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">UpdatedDate</span></span>
<span class="line"><span style="color: #D4D4D4">            };</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">jsonPayload</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">JsonSerializer</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Serialize</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">webhookPayload</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">StringContent</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">jsonPayload</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">Encoding</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">UTF8</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;application/json&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">foreach</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">subscription</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">_subscriptionService</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetAllSubscriptions</span><span style="color: #D4D4D4">())</span></span>
<span class="line"><span style="color: #D4D4D4">            {</span></span>
<span class="line"><span style="color: #D4D4D4">                </span><span style="color: #569CD6">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">client</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">PostAsync</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">subscription</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">WebhookUrl</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">content</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            }</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">WebhookNotificationService imizin ayağa kalkması ve diğer injectionlar için Program.cs i aşağıdaki gibi düzenleyelim.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" data-code="var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpClient();
builder.Services.AddSingleton&lt;RabbitMqPublisher&gt;();
builder.Services.AddSingleton&lt;WebhookSubscriptionService&gt;();
builder.Services.AddSingleton&lt;WebhookNotificationService&gt;();

builder.Services.AddControllersWithViews();

var app = builder.Build();

// WebhookNotificationService'i başlat
var notificationService = app.Services.GetRequiredService&lt;WebhookNotificationService&gt;();
notificationService.Start();" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">builder</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">WebApplication</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">CreateBuilder</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">args</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">builder</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Services</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">AddHttpClient</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #9CDCFE">builder</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Services</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">AddSingleton</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">RabbitMqPublisher</span><span style="color: #D4D4D4">&gt;();</span></span>
<span class="line"><span style="color: #9CDCFE">builder</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Services</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">AddSingleton</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">WebhookSubscriptionService</span><span style="color: #D4D4D4">&gt;();</span></span>
<span class="line"><span style="color: #9CDCFE">builder</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Services</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">AddSingleton</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">WebhookNotificationService</span><span style="color: #D4D4D4">&gt;();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">builder</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Services</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">AddControllersWithViews</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">app</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">builder</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Build</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// WebhookNotificationService&#39;i başlat</span></span>
<span class="line"><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">notificationService</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">app</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Services</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">GetRequiredService</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">WebhookNotificationService</span><span style="color: #D4D4D4">&gt;();</span></span>
<span class="line"><span style="color: #9CDCFE">notificationService</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Start</span><span style="color: #D4D4D4">();</span></span></code></pre></div>



<p class="wp-block-paragraph">Order.Api tarafındaki geliştirmelerimizi bitirdik.</p>



<p class="wp-block-paragraph">Notification.Api tarafında ise NotificationController adında yeni bir controller açalım.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" data-code="using Microsoft.AspNetCore.Mvc;
using Notification.Api.Models;

namespace Notification.Api.Controllers
{
    [ApiController]
    [Route(&quot;api/[controller]&quot;)]
    public class NotificationController : Controller
    {
        private readonly ILogger&lt;NotificationController&gt; _logger;

        public NotificationController(ILogger&lt;NotificationController&gt; logger)
        {
            _logger = logger;
        }

        [Route(&quot;Send&quot;)]
        [HttpPost]
        public async Task&lt;IActionResult&gt; Send(OrderUpdateMessage message)
        {
            //Bildirim gönderim işlemleri.
            //await _notificationService.Send(message);

            Console.WriteLine(JsonConvert.SerializeObject(message));

            return Ok();
        }
    }
}" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Microsoft</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">AspNetCore</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Mvc</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #C586C0">using</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Notification</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Api</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Models</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">namespace</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Notification</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Api</span><span style="color: #D4D4D4">.</span><span style="color: #4EC9B0">Controllers</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #4EC9B0">ApiController</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #4EC9B0">Route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;api/[controller]&quot;</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">NotificationController</span><span style="color: #D4D4D4"> : </span><span style="color: #4EC9B0">Controller</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">readonly</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ILogger</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">NotificationController</span><span style="color: #D4D4D4">&gt; </span><span style="color: #9CDCFE">_logger</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">NotificationController</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">ILogger</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">NotificationController</span><span style="color: #D4D4D4">&gt; </span><span style="color: #9CDCFE">logger</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">_logger</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">logger</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">        [</span><span style="color: #4EC9B0">Route</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Send&quot;</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"><span style="color: #D4D4D4">        [</span><span style="color: #4EC9B0">HttpPost</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">Task</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">IActionResult</span><span style="color: #D4D4D4">&gt; </span><span style="color: #DCDCAA">Send</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">OrderUpdateMessage</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #6A9955">            //Bildirim gönderim işlemleri.</span></span>
<span class="line"><span style="color: #6A9955">            //await _notificationService.Send(message);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">Console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">WriteLine</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">JsonConvert</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">SerializeObject</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">message</span><span style="color: #D4D4D4">));</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">Ok</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span></code></pre></div>



<p class="wp-block-paragraph">Order.Api aracılığı ile subscribe olurken Notification.Api mizin ayağa kalktığı url ve send metodunun tetiklenmesini istediğimiz için url imizi ona göre kayıt ettireceğiz. 2 uygulamada da gerekli geliştirmeleri tamamladıktan sonra teste geçebiliriz.</p>



<p class="wp-block-paragraph"><strong>Test &#8211; Postman ekran görüntüleri:</strong></p>



<p class="wp-block-paragraph">2 projemizinde ayağa kalmasını istediğimiz için multiple startup ayarımızı, Solution&gt;Properties dan yapıyoruz.</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="788" height="550" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-2.png?resize=788%2C550&#038;ssl=1" alt="" class="wp-image-308" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-2.png?w=788&amp;ssl=1 788w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-2.png?resize=300%2C209&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-2.png?resize=768%2C536&amp;ssl=1 768w" sizes="auto, (max-width: 788px) 100vw, 788px" /></figure>



<p class="wp-block-paragraph">Projeleri ayağa kaldırdıktan sonra öncelikle Order.Api deki subscribe endpointine istek atıp, sipariş güncelleme işlemi yapıldığında bizi bilgilendirmesini istiyoruz.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="322" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-3.png?resize=1024%2C322&#038;ssl=1" alt="" class="wp-image-309" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-3.png?resize=1024%2C322&amp;ssl=1 1024w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-3.png?resize=300%2C94&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-3.png?resize=768%2C242&amp;ssl=1 768w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-3.png?w=1442&amp;ssl=1 1442w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Daha sonra sipariş güncelleme işlemi yapıyoruz.</p>



<figure class="wp-block-image size-large is-resized"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="286" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-1.png?resize=1024%2C286&#038;ssl=1" alt="" class="wp-image-307" style="width:840px;height:auto" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-1.png?resize=1024%2C286&amp;ssl=1 1024w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-1.png?resize=300%2C84&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-1.png?resize=768%2C214&amp;ssl=1 768w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-1.png?w=1451&amp;ssl=1 1451w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">RabbitMq da kuyruğumuz oluştu.</p>



<figure class="wp-block-image size-large"><img data-recalc-dims="1" loading="lazy" decoding="async" width="1024" height="401" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-4.png?resize=1024%2C401&#038;ssl=1" alt="" class="wp-image-310" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-4.png?resize=1024%2C401&amp;ssl=1 1024w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-4.png?resize=300%2C118&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-4.png?resize=768%2C301&amp;ssl=1 768w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-4.png?w=1057&amp;ssl=1 1057w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Ve Notification.Api mizin console ekranı:</p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="974" height="265" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-5.png?resize=974%2C265&#038;ssl=1" alt="" class="wp-image-311" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-5.png?w=974&amp;ssl=1 974w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-5.png?resize=300%2C82&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/08/image-5.png?resize=768%2C209&amp;ssl=1 768w" sizes="auto, (max-width: 974px) 100vw, 974px" /></figure>



<p class="wp-block-paragraph">Sonuç olarak; bu yazımızda temel bir webhook servisi oluşturmaya çalıştık. Proje kodlarına ve postman collection dosyasına <a href="https://github.com/sebahattint/WebhookExample">buradan</a> erişebilirsiniz.</p>



<p class="wp-block-paragraph">Yeni yazılarda görüşmek üzere !</p>
<p><a href="https://www.sebahattint.com/webhook-nedir/">Webhook Nedir?</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sebahattint.com/webhook-nedir/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Observability (Gözlemlenebilirlik) Nedir?</title>
		<link>https://www.sebahattint.com/observability-gozlemlenebilirlik-nedir/</link>
					<comments>https://www.sebahattint.com/observability-gozlemlenebilirlik-nedir/#respond</comments>
		
		<dc:creator><![CDATA[Sebahattin]]></dc:creator>
		<pubDate>Wed, 21 Aug 2024 20:29:12 +0000</pubDate>
				<category><![CDATA[DevOps]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[devops]]></category>
		<category><![CDATA[elk]]></category>
		<category><![CDATA[grafana]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[metrics]]></category>
		<category><![CDATA[monitoring]]></category>
		<category><![CDATA[observability]]></category>
		<category><![CDATA[observability nedir]]></category>
		<category><![CDATA[traces]]></category>
		<category><![CDATA[what is observability]]></category>
		<guid isPermaLink="false">https://www.sebahattint.com/?p=294</guid>

					<description><![CDATA[<p>Observability, özellikle dağıtık sistemler (distributed systems), mikroservis mimarileri (microservices architectures), bulut bilişim (cloud computing) ve DevOps alanlarını ilgilendirir. Bu konular, büyük ve karmaşık yazılım sistemlerinin izlenmesi, yönetilmesi ve optimize edilmesi&#8230;</p>
<p><a href="https://www.sebahattint.com/observability-gozlemlenebilirlik-nedir/">Observability (Gözlemlenebilirlik) Nedir?</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Observability, özellikle <strong>dağıtık sistemler</strong> (distributed systems), <strong>mikroservis mimarileri</strong> (microservices architectures), <strong>bulut bilişim</strong> (cloud computing) ve <strong>DevOps</strong> alanlarını ilgilendirir. Bu konular, büyük ve karmaşık yazılım sistemlerinin izlenmesi, yönetilmesi ve optimize edilmesi için observability kavramını ve araçlarını kullanır.</p>



<p class="wp-block-paragraph">Observability, uygulamalarımızın production ortamında durumlarını izlemeyebilme yeteneğidir. Uygulamalarımızın performansını, hatalarını ve genel durumunu izlemememize olanak tanır. Observability <strong>loglar (logs)</strong>, <strong>metrikler (metrics)</strong> ve <strong>izler (traces)</strong> olmak üzere 3 temel bileşenden oluşur. </p>



<ol class="wp-block-list">
<li><strong>Loglar (Logs)</strong><br>Loglar, sistemin çalıştığı sırada neler olup bittiğini, hangi işlemlerin yapıldığını ve olası hataları göstermek için kullanılır. Loglar, bir sorunun nedenini anlamak ve teşhis etmek için çok önemlidir.<br></li>



<li><strong>Metrikler (Metrics)</strong><br>Metrikler, bir sistemin performansını ölçmek için kullanılan sayısal verilerdir. Bu veriler, CPU kullanımı, bellek kullanımı, istek/saniye (requests per second), hata oranı gibi çeşitli ölçütleri içerir. Metrikler, sistemin genel sağlığı hakkında bilgi verir ve performans sorunlarını tespit etmeye yardımcı olur.<br></li>



<li><strong>Traces (İzler)</strong><br>Traces, bir operasyonun baştan sonra izlenmesidir. Dağıtık sistemlerde, bir kullanıcı isteğinin işlenme sürecini anlamak zordur. Bu yüzden trace data, isteğin başlangıcından sonuna kadar olan süreci izlemeye yardımcı olur. Trace data, özellikle mikro servis mimarilerinde, bir isteğin hangi servislerde nasıl işlediğini anlamak için kullanılır.</li>
</ol>



<h3 class="wp-block-heading"><strong>Observability&#8217;nin Faydaları</strong></h3>



<ul class="wp-block-list">
<li><strong>Karmaşık Sistemlerde Görünürlük:</strong> Modern uygulamalar genellikle mikro servisler, konteynerler ve bulut tabanlı mimariler gibi karmaşık yapılara sahiptir. Observability, bu karmaşık sistemlerin nasıl çalıştığını anlamayı kolaylaştırır.</li>



<li><strong>Sorunları Hızlı Teşhis Etme:</strong> Observability, sistemdeki anormallikleri ve hataları hızlı bir şekilde tespit etmemizi sağlar. Bu sayede, sorunlar meydana geldiğinde hızlı müdahale edilerek sistemin kesinti süresi en aza indirilir.</li>



<li><strong>Proaktif İzleme:</strong> İyi bir Observability uygulaması, potansiyel sorunları meydana gelmeden önce tespit etmeye yardımcı olur. Bu, sistemin daha stabil ve güvenilir çalışmasını sağlar.</li>



<li><strong>İyileştirilmiş Kullanıcı Deneyimi:</strong> Observability, kullanıcıların deneyimini olumsuz etkileyebilecek performans sorunlarını tespit etmeyi ve düzeltmeyi sağlar. Bu da genel kullanıcı memnuniyetini artırır.</li>
</ul>



<h3 class="wp-block-heading"><strong>Observability Araçları ve Teknolojileri</strong></h3>



<p class="wp-block-paragraph">Observability&#8217;yi uygulamak için çeşitli araçlar ve teknolojiler kullanılır:</p>



<ul class="wp-block-list">
<li><strong>Prometheus ve Grafana:</strong> Prometheus, metrik verilerini toplamak ve izlemek için kullanılan popüler bir araçtır. Grafana ise bu metrikleri görselleştirmek ve izlemek için kullanılan bir platformdur.</li>



<li><strong>ELK Stack (Elasticsearch, Logstash, Kibana):</strong> Bu araç seti, log yönetimi ve analizi için yaygın olarak kullanılır. Elasticsearch, büyük miktarda log verisini depolamak için kullanılırken, Logstash bu verileri toplar ve işler, Kibana ise görselleştirme sağlar.</li>



<li><strong>Jaeger ve Zipkin:</strong> Jaeger ve Zipkin, dağıtık izleme için kullanılan araçlardır. Bu araçlar, mikro hizmetler arasında geçen işlemleri izleyerek, performans sorunlarını tespit etmeye yardımcı olur.</li>
</ul>



<h3 class="wp-block-heading"><strong>Observability ve Monitoring Arasındaki Fark</strong></h3>



<p class="wp-block-paragraph">Monitoring ve Observability terimleri bazen birbirinin yerine kullanılsa da, aslında farklı kavramlardır:</p>



<ul class="wp-block-list">
<li><strong>Monitoring:</strong> Monitoring, belirli metrikleri ve logları önceden belirlenmiş eşiklere göre izlemeyi ifade eder. Örneğin, sistemdeki oluşan 500 hataları  ile ilgili bir uyarı tetiklenebilir.</li>



<li><strong>Observability:</strong> Observability, monitoring&#8217;in ötesine geçerek, sistemin genel durumu hakkında daha detaylı bilgi sağlar. Observability, bir sistemdeki beklenmedik sorunları anlamak ve teşhis etmek için gerekli olan verileri sunar.</li>
</ul>



<p class="wp-block-paragraph"><strong>Faydalandığım linkler:</strong><br><a href="https://www.honeycomb.io/blog/what-is-observability-key-components-best-practices">https://www.honeycomb.io/blog/what-is-observability-key-components-best-practices</a><br><a href="https://www.linkedin.com/pulse/observability-vs-monitoring-g%C3%BCrkan-t%C3%BCzmen/">https://www.linkedin.com/pulse/observability-vs-monitoring-g%C3%BCrkan-t%C3%BCzmen/</a></p>



<p class="wp-block-paragraph">Yeni yazılarda görüşmek üzere <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>



<p class="wp-block-paragraph"></p>
<p><a href="https://www.sebahattint.com/observability-gozlemlenebilirlik-nedir/">Observability (Gözlemlenebilirlik) Nedir?</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sebahattint.com/observability-gozlemlenebilirlik-nedir/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>.Net Core Channels Nedir?</title>
		<link>https://www.sebahattint.com/net-core-channels-nedir/</link>
					<comments>https://www.sebahattint.com/net-core-channels-nedir/#respond</comments>
		
		<dc:creator><![CDATA[Sebahattin]]></dc:creator>
		<pubDate>Fri, 05 Jul 2024 17:49:12 +0000</pubDate>
				<category><![CDATA[C Sharp (C#)]]></category>
		<category><![CDATA[.net channels]]></category>
		<category><![CDATA[.net core channels]]></category>
		<guid isPermaLink="false">https://www.sebahattint.com/?p=192</guid>

					<description><![CDATA[<p>System.Threading.Channels altında bulunan ve .Net Core 3.0 itibariyle hayatımıza girmiş olan bir özelliktir. Özellikle çoklu thread ortamlarında verinin thread &#8216;ler arası güvenli bir şekilde iletilmesini ve işlenmesi sağlar. Gerektiğinde ideal&#8230;</p>
<p><a href="https://www.sebahattint.com/net-core-channels-nedir/">.Net Core Channels Nedir?</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">System.Threading.Channels altında bulunan ve .Net Core 3.0 itibariyle hayatımıza girmiş olan bir özelliktir. Özellikle çoklu thread ortamlarında verinin thread &#8216;ler arası güvenli bir şekilde iletilmesini ve işlenmesi sağlar. Gerektiğinde ideal bir çözüm olarak tercih edebilirsiniz.</p>



<h3 class="wp-block-heading">Channels API Özellikleri</h3>



<ol class="wp-block-list">
<li><strong>İki Ana Kanal Türü</strong>:
<ul class="wp-block-list">
<li><strong>UnboundedChannel</strong>: Kapasitesi sınırsız olan bir kanaldır. Herhangi bir veri miktarını kabul eder.</li>



<li><strong>BoundedChannel</strong>: Belirli bir kapasiteye sahip olan bir kanaldır. Maksimum kapasiteye ulaştığında Producer&#8217;lar bekletilir.</li>
</ul>
</li>



<li><strong>Asenkron İletişim</strong>: Channels API, async/await desenini destekler. </li>



<li><strong>Backpressure Desteği</strong>: BoundedChannel kullanarak, Consumer yetişemediğinde Producer &#8216;ın durdurulmasını sağlar. Bu, sistemin aşırı yüklenmesini engeller.</li>



<li><strong>Thread-Safe</strong>: Channels, çoklu thread ortamında güvenli bir şekilde çalışacak şekilde tasarlanmıştır. Bu sayede birden fazla Producer ve Consumer aynı kanalı kullanabilir.</li>
</ol>



<h3 class="wp-block-heading">Kullanıma Örnek</h3>



<ul class="wp-block-list">
<li><strong>Producer-Consumer Deseni</strong>: Örneğin, bir veri işleme hattında bir thread veri üretirken, başka bir thread bu veriyi işleyebilir.</li>
</ul>



<h3 class="wp-block-heading">Örnek Kod</h3>



<p class="wp-block-paragraph">Aşağıda basit bir UnboundedChannel örneği bulunmaktadır, yeni bir Console App oluşturarak uygulamayı test edebilirsiniz.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:1.125rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * 1.125rem);line-height:1.625rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7">C#</span><span role="button" tabindex="0" data-code="var userDataChannel = Channel.CreateUnbounded&lt;UserModel&gt;();

// Producer Task
var producer = Task.Run(async () =&gt;
{
    for (int i = 0; i &lt; 10; i++)
    {
        await userDataChannel.Writer.WriteAsync(new UserModel() { Id = i, Name = &quot;User_&quot; + i });
        Console.WriteLine($&quot;=========================&quot;);
        Console.WriteLine($&quot;Produced: User_{i}&quot;);
    }
    userDataChannel.Writer.Complete();
});

// Consumer Task
var consumer = Task.Run(async () =&gt;
{
    await foreach (var userModel in userDataChannel.Reader.ReadAllAsync())
    {
        Console.WriteLine($&quot;=========================&quot;);
        Console.WriteLine($&quot;Consumed: {userModel.Id}&quot;);
        Console.WriteLine($&quot;Consumed: {userModel.Name}&quot;);
    }
});

Task.WhenAll(producer, consumer);" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">userDataChannel</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">Channel</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">CreateUnbounded</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">UserModel</span><span style="color: #D4D4D4">&gt;();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// Producer Task</span></span>
<span class="line"><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">producer</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">Task</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Run</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> () =&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">++)</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">await</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">userDataChannel</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Writer</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">WriteAsync</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">UserModel</span><span style="color: #D4D4D4">() { </span><span style="color: #9CDCFE">Id</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">Name</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">&quot;User_&quot;</span><span style="color: #D4D4D4"> + </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> });</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">Console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">WriteLine</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">$&quot;=========================&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">Console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">WriteLine</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">$&quot;Produced: User_{</span><span style="color: #9CDCFE">i</span><span style="color: #CE9178">}&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #9CDCFE">userDataChannel</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Writer</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Complete</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// Consumer Task</span></span>
<span class="line"><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">consumer</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">Task</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Run</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">async</span><span style="color: #D4D4D4"> () =&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">await</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">foreach</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">userModel</span><span style="color: #D4D4D4"> </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">userDataChannel</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Reader</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">ReadAllAsync</span><span style="color: #D4D4D4">())</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">Console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">WriteLine</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">$&quot;=========================&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">Console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">WriteLine</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">$&quot;Consumed: {</span><span style="color: #9CDCFE">userModel</span><span style="color: #CE9178">.</span><span style="color: #9CDCFE">Id</span><span style="color: #CE9178">}&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">Console</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">WriteLine</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">$&quot;Consumed: {</span><span style="color: #9CDCFE">userModel</span><span style="color: #CE9178">.</span><span style="color: #9CDCFE">Name</span><span style="color: #CE9178">}&quot;</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"><span style="color: #D4D4D4">});</span></span>
<span class="line"></span>
<span class="line"><span style="color: #9CDCFE">Task</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">WhenAll</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">producer</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">consumer</span><span style="color: #D4D4D4">);</span></span></code></pre></div>



<p class="wp-block-paragraph">Çıktı: </p>



<figure class="wp-block-image size-full"><img data-recalc-dims="1" loading="lazy" decoding="async" width="969" height="502" src="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/07/image.png?resize=969%2C502&#038;ssl=1" alt=".Net Core Channels" class="wp-image-281" srcset="https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/07/image.png?w=969&amp;ssl=1 969w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/07/image.png?resize=300%2C155&amp;ssl=1 300w, https://i0.wp.com/www.sebahattint.com/wp-content/uploads/2024/07/image.png?resize=768%2C398&amp;ssl=1 768w" sizes="auto, (max-width: 969px) 100vw, 969px" /></figure>



<p class="wp-block-paragraph">Bu örnekte, UserModel alan bir channels oluşturduk ve produce ettik. Consumer tarafında da eş zamanlı olarak veriyi tükettik ve ekrana bastık. Buradaki kullanımları projenize göre şekillendirebilir, Producer ve Consumer kısımlarını ayrı ayrı class lara taşıyıp daha kullanılabilir bir yapı kurgulayabilirsiniz.</p>



<p class="wp-block-paragraph">Faydalandığım linkler:<br><a href="https://learn.microsoft.com/en-us/dotnet/core/extensions/channels">https://learn.microsoft.com/en-us/dotnet/core/extensions/channels</a><br><a href="https://code-maze.com/dotnet-producer-consumer-channels/">https://code-maze.com/dotnet-producer-consumer-channels/</a></p>



<p class="wp-block-paragraph">Yeni bir yazıda görüşmek üzere <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p><a href="https://www.sebahattint.com/net-core-channels-nedir/">.Net Core Channels Nedir?</a> yazısı ilk önce <a href="https://www.sebahattint.com">Sebahattin Tonbul | Blog</a> üzerinde ortaya çıktı.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.sebahattint.com/net-core-channels-nedir/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
