﻿
{"id":28131,"date":"2025-11-11T19:18:00","date_gmt":"2025-11-11T19:18:00","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=28131"},"modified":"2025-11-11T19:18:00","modified_gmt":"2025-11-11T19:18:00","slug":"kubernetes-keda-ile-queue-uzunluguna-gore-consumer-deploymenti-otomatik-olceklendirme","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/kubernetes-keda-ile-queue-uzunluguna-gore-consumer-deploymenti-otomatik-olceklendirme\/","title":{"rendered":"Kubernetes | KEDA \u0130le Queue Uzunlu\u011funa G\u00f6re Consumer Deployment&#8217;\u0131 Otomatik \u00d6l\u00e7eklendirme"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/keda.webp\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/keda.webp\" alt=\"Kubernetes | KEDA \u0130le Queue Uzunlu\u011funa G\u00f6re Consumer Deployment&#039;\u0131 Otomatik \u00d6l\u00e7eklendirme\" width=\"720\" height=\"405\" class=\"aligncenter size-full wp-image-28164\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/keda.webp 720w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/keda-300x169.webp 300w\" sizes=\"auto, (max-width: 720px) 100vw, 720px\" \/><\/a>Merhaba,<\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn cloud-native mimarilerinde \u00f6l\u00e7eklenebilirlik yaln\u0131zca sistem performans\u0131n\u0131n de\u011fil, ayn\u0131 zamanda operasyonel verimlili\u011fin de belirleyici fakt\u00f6rlerinden birisidir. \u00d6zellikle microservice yap\u0131lar\u0131nda, her bile\u015fenin farkl\u0131 y\u00fck profillerine sahip olmas\u0131; yatay \u00f6l\u00e7eklemenin dinamik, esnek ve ak\u0131ll\u0131 mekanizmalarla y\u00fcr\u00fct\u00fclmesini zorunlu k\u0131lmaktad\u0131r.<\/p>\n<p>Bu ba\u011flamda, mesaj tabanl\u0131 sistemler (message-driven architectures) ayr\u0131 bir dikkat gerektirmektedir. Bir RabbitMQ kuyru\u011funa saniyeler i\u00e7inde binlerce mesaj\u0131n akmas\u0131, ancak belirli bir vade yo\u011funluk olduktan ve duraksama ya\u015fand\u0131ktan sonras\u0131nda trafi\u011fin s\u0131f\u0131rlanmas\u0131 s\u0131k rastlanan bir durumdur. Haliyle kuyruklardaki y\u00fck genellikle sabit de\u011fil, dalgal\u0131d\u0131r. Bu kadar de\u011fi\u015fken bir y\u00fck alt\u0131nda, yaln\u0131zca CPU ya da bellek kullan\u0131m\u0131na dayal\u0131 klasik Kubernetes \u00f6l\u00e7ekleme modelleri <span style=\"font-size: 12px;\">(\u00f6rne\u011fin; HPA \u2014 Horizontal Pod Autoscaler)<\/span> \u00e7o\u011fu zaman yetersiz kalmaktad\u0131r. \u00c7\u00fcnk\u00fc sistemin ger\u00e7ekte ne kadar y\u00fck alt\u0131nda oldu\u011funu anlaman\u0131n yolu CPU&#8217;da de\u011fil, kuyruktaki mesaj say\u0131s\u0131nda (queue length) gizlidir.<\/p>\n<p>Tam da bu noktada KEDA (Kubernetes Event-Driven Autoscaler) devreye girmektedir. KEDA, Kubernetes&#8217;e olay g\u00fcd\u00fcml\u00fc bir \u00f6l\u00e7ekleme yetene\u011fi kazand\u0131rarak, uygulamalar\u0131n do\u011frudan i\u015f y\u00fck\u00fc metriklerine <span style=\"font-size: 12px;\">(\u00f6rne\u011fin; bir RabbitMQ kuyru\u011fundaki mesaj say\u0131s\u0131na)<\/span> tepki vermesini sa\u011flamaktad\u0131r. Bu sayede sistemler yaln\u0131zca kaynak kullan\u0131m\u0131na de\u011fil, i\u015fin kendisine <em>-yani olay\u0131n hacmine-<\/em> duyarl\u0131 hale gelmektedir.<\/p>\n<p>Bu i\u00e7eri\u011fimizde, Kubernetes \u00fczerinde KEDA kullanarak bir RabbitMQ message broker&#8217;\u0131 ile haberle\u015fen .NET consumer servisinin kuyruk uzunlu\u011funa g\u00f6re otomatik \u00f6l\u00e7eklenmesini ele alacak ve bir yandan teorik temelleri a\u00e7\u0131klarken bir yandan da pratikte uygulanabilir bir mimari \u00f6rne\u011fi sunmaya \u00e7al\u0131\u015faca\u011f\u0131z.<\/p>\n<p>O halde buyurun ba\u015flayal\u0131m&#8230;<\/p>\n<h3>KEDA&#8217;n\u0131n Amac\u0131 ve \u00c7\u0131k\u0131\u015f Noktas\u0131<\/h3>\n<blockquote><p><em style=\"color: gray;\">KEDA, Kubernetes&#8217;e mesaj kuyru\u011fundaki ger\u00e7ek y\u00fck\u00fc g\u00f6rme yetene\u011fi kazand\u0131ran \u00f6nemli bir bile\u015fendir.<\/em><\/p><\/blockquote>\n<p>Kubernetes&#8217;in yerle\u015fik otomatik \u00f6l\u00e7ekleyicisi olan HPA (Horizontal Pod Autoscaler) yaln\u0131zca CPU veya bellek gibi metrikleri izlemekte ancak microservice tabanl\u0131 sistemlerde y\u00fck her zaman bu kaynaklara do\u011frudan yans\u0131mayaca\u011f\u0131 i\u00e7in kimi kritik durumlarda pek ihtiyac\u0131m\u0131z\u0131 kar\u015f\u0131layamamakta ve \u00f6nceki sat\u0131rlarda belirtti\u011fimiz gibi ister istemez yetersiz kalmaktad\u0131r. Bizler bunu message broker kulland\u0131\u011f\u0131m\u0131z senaryolarda yer yer tecr\u00fcbe etti\u011fimizi s\u00f6ylebiliriz. Misal olarak; RabbitMQ kullan\u0131lan kimi \u00e7al\u0131\u015fmalarda queue&#8217;da binlerce mesaj\u0131n birikti\u011fini amma velakin consumer&#8217;lar\u0131n CPU&#8217;sunun bo\u015fta oldu\u011funu muhtemelen g\u00f6rm\u00fc\u015fs\u00fcn\u00fczd\u00fcr. \u0130\u015fte b\u00f6yle durumlarda HPA, kendisinden beklenen \u00f6l\u00e7eklendirmeyi ger\u00e7ekle\u015ftirememekte ve g\u00fcn\u00fcn sonunda maliyet t\u00fcm faturas\u0131yla sistemin geneline ve hatta daha da k\u00f6t\u00fcs\u00fc son kullan\u0131c\u0131ya kadar yans\u0131t\u0131labilmektedir.<\/p>\n<p>Benzer mant\u0131kla, e-ticaret sistemlerinde yeni \u00fcr\u00fcn y\u00fcklemeleri yap\u0131ld\u0131\u011f\u0131 taktirde aniden binlerce &#8216;update&#8217; mesaj\u0131 g\u00f6nderilmek istendi\u011fi durumlarda sistem birka\u00e7 dakika i\u00e7inde t\u00fcm g\u00fcncellemeleri i\u015fleyerek, k\u0131sa s\u00fcre sonra sessizli\u011fe b\u00fcr\u00fcnebilmektedir. Yani sanki hi\u00e7 \u00e7al\u0131\u015fma olmam\u0131\u015f gibi CPU&#8217;da bir dalgalanma s\u00f6z konusu olmayacak ve esas\u0131nda kuyruk bir s\u00fcreli\u011fine \u015fi\u015fmi\u015f olaca\u011f\u0131ndan, o k\u0131s\u0131r s\u00fcrede HPA \u00f6l\u00e7eklendirme g\u00f6revini yerine getiremeyecektir.<\/p>\n<p>Bir ba\u015fka \u00f6rne\u011fi de zaman\u0131nda \u00fczerinde \u00e7al\u0131\u015ft\u0131\u011f\u0131m video i\u015fleme uygulamas\u0131ndan vermek istiyorum. Kullan\u0131c\u0131lar taraf\u0131ndan yap\u0131lan video y\u00fcklemeleri neticesinde, sistem farkl\u0131 bir serviste bu videolar\u0131 istekler do\u011frultusunda i\u015fleyerek filigran e\u015fli\u011finde indirilmek \u00fczere panele d\u00fc\u015f\u00fcrmekteydi. Nedendir bilinmez&#8230; Kimi zaman dakikalar i\u00e7erisinde onlarca video y\u00fckleniyor, ard\u0131ndan saatlerce hi\u00e7 y\u00fckleme olmuyordu. Evet, b\u00f6yle bir durumda da CPU hep sabit metrik sunmaktayd\u0131. \u0130\u015fte bu senaryoda da HPA ile \u00f6l\u00e7eklendirme s\u00f6z konusu olmayacak, sistem o k\u0131sa aral\u0131kta t\u00fcm y\u00fck\u00fc tek bir instance \u00fczerine y\u00fckleyerek belki o an\u0131 darbo\u011faz bir vaziyette ge\u00e7irmi\u015f olacakt\u0131r.<\/p>\n<p>Bunlar gibi t\u00fcrl\u00fc senaryolardan anlayaca\u011f\u0131m\u0131z \u00fczere i\u015f y\u00fck\u00fc durumu genellikle do\u011frudan CPU&#8217;ya yans\u0131m\u0131yor olsa da kuyruk uzunlu\u011fu gibi ba\u015fka bir g\u00f6sterge noktas\u0131nda kendini belli etmektedir. Bizler de, uygulamalar\u0131n davran\u0131\u015flar\u0131na dair daha farkl\u0131 ve spesifik metriklere g\u00f6re bir \u00f6l\u00e7eklendirme ihtiyac\u0131n\u0131 elzem g\u00f6rmekteyiz. Bunun i\u00e7in de KEDA imdad\u0131m\u0131za yeti\u015fmekte, CPU d\u0131\u015f\u0131 uygulama \u00f6zel metriklerine g\u00f6re sistemi \u00f6l\u00e7eklendirebilmemizi sa\u011flayan olduk\u00e7a kritik bir bile\u015fen olarak kar\u015f\u0131m\u0131za \u00e7\u0131kmaktad\u0131r.<\/p>\n<blockquote><p><em style=\"color: green; font-size: 14px;\">KEDA, esas\u0131nda Kubernetes ekosisteminde &#8216;event-driven autoscaling&#8217; (olay g\u00fcd\u00fcml\u00fc otomatik \u00f6l\u00e7ekleme) sa\u011flayan open source bir bile\u015fendir. \u00d6l\u00e7eklendirmeyi, CPU ya da bellek kullan\u0131m\u0131na g\u00f6re de\u011fil, uygulaman\u0131n i\u015f y\u00fck\u00fcyle ilgili olan kuyru\u011fa gelen mesaj say\u0131s\u0131 gibi olaylara g\u00f6re ger\u00e7ekle\u015ftirmekte ve Pod say\u0131s\u0131n\u0131 dinamik bi\u00e7imde ayarlayarak otomatik hale getirmektedir.<\/em><\/p><\/blockquote>\n<h4>KEDA&#8217;n\u0131n Temel Bile\u015fenleri Nelerdir?<\/h4>\n<p>KEDA yap\u0131sal olarak Operator (Controller), Metrics Adapter ve Scaler olmak \u00fczere \u00fc\u00e7 ana bile\u015fenden olu\u015fmaktad\u0131r;<\/p>\n<table style=\"border-collapse: collapse; max-width: 900px; margin: auto; border: 1px solid #e0a500; font-family: 'Segoe UI',Arial,sans-serif; font-size: 14px;\">\n<thead>\n<tr>\n<th style=\"border: 1px solid #e0a500;\" colspan=\"2\">Operator (Controller)<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 13px; line-height: 17px; vertical-align: text-top; background-color: #fffdf7; border: 1px solid #e0a500;\" colspan=\"2\">Kubernetes API&#8217;siyle entegre \u00e7al\u0131\u015fan bile\u015fendir. <code style=\"color: orange;\">ScaledObject<\/code> ve <code style=\"color: orange;\">ScaledJob<\/code> t\u00fcr\u00fcnden nesneleri izlemektedir. Bu nesneler, KEDA&#8217;n\u0131n temel bile\u015fenleri olarak kabul edilmektedir.<\/p>\n<p>Bu bile\u015fenler, KEDA&#8217;n\u0131n Kubernetes&#8217;e \u00f6zel <em>Custom Resource Definitions (CRD&#8217;leri)<\/em> olup, olay kaynaklar\u0131n\u0131 (\u00f6rne\u011fin; kuyruk uzunlu\u011fu veya mesaj say\u0131s\u0131 gibi) Kubernetes i\u015f y\u00fckleriyle e\u015fle\u015ftirerek \u00f6l\u00e7eklendirme kurallar\u0131n\u0131 tan\u0131mlamaktad\u0131rlar.<\/p>\n<p>Ve bir yandan bu bile\u015fenler, Horizontal Pod Autoscaler (HPA) ile entegre \u00e7al\u0131\u015fmakta ve KEDA&#8217;n\u0131n olay tabanl\u0131 \u00f6l\u00e7eklendirme \u00e7ekirde\u011fini olu\u015fturmaktad\u0131rlar.<\/p>\n<p>A\u015fa\u011f\u0131daki bu iki bile\u015feni detayl\u0131 bir \u015fekilde a\u00e7\u0131klayal\u0131m;<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 13px; line-height: 17px; text-align: justify; vertical-align: text-top; width: 50%; background-color: #fffdf7; border: 1px solid #e0a500;\">\n<ul>\n<li><strong><em>ScaledObject<\/em><\/strong><br \/>\nScaledObject, bir olay kayna\u011f\u0131 (event source) ile Kubernetes&#8217;te \u00e7al\u0131\u015fan s\u00fcrekli i\u015f y\u00fcklerini (Deployment, StatefulSet veya Custom Resource) ba\u011flayan bir kaynakt\u0131r. Bu sayede, mesaj kuyru\u011funda bekleyen \u00f6\u011fe say\u0131s\u0131 gibi olay metriklerine g\u00f6re Pod&#8217;lar\u0131n yatay \u00f6l\u00e7eklendirilmesini sa\u011flamaktad\u0131r. Ayr\u0131ca \u00f6l\u00e7eklendirmeyi s\u0131f\u0131r Pod&#8217;a kadar indirebilmekte (scale to zero) ve b\u00f6ylece kaynak tasarrufunu maksimize edebilmektedir.<em><u>Nas\u0131l \u00e7al\u0131\u015f\u0131r?<\/u><\/em><br \/>\nBir ScaledObject tan\u0131mland\u0131\u011f\u0131nda, belirli bir trigger ayarlan\u0131r ve bu trigger, scalers arac\u0131l\u0131\u011f\u0131yla olay kayna\u011f\u0131ndan metrikleri \u00e7eker. Metrikler, HPA&#8217;ya iletilir ve Pod say\u0131s\u0131 otomatik olarak ayarlan\u0131r.<\/p>\n<p><em><u>Avantajlar\u0131 nelerdir?<\/u><\/em><br \/>\nS\u00fcrekli \u00e7al\u0131\u015fan uygulamalar i\u00e7in olduk\u00e7a idealdir. \u00d6l\u00e7eklendirme kurallar\u0131n\u0131 esnek bir \u015fekilde yap\u0131land\u0131rabilir. Ayr\u0131ca authentication i\u00e7in <code>TriggerAuthentication<\/code> CRD&#8217;sini kullan\u0131r.<\/p>\n<p><em><u>\u00d6rnek yap\u0131land\u0131rma<\/u><\/em><\/p>\n<div style=\"font-size: 12px; width: 300px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napiVersion: keda.sh\/v1alpha1\r\nkind: ScaledObject\r\nmetadata:\r\n  name: rabbitmq-scaledobject\r\nspec:\r\n  scaleTargetRef:\r\n    name: my-deployment\r\n  triggers:\r\n  - type: rabbitmq\r\n    metadata:\r\n      queueName: my-queue\r\n      queueLength: &quot;10&quot;  # \u00d6l\u00e7eklendirme e\u015fi\u011fi\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki yap\u0131land\u0131rmay\u0131 incelerseniz e\u011fer RabbitMQ kuyru\u011fundaki mesaj say\u0131s\u0131na g\u00f6re <em>scaleTargetRef<\/em> alan\u0131nda belirtilmi\u015f olan <code>my-deployment<\/code> isimli Deployment \u00f6l\u00e7eklendirilmektedir.<\/p>\n<p><em>triggers<\/em> alan\u0131na g\u00f6z atarsan\u0131z e\u011fer <em>metadata<\/em> alan\u0131ndaki <em>queueName<\/em>&#8216;e kar\u015f\u0131l\u0131k verilmi\u015f olan <code>my-queue<\/code> de\u011feri, \u00f6l\u00e7eklendirme s\u00fcrecinde takip edilecek kuyruk ad\u0131na kar\u015f\u0131l\u0131k gelmekte ve <em>queueLength<\/em> de\u011feriyle de \u00f6l\u00e7eklendirme e\u015fi\u011fi belirlenmektedir.<\/p>\n<p>Bunlar\u0131n d\u0131\u015f\u0131nda a\u015fa\u011f\u0131daki gibi <em>minReplicaCount<\/em> ve <em>maxReplicaCount<\/em> alanlar\u0131 ile minimum ve maksimum Pod say\u0131lar\u0131n\u0131 ayarlayabilir ve <em>pollingInterval<\/em> alan\u0131 ile de KEDA&#8217;n\u0131n ne s\u0131kl\u0131kla kuyru\u011fu kontrol etmesi gerekti\u011fini saniye cinsinden belirleyebilirsiniz.<\/p>\n<div style=\"font-size: 12px; width: 300px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\nspec:\r\n  scaleTargetRef:\r\n    name: my-worker-app\r\n  minReplicaCount: 0        # En az 0 pod (scale-to-zero)\r\n  maxReplicaCount: 10       # En fazla 10 pod\r\n  pollingInterval: 15       # Her 15 saniyede kuyru\u011fu kontrol et\r\n<\/pre>\n<\/div>\n<p><em><u>KEDA&#8217;n\u0131n \u00e7al\u0131\u015fma form\u00fcl\u00fc nas\u0131ld\u0131r?<\/u><\/em><br \/>\nKEDA Pod say\u0131lar\u0131n\u0131 \u00f6l\u00e7eklendirirken \u015fu form\u00fcl\u00fc kullanmaktad\u0131r;<br \/>\n<code>Pod Say\u0131s\u0131=ceil(Kuyruk Uzunlu\u011fu\/queueLength)<\/code><\/li>\n<\/ul>\n<\/td>\n<td style=\"font-size: 13px; line-height: 17px; text-align: justify; vertical-align: text-top; background-color: #fffdf7; border: 1px solid #e0a500;\">\n<ul>\n<li><strong><em>ScaledJob<\/em><\/strong><br \/>\nScaledJob ise olay tabanl\u0131 \u00f6l\u00e7eklendirme i\u00e7in Kubernetes Job&#8217;lar\u0131n\u0131 (k\u0131sa s\u00fcreli, tamamland\u0131ktan sonra sonlanan i\u015fler) hedefler. ScaledObject&#8217;ten farkl\u0131 olarak, her olay i\u00e7in yeni bir Job \u00f6rne\u011fi olu\u015fturur ve \u00f6l\u00e7eklendirmeyi i\u015f tabanl\u0131 ger\u00e7ekle\u015ftirir.<em><u>Nas\u0131l \u00e7al\u0131\u015f\u0131r?<\/u><\/em><br \/>\nOlay kayna\u011f\u0131 tetiklendi\u011finde (\u00f6rne\u011fin; bir Azure Event Hub&#8217;dan yeni olaylar geldi\u011finde), ScaledJob otomatik olarak paralel Job&#8217;lar olu\u015fturur ve i\u015f tamamland\u0131\u011f\u0131nda, kaynaklar serbest b\u0131rak\u0131larak, nihayetinde serverless bir davran\u0131\u015f sa\u011flanm\u0131\u015f olur.<\/p>\n<p><em><u>Avantajlar\u0131 nelerdir?<\/u><\/em><br \/>\nK\u0131sa s\u00fcreli i\u015fler i\u00e7in idealdir. Kaynaklar\u0131 verimli kullan\u0131r ve scale-to-zero&#8217;yu destekler. Ve yine <code>TriggerAuthentication<\/code> ile entegre olabilmektedir.<br \/>\n<em><u>\u00d6rnek yap\u0131land\u0131rma<\/u><\/em><\/p>\n<div style=\"font-size: 12px; width: 300px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napiVersion: keda.sh\/v1alpha1\r\nkind: ScaledJob\r\nmetadata:\r\n  name: kafka-scaledjob\r\nspec:\r\n  jobTargetRef:\r\n    template:\r\n      spec:\r\n        containers:\r\n        - name: processor\r\n          image: my-processor:latest\r\n  triggers:\r\n  - type: kafka\r\n    metadata:\r\n      topic: my-topic\r\n      lagThreshold: &quot;100&quot;  # Gecikme e\u015fi\u011fi\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki yap\u0131land\u0131rmaya da g\u00f6z atarsan\u0131z; <em>type: kafka<\/em> ile \u00f6l\u00e7\u00fcm kayna\u011f\u0131n\u0131n Apache Kafka oldu\u011funu, <em>topic: my-topic<\/em> ile de izlenen Kafka topic&#8217;ini g\u00f6rmektesiniz. Ve en \u00f6nemlisi <em>jobTargetRef.template<\/em> alan\u0131nda her tetikleme i\u00e7in kullan\u0131lacak Job \u015fablonu belirlenmi\u015ftir.<\/p>\n<p><em><u>KEDA&#8217;n\u0131n \u00e7al\u0131\u015fma form\u00fcl\u00fc nas\u0131ld\u0131r?<\/u><\/em><br \/>\n<code>Job Say\u0131s\u0131=floor(Consumer Lag\/lagThreshold)<\/code><\/p>\n<blockquote><p><em>Sunucusuz (serverless) benzeri davran\u0131\u015f:<br \/>\nMesaj geldik\u00e7e Job ba\u015flar, biter, kaynak bo\u015fal\u0131r.<\/em><\/p><\/blockquote>\n<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"font-size: 13px; line-height: 17px; vertical-align: text-top; background-color: #fffdf7; border: 1px solid #e0a500;\" colspan=\"2\">\u00d6zetlersek e\u011fer;ScaledObject, s\u00fcrekli \u00e7al\u0131\u015fan Deployment&#8217;\u0131 \u00f6l\u00e7eklerken, ScaledJob ise her olay i\u00e7in k\u0131sa s\u00fcreli \u00e7al\u0131\u015facak ve tamamlan\u0131nca bitecek olan yeni bir Job ba\u015flatmaktad\u0131r.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<table style=\"border-collapse: collapse; max-width: 900px; margin: auto; border: 1px solid #e0a500; font-family: 'Segoe UI',Arial,sans-serif; font-size: 14px;\">\n<thead>\n<tr>\n<th style=\"border: 1px solid #e0a500;\" colspan=\"2\">Metrics Adapter<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 13px; line-height: 17px; vertical-align: text-top; background-color: #fffdf7; border: 1px solid #e0a500; text-align: justify;\" colspan=\"2\">KEDA&#8217;n\u0131n en kritik bile\u015fenlerinden biridir. Bunu anlamadan KEDA&#8217;n\u0131n nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131 tam kavranamayaca\u011f\u0131 kanaatindeyim.<\/p>\n<p>KEDA Metrics Adapter, Kubernetes HPA ile KEDA&#8217;n\u0131n olay tabanl\u0131 metrikleri aras\u0131nda k\u00f6pr\u00fc g\u00f6revi g\u00f6ren bir API sunucusudur.<\/p>\n<p>Nas\u0131l ki; ScaledObject ve ScaledJob bile\u015fenleri KEDA&#8217;n\u0131n \u00f6l\u00e7ekleme kurallar\u0131n\u0131 tan\u0131mlamakta; Scaler, kuyruk uzunlu vs. gibi ger\u00e7ek metrikleri \u00e7ekmekte&#8230; Metrics Adapter ise bu metrikleri HPA&#8217;n\u0131n anlayaca\u011f\u0131 formata \u00e7evirmektedir.<\/p>\n<p><em><u>Nas\u0131l \u00e7al\u0131\u015f\u0131r?<\/u><\/em><br \/>\nMetrics Adapter&#8217;\u0131n \u00e7al\u0131\u015fma mant\u0131\u011f\u0131n\u0131 en iyi a\u015fa\u011f\u0131daki gibi bir diyagram \u00fczerinden izah edebiliriz;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-medium wp-image-28141\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-168x300.png\" alt=\"Kubernetes | KEDA \u0130le Queue Uzunlu\u011funa G\u00f6re Consumer Deployment'\u0131 Otomatik \u00d6l\u00e7eklendirme\" width=\"168\" height=\"300\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-168x300.png 168w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme.png 335w\" sizes=\"auto, (max-width: 168px) 100vw, 168px\" \/><\/a><br \/>\nDiyagrama dikkat ederseniz;<\/p>\n<ul>\n<li><em>1. ad\u0131mda,<\/em> Scaler, metrik \u00e7ekmektedir.<\/li>\n<li><em>2. ad\u0131mda<\/em> Metrics Adapter devreye girerek HPA&#8217;ya bu metrikleri d\u00f6n\u00fc\u015ft\u00fcrmektedir.<\/li>\n<li><em>3. ad\u0131mda<\/em> HPA \u00f6l\u00e7eklendirmeyi ger\u00e7ekle\u015ftirmektedir.<\/li>\n<\/ul>\n<p>Evet, b\u00f6ylece sadece CPU, Memory veya Custom Metris API&#8217;lerini destekleyen HPA&#8217;ya, Metrics Adapter sayesinde herhangi bir olay kayna\u011f\u0131n\u0131 verebilmekteyiz. HPA, external metrikleri do\u011frudan okuyamad\u0131\u011f\u0131 i\u00e7in d\u0131\u015f d\u00fcnyadaki metrikleri ancak Metrics Adapter sayesinde Kubernetes i\u00e7erisinde aktarabilmekteyiz.<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n&nbsp;<br \/>\n<em><u>ScaledObject ile Metrics Adapter ili\u015fkisi nas\u0131ld\u0131r?<\/u><\/em><\/p>\n<div style=\"font-size: 12px; width: 95%;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\ntriggers:\r\n- type: rabbitmq\r\n  metadata:\r\n    queueName: my-queue\r\n    queueLength: &quot;10&quot;\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki gibi bir yap\u0131land\u0131rma neticesinde Metris Adapter, <code>rabbitmq-queue-my-queue<\/code> ad\u0131nda otomatik olu\u015fturulacakt\u0131r.<\/p>\n<blockquote><p><em>Metrics Adapter olmadan KEDA \u00e7al\u0131\u015fmaz, \u00e7\u00fcnk\u00fc HPA, KEDA&#8217;n\u0131n metriklerini ancak bu adapter sayesinde edinebilmektedir.<\/em><\/p><\/blockquote>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<hr \/>\n<table style=\"border-collapse: collapse; max-width: 900px; margin: auto; border: 1px solid #e0a500; font-family: 'Segoe UI',Arial,sans-serif; font-size: 14px;\">\n<thead>\n<tr>\n<th style=\"border: 1px solid #e0a500;\" colspan=\"2\">Scaler<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 13px; line-height: 17px; vertical-align: text-top; background-color: #fffdf7; border: 1px solid #e0a500; text-align: justify;\" colspan=\"2\">Bu bile\u015fen de KEDA&#8217;n\u0131n kalbidir diyebiliriz. Di\u011fer bile\u015fenlerdeki rol\u00fcnden de anla\u015f\u0131laca\u011f\u0131 \u00fczere olay kaynaklar\u0131ndan (RabbitMQ, Kafka, Azure Queue vs.) metrikleri ger\u00e7ek zamanl\u0131 \u00e7eken bile\u015fendir diyebiliriz.Scaler, \u00f6zellikle Metrics Adapters ile entegre \u00e7al\u0131\u015fmakta ve 50+ farkl\u0131 scaler desteklemektedir (ve Cloud Native Computing Foundation (CNCF) projesi olarak s\u00fcrekli g\u00fcncellenmektedir)<\/p>\n<p><em><u>Di\u011fer bile\u015fenlerle ba\u011flant\u0131s\u0131 nas\u0131ld\u0131r?<\/u><\/em><br \/>\nOlduk\u00e7a basit;<\/p>\n<ul>\n<li>ScaledObject\/ScaledJob, Scaler&#8217;\u0131 tetikler<\/li>\n<li>Scaler, metrik \u00e7eker<\/li>\n<li>Metrics Adapter ise elde edilen metri\u011fi HPA&#8217;ya sunar.<\/li>\n<\/ul>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>KEDA&#8217;n\u0131n Destekledi\u011fi Kaynak T\u00fcrleri Nelerdir?<\/h4>\n<p>KEDA, pek \u00e7ok sistemi desteklemektedir ve bunlar trigger olarak adland\u0131r\u0131lmaktad\u0131r. Zaten yukar\u0131daki sat\u0131rlarda verilen \u00f6rneklere g\u00f6z atarsan\u0131z bu kaynaklar\u0131n <em>triggers<\/em> alan\u0131 alt\u0131nda tan\u0131mland\u0131\u011f\u0131n\u0131 g\u00f6r\u00fcrs\u00fcn\u00fcz. Burada \u00f6ncelikle KEDA&#8217;da kar\u0131\u015ft\u0131r\u0131lma ihtimali y\u00fcksek olan trigger ile scaler kavramlar\u0131n\u0131n fark\u0131n\u0131 net ortaya koyarak, olas\u0131 hataya d\u00fc\u015f\u00fcrebilecek bu durumu netle\u015ftirerek devam edelim istiyorum.<\/p>\n<hr \/>\n<table style=\"border-collapse: collapse; max-width: 900px; margin: auto; border: 1px solid gray; font-family: 'Segoe UI',Arial,sans-serif; font-size: 14px;\">\n<thead>\n<tr>\n<th style=\"border: 1px solid gray; width: 50%;\">Trigger<\/th>\n<th style=\"border: 1px solid gray;\">Scaler<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"font-size: 13px; line-height: 17px; vertical-align: text-top; background-color: #d3eef5; border: 1px solid gray; text-align: justify;\">\n<blockquote><p><em>Trigger, KEDA&#8217;ya &#8216;neyi izleyece\u011fini&#8217; s\u00f6yler.<\/em><\/p><\/blockquote>\n<p>Trigger, KEDA&#8217;ya \u015fu minvalde bir davran\u0131\u015f sergiletir: <em>\u015eu kayna\u011fa bak, belirli bir e\u015fik a\u015f\u0131l\u0131rsa \u00f6l\u00e7eklemeyi ba\u015flat.<\/em><\/p>\n<p>Bu mant\u0131kla yola \u00e7\u0131k\u0131ld\u0131\u011f\u0131nda; message broker kuyru\u011fundaki mesaj say\u0131s\u0131, Kafka&#8217;daki lag de\u011feri, Prometheus metriklerinden bir saya\u00e7 de\u011feri yahut Azure Service Bus&#8217;taki aktif mesaj say\u0131s\u0131 KEDA i\u00e7in bir trigger&#8217;a kar\u015f\u0131l\u0131k gelmektedir.<\/p>\n<p>Yani her trigger bir veri kayna\u011f\u0131n\u0131 temsil etmekte ve belirli metrikleri izlemektedir.<\/p>\n<blockquote><p><em>Trigger, <em>KEDA neye tepki verecek?<\/em> sorusunun cevab\u0131d\u0131r.<\/em><\/p><\/blockquote>\n<\/td>\n<td style=\"font-size: 13px; line-height: 17px; vertical-align: text-top; background-color: #d3eef5; border: 1px solid gray; text-align: justify;\">Scaler ise trigger&#8217;\u0131n teknik kar\u015f\u0131l\u0131\u011f\u0131d\u0131r. Yani trigger&#8217;\u0131n arka plandaki mant\u0131\u011f\u0131n\u0131 i\u015fleten bile\u015fendir.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Her trigger t\u00fcr\u00fc i\u00e7in KEDA&#8217;n\u0131n i\u00e7inde bir scaler mod\u00fcl\u00fc mevcuttur. Bu scaler, belirli bir sisteme ba\u011flan\u0131r, metrikleri toplar ve KEDA&#8217;ya <em>&#8216;\u00f6l\u00e7eklendirme zaman\u0131 geldi&#8217;<\/em> sinyalini verir.<\/p>\n<p>Misal olarak; RabbitMQ Scaler&#8217;i RabbitMQ API&#8217;sine ba\u011flan\u0131r ve <em>queueLength<\/em> de\u011ferini al\u0131r. Benzer mant\u0131kla Kafka Scaler&#8217;i de consumer lag bilgisini \u00e7eker.<\/p>\n<p>Yani her trigger tipi, asl\u0131nda bir scaler implementasyonu taraf\u0131ndan ger\u00e7ekle\u015ftirilir.<\/p>\n<blockquote><p><em>Scaler, <em>bu trigger bilgiyi nas\u0131l toplayacak ve \u00f6l\u00e7eklendirmeyi nas\u0131l ba\u015flatacak<\/em> sorusunun cevab\u0131d\u0131r.<\/em><\/p><\/blockquote>\n<p>Ne izlenece\u011fini tan\u0131mlar.\u0130zlemeyi ve metrik toplay\u0131 teknik olarak yapar.<\/p>\n<p>Evet, bu ayr\u0131m\u0131 ger\u00e7ekle\u015ftirdikten sonra esas ba\u015fl\u0131\u011f\u0131n i\u00e7eri\u011fine odaklanabiliriz \ud83d\ude42<\/p>\n<p>KEDA&#8217;da a\u015fa\u011f\u0131daki gibi bir\u00e7ok trigger mevcuttur;<\/p>\n<ul style=\"font-size: 14px;\">\n<li><em><strong><u>Messaging sistemler<\/u><\/strong><\/em><br \/>\nRabbitMQ, Kafka, Azure Service Bus, NATS, AWS SQS<\/li>\n<li><em><strong><u>Veri kaynaklar\u0131<\/u><\/strong><\/em><br \/>\nPostgreSQL, MySQL, MongoDB<\/li>\n<li><em><strong><u>Cloud servisleri<\/u><\/strong><\/em><br \/>\nAWS CloudWatch, Azure Monitor, Google Pub\/Sub<\/li>\n<li><em><strong><u>Custom metrics<\/u><\/strong><\/em><br \/>\nPrometheus metrikleri, HTTP endpoint&#8217;ler<\/li>\n<\/ul>\n<p>Bu belirtilenlerin d\u0131\u015f\u0131nda en g\u00fcncel haliyle 60 ve \u00fczeri trigger&#8217;\u0131n mevcut oldu\u011funu s\u00f6yleyebiliriz.<\/p>\n<p>Evet&#8230; Art\u0131k KEDA&#8217;ya dair teoride yeterince fark\u0131ndal\u0131k olu\u015fturdu\u011fumuza g\u00f6re konunun pratik y\u00f6n\u00fcn\u00fc incelemeye ge\u00e7ebiliriz.<\/p>\n<h3>KEDA \u0130le Dinamik \u00d6l\u00e7eklendirme \u00c7al\u0131\u015fmas\u0131<\/h3>\n<p>Yaz\u0131m\u0131z\u0131n bundan sonraki b\u00f6l\u00fcm\u00fcnde, basit bir senaryoya kar\u015f\u0131n geli\u015ftirdi\u011fimiz, RabbitMQ ile aralar\u0131nda haberle\u015fmeyi sa\u011flayan iki servisten consumer taraf\u0131n\u0131 KEDA ile dinamik olarak \u00f6l\u00e7eklendirecek davran\u0131\u015f\u0131 pratiksel olarak ele al\u0131yor olaca\u011f\u0131z. Tabi bunu yaparken, olay\u0131n ana noktas\u0131n\u0131 daha iyi kavrayabilmeniz i\u00e7in \u00f6nce Kubernetes ile konteyner&#8217;leri aya\u011fa kald\u0131racak, ard\u0131ndan KEDA entegrasyonu ve yap\u0131land\u0131rmas\u0131 e\u015fli\u011finde dinamik \u00f6l\u00e7eklendirmenin fark\u0131n\u0131 ortaya koyaca\u011f\u0131z. Hadi buyurun ba\u015flayal\u0131m \ud83d\ude42<\/p>\n<h5>Servislerin Geli\u015ftirilmesi<\/h5>\n<p>\u015eimdi ilk olarak servisimizi geli\u015ftirerek ba\u015flayal\u0131m. Bunun i\u00e7in a\u015fa\u011f\u0131daki ad\u0131mlar\u0131n s\u0131ras\u0131yla seyredilmesi yeterli olacakt\u0131r&#8230;<\/p>\n<ul style=\"font-size:14px;\">\n<li><em style=\"color:green;\">Ad\u0131m 1 <span style=\"font-size:12px;color:black;\">(KedaQueueAutoScaler.Publisher Servisinin Olu\u015fturulmas\u0131)<\/span><\/em><br \/>\nDinamik \u00f6l\u00e7eklendirme s\u00fcrecinde kuyruk i\u00e7in yo\u011fun mesaj \u00fcretimini test ama\u00e7l\u0131 \u00fcstlenecek olan servistir.<\/p>\n<p>\u0130lk olarak bu servise <a href=\"https:\/\/www.nuget.org\/packages\/MassTransit.RabbitMQ\" target=\"_blank\">MassTransit.RabbitMQ<\/a> k\u00fct\u00fcphanesini y\u00fckleyelim ve ard\u0131ndan <em>Program.cs<\/em> dosyas\u0131nda a\u015fa\u011f\u0131daki \u00e7al\u0131\u015fmay\u0131 ger\u00e7ekle\u015ftirelim.<\/p>\n<details>\n<summary style=\"color:#B06453;\">\u00d6rnek kodu g\u00f6rmek i\u00e7in t\u0131klay\u0131n\u0131z<\/summary>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing KedaQueueAutoScaler.Shared.Messages;\r\nusing MassTransit;\r\nusing MassTransit.Testing.Implementations;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\nbuilder.Logging.ClearProviders();\r\nbuilder.Logging.AddSimpleConsole(options =&gt;\r\n{\r\n    options.SingleLine = true;\r\n    options.TimestampFormat = &quot;HH:mm:ss &quot;;\r\n});\r\n\r\nbuilder.Services.AddMassTransit(configurator =&gt;\r\n{\r\n    configurator.UsingRabbitMq((context, _configurator) =&gt;\r\n    {\r\n        _configurator.Host(&quot;10.1.1.125&quot;, 5672, &quot;\/&quot;, h =&gt;\r\n        {\r\n            h.Username(&quot;admin&quot;);\r\n            h.Password(&quot;admin&quot;);\r\n        });\r\n\r\n        _configurator.ConfigureEndpoints(context);\r\n    });\r\n});\r\n\r\nvar app = builder.Build();\r\n\r\napp.MapGet(&quot;\/&quot;, async (ILogger&lt;Program&gt; logger, ISendEndpointProvider sendEndpointProvider) =&gt;\r\n{\r\n    var endpoint = await sendEndpointProvider.GetSendEndpoint(new Uri(&quot;queue:keda-queue-autoscaler-queue&quot;));\r\n    logger.LogInformation(&quot;3000 mesaj paralel g\u00f6nderiliyor...&quot;);\r\n    var startTime = DateTime.UtcNow;\r\n\r\n    var batchSize = 100;\r\n    var totalMessages = 3000;\r\n\r\n    for (int batchStart = 0; batchStart &lt; totalMessages; batchStart += batchSize)\r\n    {\r\n        var tasks = new List&lt;Task&gt;();\r\n\r\n        for (int i = batchStart; i &lt; batchStart + batchSize &amp;&amp; i &lt; totalMessages; i++)\r\n        {\r\n            int messageNumber = i;\r\n            tasks.Add(endpoint.Send&lt;ExampleMessage&gt;(new ExampleMessage(messageNumber, $&quot;Message {messageNumber}&quot;)));\r\n        }\r\n\r\n        await Task.WhenAll(tasks);\r\n        logger.LogInformation($&quot;{batchStart + batchSize} mesaj g\u00f6nderildi...&quot;);\r\n    }\r\n\r\n    var duration = DateTime.UtcNow - startTime;\r\n    logger.LogInformation($&quot;3000 mesaj {duration.TotalSeconds:F2} saniyede g\u00f6nderildi&quot;);\r\n\r\n    return Results.Ok(new\r\n    {\r\n        Success = true,\r\n        MessageCount = 3000,\r\n        DurationSeconds = duration.TotalSeconds\r\n    });\r\n});\r\n\r\napp.Run();\r\n<\/pre>\n<\/div>\n<\/details>\n<\/li>\n<li><em style=\"color:green;\">Ad\u0131m 2 <span style=\"font-size:12px;color:black;\">(KedaQueueAutoScaler.Consumer Servisinin Olu\u015fturulmas\u0131)<\/span><\/em><br \/>\nRabbitMQ kuyru\u011funu dinleyip, t\u00fcketecek ve g\u00fcn\u00fcn sonunda kuyruktaki mesaj say\u0131s\u0131nda belirli bir oran\u0131n \u00fczerinde yo\u011funluk s\u00f6z konusuysa dinamik olarak \u00f6l\u00e7eklendirilecek olan servistir.<\/p>\n<p>Bu servise de yine <a href=\"https:\/\/www.nuget.org\/packages\/MassTransit.RabbitMQ\" target=\"_blank\">MassTransit.RabbitMQ<\/a> k\u00fct\u00fcphanesini y\u00fckleyelim ve ard\u0131ndan mesajlar\u0131 t\u00fcketecek olan a\u015fa\u011f\u0131daki consumer s\u0131n\u0131f\u0131n\u0131 in\u015fa edelim.<\/p>\n<details>\n<summary style=\"color:#B06453;\">\u00d6rnek kodu g\u00f6rmek i\u00e7in t\u0131klay\u0131n\u0131z<\/summary>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing KedaQueueAutoScaler.Shared.Messages;\r\nusing MassTransit;\r\n\r\nnamespace KedaQueueAutoScaler.Consumer.Consumers\r\n{\r\n    public class ExampleMessageConsumer(ILogger&lt;ExampleMessageConsumer&gt; logger) : IConsumer&lt;ExampleMessage&gt;\r\n    {\r\n        public async Task Consume(ConsumeContext&lt;ExampleMessage&gt; context)\r\n        {\r\n            await Task.Delay(1000);\r\n            logger.LogInformation($&quot;Received message no : {context.Message.MessageNo} | message text : {context.Message.Text}&quot;);\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<\/details>\n<p>Ard\u0131ndan <em>Program.cs<\/em> dosyas\u0131nda da a\u015fa\u011f\u0131daki gibi yap\u0131land\u0131rmada bulunal\u0131m.<\/p>\n<details>\n<summary style=\"color:#B06453;\">\u00d6rnek kodu g\u00f6rmek i\u00e7in t\u0131klay\u0131n\u0131z<\/summary>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing KedaQueueAutoScaler.Consumer.Consumers;\r\nusing MassTransit;\r\n\r\nvar builder = Host.CreateApplicationBuilder(args);\r\nbuilder.Logging.ClearProviders();\r\nbuilder.Logging.AddSimpleConsole(options =&gt;\r\n{\r\n    options.SingleLine = true;\r\n    options.TimestampFormat = &quot;HH:mm:ss &quot;;\r\n});\r\n\r\nbuilder.Services.AddMassTransit(configurator =&gt;\r\n{\r\n    configurator.AddConsumer&lt;ExampleMessageConsumer&gt;();\r\n\r\n    configurator.UsingRabbitMq((context, _configurator) =&gt;\r\n    {\r\n        _configurator.Host(&quot;10.1.1.125&quot;, 5672, &quot;\/&quot;, h =&gt;\r\n        {\r\n            h.Username(&quot;admin&quot;);\r\n            h.Password(&quot;admin&quot;);\r\n        });\r\n\r\n        _configurator.ReceiveEndpoint(&quot;keda-queue-autoscaler-queue&quot;, endpointConfigurator =&gt;\r\n        {\r\n            endpointConfigurator.Consumer&lt;ExampleMessageConsumer&gt;(context);\r\n        });\r\n\r\n        _configurator.ConfigureEndpoints(context);\r\n    });\r\n});\r\n\r\nvar host = builder.Build();\r\nhost.Run();\r\n\r\n<\/pre>\n<\/div>\n<\/details>\n<\/li>\n<li><em style=\"color:green;\">Ad\u0131m 3 <span style=\"font-size:12px;color:black;\">(KedaQueueAutoScaler.Shared Class Library&#8217;sinin Olu\u015fturulmas\u0131)<\/span><\/em><br \/>\n.NET ile message broker \u00e7al\u0131\u015fmalar\u0131nda servisler aras\u0131 haberle\u015fmeyi sa\u011flayan t\u00fcrleri bar\u0131nd\u0131ran klasikle\u015fmi\u015f class library&#8217;dir.<\/p>\n<p>\u0130\u00e7erisinde ileti\u015fim s\u00fcrecinde kulland\u0131\u011f\u0131m\u0131z <code>ExampleMessage<\/code> s\u0131n\u0131f\u0131n\u0131 a\u015fa\u011f\u0131daki gibi tan\u0131mlam\u0131\u015f olmam\u0131z yeterli olacakt\u0131r.<\/p>\n<details>\n<summary style=\"color:#B06453;\">\u00d6rnek kodu g\u00f6rmek i\u00e7in t\u0131klay\u0131n\u0131z<\/summary>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nnamespace KedaQueueAutoScaler.Shared.Messages\r\n{\r\n    public record ExampleMessage(int MessageNo, string Text);\r\n}\r\n<\/pre>\n<\/div>\n<\/details>\n<\/li>\n<\/ul>\n<blockquote style=\"font-size:12px;color:orange\"><p><em>Uyar\u0131!<br \/>\nYukar\u0131daki kodlarda ba\u011flant\u0131 sa\u011flanan RabbitMQ IP&#8217;si (10.1.1.125) a\u015fa\u011f\u0131daki <em><u>RabbitMQ Kurulumu<\/u><\/em> ba\u015fl\u0131\u011f\u0131ndaki y\u00f6nergeler uyguland\u0131ktan sonra <code style=\"color:red;\">kubectl get pod rabbitmq-0 -n default -o jsonpath='{.status.podIP}'<\/code> talimat\u0131 e\u015fli\u011finde elde edilerek koda yerle\u015ftirilmi\u015ftir.<br \/>\n<\/em><\/p><\/blockquote>\n<h5>RabbitMQ Kurulumu<\/h5>\n<p>\u015eimdi de message broker olarak RabbitMQ&#8217;nun kurulumunu ele alal\u0131m. Tabi bunun i\u00e7in Kubernetes&#8217;in paket y\u00f6neticisi olan <em>Helm<\/em>&#8216;den istifade edece\u011fiz. Helm, bir uygulaman\u0131n t\u00fcm Kubernetes manifest dosyalar\u0131n\u0131 (Deployment, Service, ConfigMap vs.) Chart ad\u0131 verilen tek bir yap\u0131 i\u00e7inde toplamaktad\u0131r. Bu \u00f6zelli\u011fi sayesinde, herhangi bir pakete dair kurulumu tek seferde <code>helm install<\/code> talimat\u0131 e\u015fli\u011finde rahatl\u0131kla ger\u00e7ekle\u015ftirebilmemizi sa\u011flamaktad\u0131r.<\/p>\n<p>Helm ile bir paket y\u00fckleyebilmek i\u00e7in \u00f6ncelikle Helm&#8217;in kurulmas\u0131 gerekmektedir. Bunun i\u00e7in PowerShell \u00fczerinden <code>winget install Helm.Helm<\/code> talimat\u0131n\u0131 verebilirsiniz.<\/p>\n<p>Kurulumu ger\u00e7ekle\u015ftirdikten sonra <em>Bitnami Helm<\/em> reposunun eklenmesi gerekmektedir. <em>Hoca bu repo ne la?<\/em> dedi\u011finizi duyar gibiyim&#8230; Bu, VMware&#8217;in bir alt markas\u0131 olan ve Kubernetes i\u00e7in resmi ve g\u00fcvenilir Helm chart&#8217;lar\u0131 sa\u011flayan bir havuzdur. RabbitMQ, Redis, PostgreSQL, MongoDB vs. gibi pop\u00fcler servislerin haz\u0131r ve test edilmi\u015f versiyonlar\u0131n\u0131n tek komutla kurulabilmesini sa\u011flamaktad\u0131r.<\/p>\n<p>Velhas\u0131l Bitnami Helm reposunu sisteme ekleyebilmek i\u00e7in a\u015fa\u011f\u0131daki talimat\u0131 \u00e7al\u0131\u015ft\u0131ral\u0131m.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nhelm repo add bitnami https:\/\/charts.bitnami.com\/bitnami\r\n<\/pre>\n<\/div>\n<p>Ard\u0131ndan sistemde kay\u0131tl\u0131 olan t\u00fcm Helm repolar\u0131n\u0131 g\u00fcncelleyelim.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nhelm repo update\r\n<\/pre>\n<\/div>\n<p>Art\u0131k RabbitMQ&#8217;yu y\u00fckleyebiliriz.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nhelm install rabbitmq bitnami\/rabbitmq --set persistence.enabled=false --set auth.username=admin --set auth.password=admin --set hostname=rabbitmq\r\n<\/pre>\n<\/div>\n<p>Y\u00fckledi\u011fimiz bu RabbitMQ instance&#8217;\u0131n\u0131n d\u0131\u015far\u0131dan eri\u015filebilir olmas\u0131 i\u00e7in gerekli portlar\u0131 local ortamdan eri\u015fime a\u00e7mam\u0131z gerekmektedir.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nkubectl port-forward svc\/rabbitmq -n default 5672:5672 15672:15672\r\n<\/pre>\n<\/div>\n<p>\u0130\u015fte bu kadar&#8230; Art\u0131k RabbitMQ&#8217;yu rahatl\u0131kla kullanabiliriz.<\/p>\n<blockquote><p><em style=\"color:#F26349;font-size:12px;\"><strong><u>Dikkat!<\/u><\/strong><\/p>\n<p>Talihsizliktir ki son g\u00fcnlerde VMWare, Bitnami politikas\u0131n\u0131 de\u011fi\u015ftirdi ve <code>bitnami\/rabbitmq<\/code> image&#8217;\u0131n\u0131 \u00fccretli hale getirdi! Bu karardan dolay\u0131 <a href=\"https:\/\/hub.docker.com\/r\/bitnami\/rabbitmq\" target=\"_blank\">https:\/\/hub.docker.com\/r\/bitnami\/rabbitmq<\/a> adresinden de g\u00f6rebilece\u011finiz \u00fczere ilgili image&#8217;\u0131n herhangi bir tag&#8217;ine eri\u015filememekte, dolay\u0131s\u0131yla yukar\u0131daki talimatlar do\u011frultusunda RabbitMQ konteyner&#8217;\u0131 aya\u011fa kald\u0131r\u0131l\u0131rken t\u00fcrl\u00fc t\u00fcrl\u00fc &#8216;image pull&#8217; vs. gibi hatalarla kar\u015f\u0131la\u015f\u0131lmaktad\u0131r.<\/p>\n<p>Ancak VMWARE bu karar\u0131 eski RabbitMQ image&#8217;lar\u0131 i\u00e7in uygulamam\u0131\u015f ve <em>bitnamilegacy<\/em> alt\u0131nda eri\u015fime a\u00e7\u0131k halde b\u0131rakm\u0131\u015ft\u0131r. Bunun i\u00e7in tek yap\u0131lmas\u0131 gereken alternatif bir image&#8217;\u0131 pull edebilmek i\u00e7in helm chart&#8217;\u0131 a\u015fa\u011f\u0131daki gibi ezmemiz (overwrite) ve ard\u0131ndan <code>helm install<\/code> talimat\u0131n\u0131 belirtildi\u011fi gibi uygulamam\u0131z yeterli olacakt\u0131r.<br \/>\n<em style=\"font-size:10px;\">values-rabbitmq.yaml;<\/em><\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nglobal:\r\n  security:\r\n    allowInsecureImages: true\r\n\r\nimage:\r\n  repository: bitnamilegacy\/rabbitmq \r\n\r\nvolumePermissions:\r\n  enabled: true\r\n  image:\r\n    repository: bitnamilegacy\/os-shell\r\n\r\nmetrics:\r\n  enabled: false\r\n<\/pre>\n<\/div>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nhelm install rabbitmq bitnami\/rabbitmq --set persistence.enabled=false -f values-rabbitmq.yaml --set auth.username=admin --set auth.password=admin --set hostname=rabbitmq\r\n<\/pre>\n<\/div>\n<p><\/em><\/p><\/blockquote>\n<p>T\u00fcm bu i\u015flemlerden sonra sa\u011f salim RabbitMQ Pod&#8217;unu aya\u011fa kald\u0131rabildiyseniz e\u011fer port-forward i\u015flemi a\u015fa\u011f\u0131daki gibi ba\u015far\u0131l\u0131 olacakt\u0131r.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-3.png\" alt=\"Kubernetes | KEDA \u0130le Queue Uzunlu\u011funa G\u00f6re Consumer Deployment&#039;\u0131 Otomatik \u00d6l\u00e7eklendirme\" width=\"986\" height=\"166\" class=\"aligncenter size-full wp-image-28152\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-3.png 986w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-3-300x51.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-3-768x129.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-3-980x166.png 980w\" sizes=\"auto, (max-width: 986px) 100vw, 986px\" \/><\/a>Ve bir yandan <a href=\"http:\/\/localhost:15672\/\" target=\"_blank\">http:\/\/localhost:15672<\/a> adresi \u00fczerinden RabbitMQ Management Dashboard&#8217;una eri\u015fim sa\u011flanabilecektir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-4.png\" alt=\"Kubernetes | KEDA \u0130le Queue Uzunlu\u011funa G\u00f6re Consumer Deployment&#039;\u0131 Otomatik \u00d6l\u00e7eklendirme\" width=\"545\" height=\"211\" class=\"aligncenter size-full wp-image-28153\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-4.png 545w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-4-300x116.png 300w\" sizes=\"auto, (max-width: 545px) 100vw, 545px\" \/><\/a><\/p>\n<h5>Kubernetes \u0130le Konteynerle\u015ftirme<\/h5>\n<p>\u015eimdi de olu\u015fturdu\u011fumuz servisleri Kubernetes ile konteynerle\u015ftirerek aya\u011fa kald\u0131ral\u0131m. Bunun i\u00e7in \u00f6ncelikle her iki servisin image&#8217;\u0131na ihtiyac\u0131m\u0131z olacakt\u0131r. Ee haliyle bunun i\u00e7in de bu servislerin ayr\u0131 ayr\u0131 <em>Dockerfile<\/em> dosyalar\u0131n\u0131 olu\u015fturmal\u0131 ve a\u015fa\u011f\u0131daki gibi i\u00e7eriklerini tasarlamal\u0131y\u0131z.<\/p>\n<p><em>KedaQueueAutoScaler.Publisher<\/em> servisinin <em>Dockerfile<\/em> dosyas\u0131;<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n# Derleme a\u015famas\u0131: Uygulaman\u0131n derlenmesi i\u00e7in resmi .NET SDK 9.0 g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc temel al\u0131r\r\nFROM mcr.microsoft.com\/dotnet\/sdk:9.0 AS build\r\n\r\n# Konteyner i\u00e7indeki \u00e7al\u0131\u015fma dizinini \/src olarak ayarlar\r\nWORKDIR \/src\r\n\r\n# T\u00fcm \u00e7\u00f6z\u00fcm\u00fc (t\u00fcm projeler ve dosyalar dahil) konteynere kopyalar\r\nCOPY . .\r\n\r\n# \u00c7\u00f6z\u00fcm i\u00e7in NuGet paketlerini geri y\u00fckler\r\nRUN dotnet restore\r\n\r\n# Publisher projesini derler ve yay\u0131nlar\r\n# -c Release: Release yap\u0131land\u0131rmas\u0131nda derler\r\n# -o \/app: \/app dizinine \u00e7\u0131kt\u0131 verir\r\n# --no-restore: Paketleri tekrar y\u00fcklemez (yukar\u0131da zaten yap\u0131ld\u0131)\r\nRUN dotnet publish KedaQueueAutoScaler.Publisher\/KedaQueueAutoScaler.Publisher.csproj \\\r\n    -c Release -o \/app --no-restore\r\n\r\n# \u00c7al\u0131\u015fma zaman\u0131 a\u015famas\u0131: Daha k\u00fc\u00e7\u00fck boyutlu ASP.NET Runtime g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc kullan\u0131r (bu bir web uygulamas\u0131 oldu\u011fu i\u00e7in)\r\nFROM mcr.microsoft.com\/dotnet\/aspnet:9.0 AS runtime\r\n\r\n# \u00c7al\u0131\u015fma zaman\u0131 konteynerinde \u00e7al\u0131\u015fma dizinini \/app olarak ayarlar\r\nWORKDIR \/app\r\n\r\n# Derleme a\u015famas\u0131nda yay\u0131nlanan uygulamay\u0131 \u00e7al\u0131\u015fma zaman\u0131 a\u015famas\u0131na kopyalar\r\nCOPY --from=build \/app .\r\n\r\n# ASP.NET Core URL'lerini 8080 portunu dinleyecek \u015fekilde yap\u0131land\u0131r\u0131r\r\nENV ASPNETCORE_URLS=http:\/\/+:8080\r\n\r\n# Konteynerin 8080 portunu dinledi\u011fini belirtir\r\nEXPOSE 8080\r\n\r\n# Uygulamay\u0131 \u00e7al\u0131\u015ft\u0131racak komutu tan\u0131mlar\r\nENTRYPOINT &#x5B;&quot;dotnet&quot;, &quot;KedaQueueAutoScaler.Publisher.dll&quot;]\r\n<\/pre>\n<\/div>\n<p><em>KedaQueueAutoScaler.Consumer<\/em> servisinin <em>Dockerfile<\/em> dosyas\u0131;<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n# Derleme a\u015famas\u0131: Uygulaman\u0131n derlenmesi i\u00e7in resmi .NET SDK 9.0 g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc temel al\u0131r\r\nFROM mcr.microsoft.com\/dotnet\/sdk:9.0 AS build\r\n\r\n# Konteyner i\u00e7indeki \u00e7al\u0131\u015fma dizinini \/src olarak ayarlar\r\nWORKDIR \/src\r\n\r\n# T\u00fcm \u00e7\u00f6z\u00fcm\u00fc (t\u00fcm projeler ve dosyalar dahil) konteynere kopyalar\r\nCOPY . .\r\n\r\n# \u00c7\u00f6z\u00fcm i\u00e7in NuGet paketlerini geri y\u00fckler\r\nRUN dotnet restore\r\n\r\n# Consumer projesini derler ve yay\u0131nlar\r\n# -c Release: Release yap\u0131land\u0131rmas\u0131nda derler\r\n# -o \/app: \/app dizinine \u00e7\u0131kt\u0131 verir\r\n# --no-restore: Paketleri tekrar y\u00fcklemez (yukar\u0131da zaten yap\u0131ld\u0131)\r\nRUN dotnet publish KedaQueueAutoScaler.Consumer\/KedaQueueAutoScaler.Consumer.csproj \\\r\n    -c Release -o \/app --no-restore\r\n\r\n# \u00c7al\u0131\u015fma zaman\u0131 a\u015famas\u0131: .NET Runtime g\u00f6r\u00fcnt\u00fcs\u00fcn\u00fc kullan\u0131r (bu bir worker service oldu\u011fu i\u00e7in ASP.NET Core de\u011fil)\r\nFROM mcr.microsoft.com\/dotnet\/runtime:9.0\r\n\r\n# \u00c7al\u0131\u015fma zaman\u0131 konteynerinde \u00e7al\u0131\u015fma dizinini \/app olarak ayarlar\r\nWORKDIR \/app\r\n\r\n# Derleme a\u015famas\u0131nda yay\u0131nlanan uygulamay\u0131 \u00e7al\u0131\u015fma zaman\u0131 a\u015famas\u0131na kopyalar\r\nCOPY --from=build \/app .\r\n\r\n# Uygulamay\u0131 \u00e7al\u0131\u015ft\u0131racak komutu tan\u0131mlar\r\nENTRYPOINT &#x5B;&quot;dotnet&quot;, &quot;KedaQueueAutoScaler.Consumer.dll&quot;]\r\n<\/pre>\n<\/div>\n<p>Evet, dikkat ederseniz servislerin t\u00fcrlerine g\u00f6re <em>Dockerfile<\/em> dosyalar\u0131 uygun talimatlarla yap\u0131land\u0131r\u0131lm\u0131\u015ft\u0131r.<\/p>\n<p>\u015eimdi de bu <em>Dockerfile<\/em> dosyalar\u0131ndan image&#8217;leri olu\u015ftural\u0131m. Tabi bunun i\u00e7in<br \/>\n<code style=\"color:red;font-size:12px;\">docker build -t &lt;image-name&gt;  -f KedaQueueAutoScaler.Publisher\/Dockerfile .<\/code> ve<br \/>\n<code style=\"color:red;font-size:12px;\">docker build -t &lt;image-name&gt;  -f KedaQueueAutoScaler.Consumer\/Dockerfile .<\/code> talimatlar\u0131n\u0131 kullanarak image&#8217;leri olu\u015fturabilirsiniz. Ancak bizler bu \u015fekilde tek tek u\u011fra\u015fmak yerine s\u00fcreci Docker Compose ile y\u00fcr\u00fct\u00fcyor olaca\u011f\u0131z.<\/p>\n<p>Solution&#8217;\u0131n ana dizinine <code>docker-compose.yaml<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m ve i\u00e7eri\u011fini a\u015fa\u011f\u0131daki gibi doldural\u0131m.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nservices:\r\n  publisher:\r\n    image: kedaqueueautoscaler.publisher\r\n    build:\r\n      dockerfile: KedaQueueAutoScaler.Publisher\/Dockerfile\r\n  consumer:\r\n    image: kedaqueueautoscaler.consumer\r\n    build:\r\n      dockerfile: KedaQueueAutoScaler.Consumer\/Dockerfile\r\n<\/pre>\n<\/div>\n<p>Evet, art\u0131k bu Docker Compose dosyas\u0131 \u00fczerinden, tek seferde <code style=\"color:red;font-size:12px;\">docker compose build<\/code> talimat\u0131 e\u015fli\u011finde t\u00fcm <em>Dockerfile<\/em>&#8216;lara uygun image&#8217;leri olu\u015fturabiliriz. <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-1.png\" alt=\"Kubernetes | KEDA \u0130le Queue Uzunlu\u011funa G\u00f6re Consumer Deployment&#039;\u0131 Otomatik \u00d6l\u00e7eklendirme\" width=\"1386\" height=\"628\" class=\"aligncenter size-full wp-image-28147\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-1.png 1386w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-1-300x136.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-1-1024x464.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-1-768x348.png 768w\" sizes=\"auto, (max-width: 1386px) 100vw, 1386px\" \/><\/a>Image&#8217;ler olu\u015fturuldu\u011funa g\u00f6re art\u0131k Kubernetes i\u00e7in gerekli yap\u0131land\u0131rmalar\u0131 kurgulamaya ge\u00e7ebiliriz.<\/p>\n<p>\u015eimdi bizlerin burada \u00fc\u00e7 adet Kubernetes nesnesine ihtiyac\u0131 mevcuttur. Bunlardan ikisi hem publisher hem de consumer servisleri i\u00e7in birer <em>Deployment<\/em> nesnesi, di\u011feri ise publisher&#8217;\u0131 d\u0131\u015fardan eri\u015filebilir hale getirecek olan <em>Service<\/em> nesnesidir. Hadi bunlar\u0131 olu\u015fturarak devam edelim.<\/p>\n<p><em>KedaQueueAutoScaler.Publisher.deployment.yaml<\/em>;<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napiVersion: apps\/v1\r\nkind: Deployment\r\nmetadata:\r\n  name: kedaqueueautoscaler-publisher-deployment # Deployment'in benzersiz ad\u0131\r\nspec:\r\n  replicas: 1 # Ba\u015flang\u0131\u00e7ta \u00e7al\u0131\u015facak pod say\u0131s\u0131\r\n  selector:\r\n    matchLabels: \r\n        app: kedaqueueautoscaler-publisher # Pod'lar\u0131 se\u00e7mek i\u00e7in kullan\u0131lan etiket\r\n  template:\r\n    metadata:\r\n      labels: \r\n        app: kedaqueueautoscaler-publisher # Pod'lara uygulanacak etiket\r\n    spec:\r\n      containers:\r\n      - name: kedaqueueautoscaler-publisher-container # Container ad\u0131\r\n        image: kedaqueueautoscaler.publisher # Kullan\u0131lacak container image\r\n        imagePullPolicy: Never # Image \u00e7ekme politikas\u0131 (local geli\u015ftirme i\u00e7in)\r\n        ports: \r\n            - containerPort: 8080 # Container'\u0131n dinleyece\u011fi port\r\n        resources:\r\n          requests: # Minimum kaynak gereksinimleri\r\n            cpu: &quot;200m&quot;    # 0.2 CPU \u00e7ekirdek\r\n            memory: &quot;256Mi&quot; # 256 MB RAM\r\n          limits:   # Maksimum kaynak s\u0131n\u0131rlar\u0131\r\n            cpu: &quot;1&quot;       # 1 CPU \u00e7ekirdek\r\n            memory: &quot;512Mi&quot; # 512 MB RAM\r\n<\/pre>\n<\/div>\n<p><em>KedaQueueAutoScaler.Consumer.deployment.yaml<\/em>;<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napiVersion: apps\/v1   \r\nkind: Deployment      \r\nmetadata:\r\n  name: kedaqueueautoscaler-consumer-deployment # Deployment'in benzersiz ad\u0131\r\nspec:\r\n  replicas: 3 # Ba\u015flang\u0131\u00e7ta \u00e7al\u0131\u015facak pod say\u0131s\u0131\r\n  selector:       \r\n    matchLabels: \r\n        app: kedaqueueautoscaler-consumer-deployment # Pod'lar\u0131 se\u00e7mek i\u00e7in kullan\u0131lan etiket\r\n  template:\r\n    metadata:\r\n      labels:\r\n        app: kedaqueueautoscaler-consumer-deployment # Pod'lara uygulanacak etiket\r\n    spec:\r\n      containers: \r\n      - name: kedaqueueautoscaler-consumer-container # Container ad\u0131\r\n        image: kedaqueueautoscaler.consumer # Kullan\u0131lacak container image\r\n        imagePullPolicy: Never # Image \u00e7ekme politikas\u0131 (local geli\u015ftirme i\u00e7in)\r\n        resources: # Kaynak limitleri ve istekleri\r\n          requests: # Minimum kaynak gereksinimleri\r\n            cpu: &quot;100m&quot; # 0.1 CPU \u00e7ekirdek\r\n            memory: &quot;128Mi&quot; # 128 MB bellek\r\n          limits: # Maksimum kaynak limitleri\r\n            cpu: &quot;500m&quot; # 0.5 CPU \u00e7ekirdek\r\n            memory: &quot;256Mi&quot; # 256 MB bellek\r\n<\/pre>\n<\/div>\n<p>Burada 6. sat\u0131ra g\u00f6z atarsan\u0131z e\u011fer consumer servisinin ilk etapta 3 Pod olarak aya\u011fa kald\u0131r\u0131lmas\u0131n\u0131 yap\u0131land\u0131rm\u0131\u015f oluyoruz. Bu ilk etapta pek mant\u0131kl\u0131 de\u011fil. \u00c7\u00fcnk\u00fc kimi zaman kuyrukta i\u015flenmeyi bekleyen hi\u00e7 veri olmayacak, kimi zaman da 3 instance&#8217;\u0131n kald\u0131ramayaca\u011f\u0131 y\u00fckte ciddi veri olacak. B\u00f6yle bir durumda sabitlik hi\u00e7 etkili bir davran\u0131\u015f olmayacakt\u0131r. Haliyle bizler de KEDA ile dinamik \u00f6l\u00e7eklendirme s\u00fcrecinde bu Deployment nesnesinin bu noktas\u0131na dokunacak ve ilk replica say\u0131s\u0131n\u0131 0&#8217;a indirgeyerek, ihtiya\u00e7 olmad\u0131\u011f\u0131 durumda hi\u00e7 instance aya\u011fa kald\u0131rmayacak, gerekirse KEDA sayesinde dinamik \u00f6l\u00e7eklendirmeyi i\u015fte tam o yerinde ger\u00e7ekle\u015ftiriyor olaca\u011f\u0131z \ud83d\ude09<\/p>\n<p><em>KedaQueueAutoScaler.Publisher.service.yaml<\/em>;<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napiVersion: v1\r\nkind: Service\r\nmetadata:\r\n  name: kedaqueueautoscaler-publisher-service\r\nspec:\r\n  type: NodePort\r\n  selector:\r\n    app: kedaqueueautoscaler-publisher\r\n  ports:\r\n    - name: http\r\n      port: 80\r\n      targetPort: 8080\r\n      nodePort: 30001\r\n<\/pre>\n<\/div>\n<p>Evet&#8230;<\/p>\n<p>Art\u0131k Kubernetes i\u00e7in gerekli olan nesneleri yap\u0131land\u0131rd\u0131\u011f\u0131m\u0131za g\u00f6re art\u0131k bunlar\u0131 a\u015fa\u011f\u0131daki talimatlar e\u015fli\u011finde uygulayarak, aya\u011fa kald\u0131rabiliriz.<br \/>\n<code style=\"color:red;font-size:12px;\">kubectl apply -f '.\\Kubernetes Configurations\\KedaQueueAutoScaler.Publisher.deployment.yaml'<\/code><br \/>\n<code style=\"color:red;font-size:12px;\">kubectl apply -f '.\\Kubernetes Configurations\\KedaQueueAutoScaler.Consumer.deployment.yaml'<\/code><br \/>\n<code style=\"color:red;font-size:12px;\">kubectl apply -f '.\\Kubernetes Configurations\\KedaQueueAutoScaler.Publisher.service.yaml'<\/code><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-2.png\" alt=\"Kubernetes | KEDA \u0130le Queue Uzunlu\u011funa G\u00f6re Consumer Deployment&#039;\u0131 Otomatik \u00d6l\u00e7eklendirme\" width=\"864\" height=\"97\" class=\"aligncenter size-full wp-image-28148\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-2.png 864w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-2-300x34.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-2-768x86.png 768w\" sizes=\"auto, (max-width: 864px) 100vw, 864px\" \/><\/a><\/p>\n<blockquote style=\"font-size:12px;color:orange\"><p><em>Uyar\u0131!<br \/>\nE\u011fer publisher&#8217;a <a href=\"http:\/\/localhost:30001\/\" target=\"_blank\">http:\/\/localhost:30001\/<\/a> adresinden eri\u015femiyorsan\u0131z<br \/>\n<code style=\"color:red;\">kubectl port-forward svc\/kedaqueueautoscaler-publisher-service 8080:80 -n default<\/code> talimat\u0131yla <em>&#8216;8080&#8217;<\/em> portuna y\u00f6nlendirmede bulunabilir ve <a href=\"http:\/\/localhost:8080\/\" target=\"_blank\">http:\/\/localhost:8080\/<\/a> adresinden eri\u015febilirsiniz.<\/em><\/p><\/blockquote>\n<p><strong>Test Edelim<\/strong><br \/>\n\u015eimdi k\u00fc\u00e7\u00fck bir test ile Kubernetes \u00fczerinden yo\u011fun mesaj ak\u0131\u015f\u0131n\u0131 consumer Pod&#8217;lar\u0131n\u0131n loglar\u0131n\u0131 ger\u00e7ek zamanl\u0131 inceleyerek g\u00f6zlemleyelim ve bir yandan da bu ak\u0131\u015f\u0131n 3 Pod aras\u0131nda nas\u0131l balance edildi\u011fini takip ederek, inceleyelim.<\/p>\n<p>Tabi bunun i\u00e7in \u00f6ncelikle t\u00fcm Pod&#8217;lar\u0131 listeleyelim.<br \/>\n<code style=\"color:red;font-size:12px;\">kubectl get pods<\/code><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-6.png\" alt=\"Kubernetes | KEDA \u0130le Queue Uzunlu\u011funa G\u00f6re Consumer Deployment&#039;\u0131 Otomatik \u00d6l\u00e7eklendirme\" width=\"866\" height=\"140\" class=\"aligncenter size-full wp-image-28156\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-6.png 866w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-6-300x48.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-6-768x124.png 768w\" sizes=\"auto, (max-width: 866px) 100vw, 866px\" \/><\/a>Ard\u0131ndan bu Pod&#8217;lara uygun ger\u00e7ek zamanl\u0131 log talimatlar\u0131n\u0131 a\u015fa\u011f\u0131daki gibi i\u015fleyelim ve <a href=\"http:\/\/localhost:8080\/\" target=\"_blank\">http:\/\/localhost:8080\/<\/a> adresine istekte bulunarak kuyru\u011fa yo\u011fun mesaj ak\u0131\u015f\u0131n\u0131 ba\u015flatal\u0131m.<br \/>\n<code style=\"color:red;font-size:12px;\">kubectl logs kedaqueueautoscaler-consumer-deployment-bf67686f7-bpvdq -f<\/code><br \/>\n<code style=\"color:red;font-size:12px;\">kubectl logs kedaqueueautoscaler-consumer-deployment-bf67686f7-dxpt9 -f<\/code><br \/>\n<code style=\"color:red;font-size:12px;\">kubectl logs kedaqueueautoscaler-consumer-deployment-bf67686f7-fqk8m -f<\/code><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme.gif\" alt=\"Kubernetes | KEDA \u0130le Queue Uzunlu\u011funa G\u00f6re Consumer Deployment&#039;\u0131 Otomatik \u00d6l\u00e7eklendirme\" width=\"800\" height=\"431\" class=\"aligncenter size-full wp-image-28157\" \/><\/a>Evet&#8230; G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Kubernetes&#8217;te uygulamam\u0131z\u0131 deploy etmi\u015f ve 3 consumer Pod&#8217;u \u00fczerinden kuyru\u011fa gelen mesajlar\u0131 t\u00fcketebilmi\u015f bulunmaktay\u0131z.<\/p>\n<p>Art\u0131k bu 3 Pod durumunu kuyruktaki y\u00fcke g\u00f6re art\u0131r\u0131p azaltmaya ge\u00e7ebilir ve KEDA ile dinamik \u00f6l\u00e7eklendirmeye odaklanabiliriz.<\/p>\n<h5>KEDA \u0130le Dinamik \u00d6l\u00e7eklendirme<\/h5>\n<p>\u0130lk olarak consumer&#8217;lar i\u00e7in replica say\u0131s\u0131n\u0131 0 (s\u0131f\u0131r)&#8217;a \u00e7ekerek ba\u015flayal\u0131m.<\/p>\n<p><em>KedaQueueAutoScaler.Consumer.deployment.yaml;<\/em><\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napiVersion: apps\/v1   \r\nkind: Deployment      \r\nmetadata:\r\n  name: kedaqueueautoscaler-consumer-deployment # Deployment'in benzersiz ad\u0131\r\nspec:\r\n  replicas: 0 # Ba\u015flang\u0131\u00e7ta \u00e7al\u0131\u015facak pod say\u0131s\u0131\r\n  selector:       \r\n    matchLabels: \r\n  .\r\n  .\r\n  .\r\n<\/pre>\n<\/div>\n<p>Ard\u0131ndan dinamik \u00f6l\u00e7eklendirme i\u00e7in KEDA&#8217;n\u0131n kurulumu gerekmektedir.<\/p>\n<h5>KEDA Kurulumu<\/h5>\n<p>KEDA&#8217;y\u0131 da a\u015fa\u011f\u0131daki gibi Helm arac\u0131l\u0131\u011f\u0131yla y\u00fckleyebiliriz.<\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nhelm repo add keda https:\/\/kedacore.github.io\/charts\r\n<\/pre>\n<\/div>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nhelm repo update\r\n<\/pre>\n<\/div>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nhelm install keda keda\/keda --namespace keda --create-namespace\r\n<\/pre>\n<\/div>\n<p>Y\u00fckleme i\u015flemini tamamlad\u0131ktan sonra KEDA&#8217;y\u0131 yap\u0131land\u0131rmam\u0131z gerekmektedir.<\/p>\n<h5>KEDA Yap\u0131land\u0131rmas\u0131<\/h5>\n<p>Bu yap\u0131land\u0131rmada KEDA&#8217;y\u0131 <em>Secret<\/em>, <em>TriggerAuthentication<\/em> ve <em>ScaledObject<\/em> olmak \u00fczere \u00fc\u00e7 a\u00e7\u0131dan yap\u0131land\u0131rmam\u0131z gerekmektedir.<\/p>\n<ul style=\"font-size:12px;\">\n<li><strong><em>Secret<\/em><\/strong><br \/>\nRabbitMQ ba\u011flant\u0131 bilgilerini g\u00fcvenli bir \u015fekilde saklamam\u0131z\u0131 sa\u011flar.<\/p>\n<p><em>keda-rabbitmq-secret.yaml;<\/em><\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napiVersion: v1\r\nkind: Secret\r\nmetadata:\r\n  name: keda-rabbitmq-secret\r\nstringData:\r\n  connectionstring: &quot;amqp:\/\/admin:admin@10.1.1.125:5672\/&quot;\r\n<\/pre>\n<\/div>\n<\/li>\n<li><strong><em>TriggerAuthentication<\/em><\/strong><br \/>\nSecret&#8217;taki bilgileri ScaledObject&#8217;a g\u00fcvenli bir \u015fekilde ba\u011flar.<\/p>\n<p><em>keda-trigger-authentication.yaml;<\/em><\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napiVersion: keda.sh\/v1alpha1\r\nkind: TriggerAuthentication\r\nmetadata:\r\n  name: keda-rabbitmq-authentication\r\nspec:\r\n  secretTargetRef:\r\n    - parameter: host \r\n      name: keda-rabbitmq-secret\r\n      key: connectionstring \r\n<\/pre>\n<\/div>\n<p>Dikkat ederseniz 8. sat\u0131rda <em>&#8216;keda-rabbitmq-secret&#8217;<\/em> name de\u011feri ile bir \u00f6nceki olu\u015fturdu\u011fumuz secret&#8217;tan connection string bilgileri \u00e7ekilmektedir.\n<\/li>\n<li><strong><em>ScaledObject<\/em><\/strong><br \/>\nDinamik \u00f6l\u00e7eklendirmenin t\u00fcm mant\u0131\u011f\u0131n\u0131 tan\u0131mlar. RabbitMQ trigger&#8217;\u0131n\u0131 (queue uzunlu\u011fu veya mesaj h\u0131z\u0131) belirtir, hedef Deployment&#8217;\u0131 ve \u00f6l\u00e7ek aral\u0131klar\u0131n\u0131 (min\/max replica) ayarlar. Ayr\u0131ca TriggerAuthentication&#8217;a referans verir.<\/p>\n<p><em>keda-consumer-scaledobject.yaml;<\/em><\/p>\n<div style=\"font-size: 12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napiVersion: keda.sh\/v1alpha1\r\nkind: ScaledObject\r\nmetadata:\r\n  name: keda-rabbitmq-consumer-scaledobject\r\n  namespace: default\r\nspec:\r\n  scaleTargetRef:\r\n    name: kedaqueueautoscaler-consumer-deployment # Dinamik \u00f6l\u00e7eklendirilecek Deployment'\u0131n ad\u0131\r\n  \r\n  pollingInterval: 5 # n saniyede bir \u00f6l\u00e7eklendirme tetikleyicisi kontrol edilir.\r\n  cooldownPeriod: 100 # \u00d6l\u00e7eklendirme i\u015flemi sonras\u0131 bekleme s\u00fcresi (saniye cinsinden)\r\n  minReplicaCount: 1 # Minimum pod say\u0131s\u0131\r\n  maxReplicaCount: 10 # Maximum pod say\u0131s\u0131\r\n      \r\n  triggers:\r\n    - type: rabbitmq\r\n      metadata:  \r\n        queueName: &quot;keda-queue-autoscaler-queue&quot; # T\u00fcketilecek RabbitMQ kuyru\u011funun ad\u0131\r\n        queueLength: &quot;5&quot; # Her bir pod i\u00e7in hedef kuyruk uzunlu\u011fu\r\n        includeUnacked: &quot;true&quot; # Onaylanmam\u0131\u015f mesajlar\u0131 da say\r\n      authenticationRef:\r\n        name: keda-rabbitmq-authentication # Daha \u00f6nce tan\u0131mlanm\u0131\u015f TriggerAuthentication kayna\u011f\u0131 ad\u0131\r\n<\/pre>\n<\/div>\n<\/li>\n<\/ul>\n<p>Bu yap\u0131land\u0131rmalarda bulunduktan sonra a\u015fa\u011f\u0131daki talimatlar\u0131 s\u0131ras\u0131yla verelim.<br \/>\n<code style=\"color:red;font-size:12px;\">kubectl apply -f '.\\Keda Configurations\\keda-rabbitmq-secret.yaml'<\/code><br \/>\n<code style=\"color:red;font-size:12px;\">kubectl apply -f '.\\Keda Configurations\\keda-trigger-authentication.yaml'<\/code><br \/>\n<code style=\"color:red;font-size:12px;\">kubectl apply -f '.\\Keda Configurations\\keda-consumer-scaledobject.yaml'<\/code><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-7.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-7.png\" alt=\"Kubernetes | KEDA \u0130le Queue Uzunlu\u011funa G\u00f6re Consumer Deployment&#039;\u0131 Otomatik \u00d6l\u00e7eklendirme\" width=\"727\" height=\"101\" class=\"aligncenter size-full wp-image-28158\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-7.png 727w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-7-300x42.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-7-720x101.png 720w\" sizes=\"auto, (max-width: 727px) 100vw, 727px\" \/><\/a><br \/>\n<strong>Test Edelim<\/strong><br \/>\nEvet&#8230; Art\u0131k yapt\u0131\u011f\u0131m\u0131z bu \u00e7al\u0131\u015fmalar neticesinde RabbitMQ&#8217;daki <em>&#8216;keda-queue-autoscaler-queue&#8217;<\/em> isimli kuyru\u011fa g\u00f6re dinamik \u00f6l\u00e7eklendirme ger\u00e7ekle\u015ftirilmesini bekleyebiliriz. Bunu h\u0131zl\u0131ca test edebilmemiz i\u00e7in <a href=\"http:\/\/localhost:8080\" target=\"_blank\">localhost:8080<\/a> adresine istekte bulunmam\u0131z gerekmektedir.<\/p>\n<p>\u0130stekte bulunman\u0131n hemen ard\u0131ndan Pod say\u0131s\u0131 dinamik \u00f6l\u00e7eklendirilmekte ve maksimum 10 adet olacak \u015fekilde replikalar artt\u0131r\u0131lmaktad\u0131r. Tabi bu s\u00fcre\u00e7 yava\u015f ilerledi\u011fi i\u00e7in hareketli ekran g\u00f6rseli payla\u015fmaktansa, Pod&#8217;lar\u0131n artt\u0131r\u0131lma s\u00fcrecinden bir kesitin g\u00f6rselini payla\u015fmay\u0131 daha uygun g\u00f6rmekteyim.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-5.png\" alt=\"Kubernetes | KEDA \u0130le Queue Uzunlu\u011funa G\u00f6re Consumer Deployment&#039;\u0131 Otomatik \u00d6l\u00e7eklendirme\" width=\"1567\" height=\"493\" class=\"aligncenter size-full wp-image-28160\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-5.png 1567w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-5-300x94.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-5-1024x322.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-5-768x242.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2025\/11\/Kubernetes-KEDA-Ile-Queue-Uzunluguna-Gore-Consumer-Deploymenti-Otomatik-Olceklendirme-5-1536x483.png 1536w\" sizes=\"auto, (max-width: 1567px) 100vw, 1567px\" \/><\/a>\u0130\u015fte, g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere consumer Pod&#8217;lar\u0131 kuyruktaki yo\u011funlu\u011fa g\u00f6re artt\u0131r\u0131lmaktad\u0131r. G\u00fcn\u00fcn sonunda t\u00fcm i\u015flemler bitip kuyruk s\u0131f\u0131rland\u0131\u011f\u0131 taktirde <strong><em>ScaledObject<\/em><\/strong> nesnesinde <code>minReplicaCount<\/code> de\u011ferinde belirtildi\u011fi \u00fczere en az 1 adet kalacak \u015fekilde azalt\u0131l\u0131yor olacakt\u0131r.<\/p>\n<p>\u0130\u015fte bu kadar \ud83d\ude42<\/p>\n<p>Nihai olarak;<\/p>\n<p>Art\u0131k a\u015fikard\u0131r ki, modern yaz\u0131l\u0131m mimarilerinde \u00f6l\u00e7eklendirme yaln\u0131zca bir tercih de\u011fil, sistemin s\u00fcrd\u00fcr\u00fclebilirli\u011fi ve verimlili\u011fi i\u00e7in vazge\u00e7ilmez bir gerekliliktir. \u00d6zellikle dinamik \u00f6l\u00e7eklendirme, hem zaman hem de maliyet a\u00e7\u0131s\u0131ndan kritik \u00f6neme sahip senaryolarda, kaynak kullan\u0131m\u0131n\u0131 ak\u0131ll\u0131ca optimize eden olmazsa olmaz bir teknolojik ihtiyaca d\u00f6n\u00fc\u015fm\u00fc\u015ft\u00fcr diyebiliriz. KEDA&#8217;n\u0131n sundu\u011fu esneklik, Kubernetes \u00fczerinde \u00e7al\u0131\u015fan uygulamalar\u0131n ger\u00e7ek y\u00fck durumuna g\u00f6re anl\u0131k tepki verebilmesini sa\u011flayarak geli\u015ftiricilere ve i\u015fletmelere ciddi bir avantaj sunmaktad\u0131r. Teorideki bile\u015fenleriyle, pratikteki konfig\u00fcrasyon ad\u0131mlar\u0131yla ele ald\u0131\u011f\u0131m\u0131z bu davran\u0131\u015f, \u00f6l\u00e7eklenebilir mimarilere y\u00f6nelik gereksinimlerin g\u00fcn ge\u00e7tik\u00e7e daha fazla artt\u0131\u011f\u0131 bir d\u00fcnyada, gelece\u011fin standartlarlar\u0131 aras\u0131nda yerini \u015fimdiden sa\u011flamla\u015ft\u0131rmaktad\u0131r. Bu ba\u011flamda, KEDA&#8217;n\u0131n yaln\u0131zca bir ara\u00e7 de\u011fil; modern cloud-native uygulamalar\u0131n dinamik ihtiya\u00e7lar\u0131na cevap veren stratejik bir anahtar niteli\u011finde davran\u0131\u015f oldu\u011funu vurgulamak, san\u0131r\u0131m pekte abart\u0131 olmasa gerek.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<p>Not : \u00d6rnek \u00e7al\u0131\u015fmaya a\u015fa\u011f\u0131daki GitHub adresinden eri\u015febilirsiniz.<br \/>\n<a target=\"_blank\" href=\"https:\/\/github.com\/gncyyldz\/Keda_Queue_AutoScaler\">https:\/\/github.com\/gncyyldz\/Keda_Queue_AutoScaler<\/a><\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, G\u00fcn\u00fcm\u00fcz\u00fcn cloud-native mimarilerinde \u00f6l\u00e7eklenebilirlik yaln\u0131zca sistem performans\u0131n\u0131n de\u011fil, ayn\u0131 zamanda operasyonel verimlili\u011fin de belirleyici fakt\u00f6rlerinden birisidir. \u00d6zellikle microservice yap\u0131lar\u0131nda, her bile\u015fenin farkl\u0131 y\u00fck profillerine sahip olmas\u0131; yatay \u00f6l\u00e7eklemenin dinamik, esnek ve ak\u0131ll\u0131 mekanizmalarla&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":28164,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3281,5456,3573],"tags":[5527,285,5516,5190,5515,5510,5513,5512,5507,5526,5523,5522,5525,5457,5514,5509,5520,3289,1728,5521,5508,5511,3158,5517,5518,5524,5519],"class_list":["post-28131","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-docker","category-kubernetes","category-microservices","tag-bitnami-helm","tag-controller","tag-custom-resource-definitions","tag-docker-compose","tag-event-driven-autoscaling","tag-helm","tag-horizontal-pod-autoscaler","tag-hpa","tag-keda","tag-keda-kurulumu","tag-keda-metrics-adapter","tag-keda-operator","tag-keda-scaler","tag-kubernetes","tag-kubernetes-event-driven-autoscaler","tag-kubernetes-scaling","tag-metrics-adapter","tag-microservices","tag-operator","tag-operator-controller","tag-queue-scaling","tag-queue-based-scaling","tag-rabbitmq","tag-scaledjob","tag-scaledobject","tag-scaler","tag-triggerauthentication"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28131","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=28131"}],"version-history":[{"count":17,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28131\/revisions"}],"predecessor-version":[{"id":28165,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28131\/revisions\/28165"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/28164"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=28131"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=28131"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=28131"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}