{"id":31035,"date":"2025-10-05T00:42:18","date_gmt":"2025-10-04T21:42:18","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31035"},"modified":"2025-10-05T00:42:18","modified_gmt":"2025-10-04T21:42:18","slug":"giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/","title":{"rendered":"Giri\u015f: Mesaj Kuyruklar\u0131 ve RabbitMQ&#8217;ya Genel Bak\u0131\u015f"},"content":{"rendered":"<p><body><\/p>\n<h2>Giri\u015f: Mesaj Kuyruklar\u0131 ve RabbitMQ&#8217;ya Genel Bak\u0131\u015f<\/h2>\n<p>Modern yaz\u0131l\u0131m mimarilerinde sistemler aras\u0131 ileti\u015fimin verimli, g\u00fcvenilir ve esnek olmas\u0131 b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Bu ihtiyac\u0131 kar\u015f\u0131lamak \u00fczere mesaj kuyruklar\u0131 (message queues) devreye girer. Mesaj kuyruklar\u0131, farkl\u0131 servislerin birbirleriyle do\u011frudan ba\u011flant\u0131 kurmadan, asenkron bir \u015fekilde ileti\u015fim kurmas\u0131n\u0131 sa\u011flayan arac\u0131lar olarak i\u015flev g\u00f6r\u00fcr. Bu sayede servisler aras\u0131nda ba\u011f\u0131ml\u0131l\u0131k azal\u0131r, sistem daha esnek ve \u00f6l\u00e7eklenebilir hale gelir.<\/p>\n<p>RabbitMQ, AMQP (Advanced Message Queuing Protocol) standard\u0131n\u0131 uygulayan, a\u00e7\u0131k kaynakl\u0131, pop\u00fcler bir mesaj arac\u0131s\u0131d\u0131r (message broker). Y\u00fcksek performans, g\u00fcvenilirlik ve esneklik sunarak da\u011f\u0131t\u0131k sistemlerde mesajla\u015fma ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lar. RabbitMQ&#8217;nun temel bile\u015fenleri \u015funlard\u0131r:<\/p>\n<p>*   <strong>Producer (\u00dcretici):<\/strong> Mesajlar\u0131 RabbitMQ&#8217;ya g\u00f6nderen uygulama.<br \/>\n*   <strong>Consumer (T\u00fcketici):<\/strong> Mesajlar\u0131 RabbitMQ&#8217;dan al\u0131p i\u015fleyen uygulama.<br \/>\n*   <strong>Exchange (De\u011fi\u015f Toku\u015f):<\/strong> \u00dcreticiden gelen mesajlar\u0131, belirli kurallara g\u00f6re kuyruklara y\u00f6nlendiren mekanizma.<br \/>\n*   <strong>Queue (Kuyruk):<\/strong> Mesajlar\u0131n t\u00fcketiciler taraf\u0131ndan al\u0131nana kadar bekletildi\u011fi yer.<br \/>\n*   <strong>Binding (Ba\u011flama):<\/strong> Bir kuyruk ile bir exchange aras\u0131ndaki ba\u011flant\u0131y\u0131 tan\u0131mlayan kural. Bu kural genellikle bir &#8220;routing key&#8221; i\u00e7erir.<\/p>\n<p>Bu rehberde, RabbitMQ&#8217;nun g\u00fc\u00e7l\u00fc mesaj y\u00f6nlendirme yeteneklerinden biri olan &#8220;routing key&#8221; mekanizmas\u0131n\u0131, Python&#8217;\u0131n Puka k\u00fct\u00fcphanesi ile nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h2>Routing Keys ve Exchange Tipleri: Derinlemesine Bak\u0131\u015f<\/h2>\n<p>RabbitMQ&#8217;da mesajlar\u0131n do\u011fru kuyruklara ula\u015fmas\u0131n\u0131 sa\u011flayan en \u00f6nemli mekanizmalardan biri routing key&#8217;lerdir. Routing key, bir mesaj\u0131n g\u00f6nderildi\u011fi zaman atanm\u0131\u015f bir etikettir ve exchange taraf\u0131ndan mesaj\u0131n hangi kuyruklara y\u00f6nlendirilece\u011fini belirlemek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<h3>Routing Key Nedir?<\/h3>\n<p>Routing key, bir mesaj\u0131n &#8220;adresini&#8221; veya &#8220;kategorisini&#8221; belirten, nokta (.) ile ayr\u0131lm\u0131\u015f kelimelerden olu\u015fan bir dizedir (\u00f6rne\u011fin, <code>log.error.system_a<\/code>, <code>order.processed.web<\/code>). Exchange, bu routing key&#8217;i kullanarak ba\u011fl\u0131 oldu\u011fu kuyruklarla aras\u0131ndaki &#8220;binding key&#8221;leri kar\u015f\u0131la\u015ft\u0131r\u0131r ve e\u015fle\u015fen kuyruklara mesaj\u0131 iletir.<\/p>\n<h3>Exchange Tipleri ve Routing Keys \u0130li\u015fkisi<\/h3>\n<p>RabbitMQ&#8217;da d\u00f6rt ana exchange tipi bulunur ve her birinin routing key&#8217;leri i\u015fleme \u015fekli farkl\u0131d\u0131r:<\/p>\n<p>1.  <strong>Direct Exchange (Do\u011frudan De\u011fi\u015f Toku\u015f):<\/strong><br \/>\n    *   Mesaj\u0131, routing key&#8217;i ile binding key&#8217;i tam olarak e\u015fle\u015fen kuyruklara g\u00f6nderir.<br \/>\n    *   En basit y\u00f6nlendirme tipidir. \u00d6rne\u011fin, <code>log.info<\/code> routing key&#8217;ine sahip bir mesaj, sadece <code>log.info<\/code> binding key&#8217;i ile ba\u011flanm\u0131\u015f bir kuyru\u011fa gider.<br \/>\n    *   Tek bir t\u00fcketici veya belirli bir kategoriye ait mesajlar\u0131 spesifik bir kuyru\u011fa y\u00f6nlendirmek i\u00e7in idealdir.<\/p>\n<p>2.  <strong>Topic Exchange (Konu De\u011fi\u015f Toku\u015f):<\/strong><br \/>\n    *   Routing key&#8217;i ve binding key&#8217;i aras\u0131nda &#8220;desen e\u015fle\u015ftirme&#8221; (pattern matching) yaparak mesajlar\u0131 kuyruklara y\u00f6nlendirir.<br \/>\n    *   Binding key&#8217;lerde iki \u00f6zel karakter kullan\u0131labilir:<br \/>\n        <em>   <code><\/em><\/code> (y\u0131ld\u0131z): Bir kelimeyi temsil eder. \u00d6rne\u011fin, <code>log.*.critical<\/code> binding key&#8217;i, <code>log.system_a.critical<\/code> veya <code>log.system_b.critical<\/code> routing key&#8217;lerine sahip mesajlar\u0131 yakalar.<br \/>\n        *   <code>#<\/code> (kare): S\u0131f\u0131r veya daha fazla kelimeyi temsil eder. \u00d6rne\u011fin, <code>log.#<\/code> binding key&#8217;i, <code>log.info<\/code>, <code>log.error.system_a<\/code>, <code>log.debug.network.server1<\/code> gibi t\u00fcm routing key&#8217;lerine sahip mesajlar\u0131 yakalar.<br \/>\n    *   Esnek ve hiyerar\u015fik mesaj y\u00f6nlendirmesi gerekti\u011finde \u00e7ok kullan\u0131\u015fl\u0131d\u0131r.<\/p>\n<p>3.  <strong>Fanout Exchange (Yay\u0131nc\u0131 De\u011fi\u015f Toku\u015f):<\/strong><br \/>\n    *   Routing key&#8217;leri tamamen g\u00f6z ard\u0131 eder. Kendisine gelen her mesaj\u0131, kendisine ba\u011fl\u0131 olan t\u00fcm kuyruklara kopyalayarak g\u00f6nderir.<br \/>\n    *   Bir mesaj\u0131 birden \u00e7ok t\u00fcketiciye ayn\u0131 anda iletmek (yay\u0131n yapmak) i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>4.  <strong>Headers Exchange (Ba\u015fl\u0131klar De\u011fi\u015f Toku\u015f):<\/strong><br \/>\n    *   Routing key yerine, mesaj\u0131n ba\u015fl\u0131k (header) \u00f6zelliklerine g\u00f6re y\u00f6nlendirme yapar.<br \/>\n    *   <code>x-match<\/code> arg\u00fcman\u0131 (<code>any<\/code> veya <code>all<\/code>) ile ba\u015fl\u0131k e\u015fle\u015ftirme kurallar\u0131 belirlenir.<\/p>\n<p>Bu rehberde, \u00f6zellikle <code>direct<\/code> ve <code>topic<\/code> exchange tiplerini kullanarak routing key&#8217;ler ile mesaj y\u00f6nlendirmeye odaklanaca\u011f\u0131z, \u00e7\u00fcnk\u00fc bunlar routing key&#8217;lerin g\u00fcc\u00fcn\u00fc en iyi g\u00f6steren tiplerdir.<\/p>\n<h2>Puka K\u00fct\u00fcphanesi ile RabbitMQ Entegrasyonu<\/h2>\n<p>Puka, Python i\u00e7in hafif, asenkron ve kullan\u0131m\u0131 kolay bir RabbitMQ istemci k\u00fct\u00fcphanesidir. <code>asyncio<\/code> \u00fczerine in\u015fa edilmi\u015ftir, bu da onu y\u00fcksek performansl\u0131 ve e\u015fzamanl\u0131 uygulamalar i\u00e7in uygun k\u0131lar.<\/p>\n<h3>Neden Puka?<\/h3>\n<p>*   <strong>Asenkron:<\/strong> <code>asyncio<\/code> ile sorunsuz entegrasyon sayesinde blocking operasyonlar\u0131 minimize eder.<br \/>\n*   <strong>Basit API:<\/strong> RabbitMQ&#8217;nun karma\u015f\u0131k AMQP protokol\u00fcn\u00fc daha basit ve Pythonic bir aray\u00fczle sunar.<br \/>\n*   <strong>G\u00fcvenilir:<\/strong> Ba\u011flant\u0131 kesilmeleri ve yeniden ba\u011flant\u0131 gibi durumlar\u0131 y\u00f6netme yetene\u011fine sahiptir.<\/p>\n<h3>Kurulum<\/h3>\n<p>Puka&#8217;y\u0131 projenize dahil etmek i\u00e7in pip kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">pip install puka<\/code><\/pre>\n<h3>Temel Ba\u011flant\u0131 ve Yap\u0131land\u0131rma<\/h3>\n<p>Puka ile RabbitMQ&#8217;ya ba\u011flanmak olduk\u00e7a basittir. Genellikle <code>puka.Client<\/code> nesnesi olu\u015fturulur ve <code>connect()<\/code> metodu \u00e7a\u011fr\u0131l\u0131r.<\/p>\n<h3>Mesaj G\u00f6nderen (Producer) Uygulamas\u0131<\/h3>\n<p>A\u015fa\u011f\u0131daki \u00f6rnek, <code>direct<\/code> exchange kullanarak belirli bir routing key ile mesaj g\u00f6nderen bir \u00fcretici uygulamas\u0131d\u0131r.<\/p>\n<pre><code class=\"language-python\"># producer.py\nimport puka\nimport asyncio\n\nasync def publish_message():\n    client = puka.Client(\"amqp:\/\/localhost\/\") # RabbitMQ sunucusuna ba\u011flan\n    await client.connect()\n    print(\"RabbitMQ'ya ba\u015far\u0131yla ba\u011fland\u0131.\")\n\n    exchange_name = \"my_direct_exchange\" # Kullan\u0131lacak exchange ad\u0131\n    routing_key = \"log.info\"            # Mesaj\u0131n routing key'i\n    message_body = \"Bu bir bilgi mesaj\u0131d\u0131r: Sistem durumu normal.\"\n\n    # Exchange'i declare et (olu\u015ftur veya varsa kullan)\n    # type='direct' ile direct exchange oldu\u011funu belirtiyoruz\n    # durable=True ile RabbitMQ yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda exchange'in kal\u0131c\u0131 olmas\u0131n\u0131 sa\u011fl\u0131yoruz\n    await client.declare_exchange(exchange=exchange_name, type='direct', durable=True)\n    print(f\"Exchange '{exchange_name}' declare edildi.\")\n\n    # Mesaj\u0131 yay\u0131mla\n    # exchange, routing_key ve mesaj\u0131n kendisi (body) belirtilir\n    await client.publish(exchange=exchange_name, routing_key=routing_key, body=message_body.encode())\n    print(f\"Mesaj g\u00f6nderildi: '{message_body}' routing key: '{routing_key}'\")\n\n    await client.close() # Ba\u011flant\u0131y\u0131 kapat\n    print(\"Ba\u011flant\u0131 kapat\u0131ld\u0131.\")\n\nif __name__ == \"__main__\":\n    asyncio.run(publish_message())<\/code><\/pre>\n<p>Bu kodu \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131n\u0131zda, <code>my_direct_exchange<\/code> ad\u0131nda bir <code>direct<\/code> exchange olu\u015fturulacak (e\u011fer yoksa) ve <code>log.info<\/code> routing key&#8217;i ile bir mesaj g\u00f6nderilecektir.<\/p>\n<h3>Mesaj Alan (Consumer) Uygulamas\u0131<\/h3>\n<p>\u015eimdi de g\u00f6nderilen bu mesaj\u0131 alacak bir t\u00fcketici uygulamas\u0131 yazal\u0131m. Bu t\u00fcketici, <code>my_direct_exchange<\/code> exchange&#8217;ine <code>log.info<\/code> binding key&#8217;i ile ba\u011flanm\u0131\u015f bir kuyruk olu\u015fturacak ve bu kuyru\u011fa gelen mesajlar\u0131 dinleyecektir.<\/p>\n<pre><code class=\"language-python\"># consumer.py\nimport puka\nimport asyncio\n\nasync def on_message(client, channel, delivery, body):\n    \"\"\"\n    Mesaj al\u0131nd\u0131\u011f\u0131nda \u00e7a\u011fr\u0131lacak callback fonksiyonu.\n    \"\"\"\n    print(f\"Mesaj al\u0131nd\u0131: '{body.decode()}'\")\n    print(f\"  Exchange: {delivery.exchange}\")\n    print(f\"  Routing Key: {delivery.routing_key}\")\n    print(f\"  Delivery Tag: {delivery.delivery_tag}\")\n    \n    # Mesaj\u0131 ba\u015far\u0131yla i\u015fledi\u011fimizi RabbitMQ'ya bildiriyoruz.\n    # Bu, mesaj\u0131n kuyruktan silinmesini sa\u011flar.\n    await client.basic_ack(delivery.delivery_tag) \n\nasync def consume_messages():\n    client = puka.Client(\"amqp:\/\/localhost\/\")\n    await client.connect()\n    print(\"RabbitMQ'ya ba\u015far\u0131yla ba\u011fland\u0131.\")\n\n    exchange_name = \"my_direct_exchange\" # \u00dcreticinin kulland\u0131\u011f\u0131 exchange ad\u0131\n    queue_name = \"my_info_queue\"        # Bu t\u00fcketiciye \u00f6zel kuyruk ad\u0131\n    binding_key = \"log.info\"            # Kuyru\u011fun exchange'e ba\u011flan\u0131rken kullanaca\u011f\u0131 routing key\n\n    # Exchange'i declare et (\u00fcreticinin declare etti\u011fi ile ayn\u0131 olmal\u0131)\n    await client.declare_exchange(exchange=exchange_name, type='direct', durable=True)\n    print(f\"Exchange '{exchange_name}' declare edildi.\")\n\n    # Kuyru\u011fu declare et\n    # durable=True ile RabbitMQ yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda kuyru\u011fun kal\u0131c\u0131 olmas\u0131n\u0131 sa\u011fl\u0131yoruz\n    queue_info = await client.declare_queue(queue=queue_name, durable=True)\n    print(f\"Kuyruk '{queue_info.queue}' declare edildi.\")\n\n    # Kuyru\u011fu exchange'e routing key ile ba\u011fla\n    await client.queue_bind(queue=queue_info.queue, exchange=exchange_name, routing_key=binding_key)\n    print(f\"Kuyruk '{queue_info.queue}' exchange '{exchange_name}'e '{binding_key}' routing key'i ile ba\u011fland\u0131.\")\n\n    # Mesajlar\u0131 t\u00fcketmeye ba\u015fla\n    # no_ack=False ile mesajlar\u0131 manuel olarak onaylayaca\u011f\u0131m\u0131z\u0131 belirtiyoruz\n    await client.basic_consume(queue=queue_info.queue, no_ack=False, callback=on_message)\n    print(f\"Mesajlar dinleniyor. \u00c7\u0131kmak i\u00e7in CTRL+C.\")\n    \n    # Client'\u0131 a\u00e7\u0131k tutarak mesajlar\u0131 dinlemeye devam et\n    await client.wait() \n\nif __name__ == \"__main__\":\n    try:\n        asyncio.run(consume_messages())\n    except KeyboardInterrupt:\n        print(\"\\nConsumer durduruldu.\")<\/code><\/pre>\n<p>\u00d6nce <code>consumer.py<\/code>&#8216;yi \u00e7al\u0131\u015ft\u0131r\u0131n, ard\u0131ndan <code>producer.py<\/code>&#8216;yi \u00e7al\u0131\u015ft\u0131r\u0131n. T\u00fcketici terminalinde mesaj\u0131n al\u0131nd\u0131\u011f\u0131n\u0131 g\u00f6receksiniz. <code>log.error<\/code> gibi farkl\u0131 bir routing key ile mesaj g\u00f6ndermeyi denerseniz, <code>log.info<\/code>&#8216;ya ba\u011fl\u0131 olan bu t\u00fcketici mesaj\u0131 almayacakt\u0131r.<\/p>\n<h3>Topic Exchange ile Desen E\u015fle\u015ftirme<\/h3>\n<p><code>Topic<\/code> exchange kullanmak i\u00e7in <code>producer.py<\/code> ve <code>consumer.py<\/code> dosyalar\u0131nda <code>exchange_name<\/code> ve <code>type<\/code> parametrelerini de\u011fi\u015ftirmemiz yeterlidir.<\/p>\n<p><strong>Producer (topic_producer.py):<\/strong><\/p>\n<pre><code class=\"language-python\"># topic_producer.py\nimport puka\nimport asyncio\n\nasync def publish_topic_message():\n    client = puka.Client(\"amqp:\/\/localhost\/\")\n    await client.connect()\n    print(\"RabbitMQ'ya ba\u015far\u0131yla ba\u011fland\u0131.\")\n\n    exchange_name = \"my_topic_exchange\"\n    \n    # Farkl\u0131 routing key'ler ile mesaj g\u00f6nderelim\n    messages = [\n        (\"stock.us.nyse.ibm\", \"IBM hissesi y\u00fckseldi.\"),\n        (\"stock.eu.london.vod\", \"Vodafone hissesi d\u00fc\u015ft\u00fc.\"),\n        (\"log.error.db\", \"Veritaban\u0131 hatas\u0131!\"),\n        (\"log.info.web\", \"Web sunucusu bilgisi.\"),\n        (\"log.warn.api\", \"API uyar\u0131s\u0131.\"),\n    ]\n\n    await client.declare_exchange(exchange=exchange_name, type='topic', durable=True)\n    print(f\"Topic Exchange '{exchange_name}' declare edildi.\")\n\n    for routing_key, message_body in messages:\n        await client.publish(exchange=exchange_name, routing_key=routing_key, body=message_body.encode())\n        print(f\"Mesaj g\u00f6nderildi: '{message_body}' routing key: '{routing_key}'\")\n        await asyncio.sleep(0.5) # Biraz bekle\n\n    await client.close()\n    print(\"Ba\u011flant\u0131 kapat\u0131ld\u0131.\")\n\nif __name__ == \"__main__\":\n    asyncio.run(publish_topic_message())<\/code><\/pre>\n<p><strong>Consumer (topic_consumer.py):<\/strong><\/p>\n<p>Birden fazla t\u00fcketici olu\u015fturup farkl\u0131 binding key&#8217;lerle ba\u011flanarak <code>topic<\/code> exchange&#8217;in g\u00fcc\u00fcn\u00fc g\u00f6sterebiliriz.<\/p>\n<pre><code class=\"language-python\"># topic_consumer.py\nimport puka\nimport asyncio\nimport sys\n\nasync def on_message(client, channel, delivery, body):\n    print(f\"[{sys.argv[1]}] Mesaj al\u0131nd\u0131: '{body.decode()}' (Routing Key: {delivery.routing_key})\")\n    await client.basic_ack(delivery.delivery_tag)\n\nasync def consume_topic_messages(consumer_name, binding_key):\n    client = puka.Client(\"amqp:\/\/localhost\/\")\n    await client.connect()\n    print(f\"[{consumer_name}] RabbitMQ'ya ba\u015far\u0131yla ba\u011fland\u0131.\")\n\n    exchange_name = \"my_topic_exchange\"\n    queue_name = f\"queue_{consumer_name}\" # Her t\u00fcketici i\u00e7in farkl\u0131 bir kuyruk ad\u0131\n\n    await client.declare_exchange(exchange=exchange_name, type='topic', durable=True)\n    print(f\"[{consumer_name}] Topic Exchange '{exchange_name}' declare edildi.\")\n\n    queue_info = await client.declare_queue(queue=queue_name, durable=True)\n    print(f\"[{consumer_name}] Kuyruk '{queue_info.queue}' declare edildi.\")\n\n    await client.queue_bind(queue=queue_info.queue, exchange=exchange_name, routing_key=binding_key)\n    print(f\"[{consumer_name}] Kuyruk '{queue_info.queue}' exchange '{exchange_name}'e '{binding_key}' ile ba\u011fland\u0131.\")\n\n    await client.basic_consume(queue=queue_info.queue, no_ack=False, callback=on_message)\n    print(f\"[{consumer_name}] Mesajlar dinleniyor (Binding Key: '{binding_key}'). \u00c7\u0131kmak i\u00e7in CTRL+C.\")\n    await client.wait()\n\nif __name__ == \"__main__\":\n    if len(sys.argv) < 3:\n        print(\"Kullan\u0131m: python topic_consumer.py <consumer_ad\u0131> <binding_key>\")\n        print(\"\u00d6rnek: python topic_consumer.py all_logs 'log.#'\")\n        print(\"\u00d6rnek: python topic_consumer.py us_stocks 'stock.us.#'\")\n        print(\"\u00d6rnek: python topic_consumer.py error_logs 'log.error.*'\")\n        sys.exit(1)\n    \n    consumer_name = sys.argv[1]\n    binding_key = sys.argv[2]\n    \n    try:\n        asyncio.run(consume_topic_messages(consumer_name, binding_key))\n    except KeyboardInterrupt:\n        print(f\"\\n[{consumer_name}] Consumer durduruldu.\")<\/code><\/pre>\n<p>\u015eimdi farkl\u0131 terminallerde bu <code>topic_consumer.py<\/code>&#8216;yi farkl\u0131 binding key&#8217;lerle \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<p>*   <code>python topic_consumer.py all_logs 'log.#'<\/code> (T\u00fcm log mesajlar\u0131n\u0131 al\u0131r)<br \/>\n<em>   <code>python topic_consumer.py us_stocks 'stock.us.<\/em>'<\/code> (Sadece ABD hisse senedi mesajlar\u0131n\u0131 al\u0131r)<br \/>\n*   <code>python topic_consumer.py error_logs 'log.error.#'<\/code> (Sadece hata loglar\u0131n\u0131 al\u0131r)<\/p>\n<p>Ard\u0131ndan <code>topic_producer.py<\/code>&#8216;yi \u00e7al\u0131\u015ft\u0131r\u0131n. Her t\u00fcketicinin sadece kendi binding key&#8217;ine uyan mesajlar\u0131 ald\u0131\u011f\u0131n\u0131 g\u00f6receksiniz. Bu, <code>topic<\/code> exchange&#8217;in esnek y\u00f6nlendirme g\u00fcc\u00fcn\u00fc g\u00f6sterir.<\/p>\n<h2>Pratik \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar<\/h2>\n<p>RabbitMQ ve Puka ile \u00e7al\u0131\u015f\u0131rken uygulaman\u0131z\u0131n g\u00fcvenilirli\u011fini ve performans\u0131n\u0131 art\u0131rmak i\u00e7in baz\u0131 pratik ipu\u00e7lar\u0131:<\/p>\n<h3>Routing Key \u0130simlendirme Kurallar\u0131<\/h3>\n<p>*   <strong>Hiyerar\u015fik Yap\u0131:<\/strong> Routing key&#8217;leri nokta (.) ile ayr\u0131lm\u0131\u015f, anlaml\u0131 kelimelerden olu\u015fan hiyerar\u015fik bir yap\u0131ya sahip olacak \u015fekilde tasarlay\u0131n (\u00f6rn. <code>product.update.inventory<\/code>, <code>user.login.failed<\/code>).<br \/>\n*   <strong>K\u00fc\u00e7\u00fck Harf Kullan\u0131m\u0131:<\/strong> Tutarl\u0131l\u0131k i\u00e7in genellikle k\u00fc\u00e7\u00fck harf ve tire\/nokta ay\u0131r\u0131c\u0131lar tercih edilir.<br \/>\n*   <strong>Spesifikten Genele:<\/strong> En spesifik bilgiyi en sa\u011fa, en genel bilgiyi en sola koymak, <code>topic<\/code> exchange&#8217;lerde desen e\u015fle\u015ftirmeyi kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>Kal\u0131c\u0131l\u0131k (Durability)<\/h3>\n<p>*   <strong>Exchange Kal\u0131c\u0131l\u0131\u011f\u0131:<\/strong> <code>declare_exchange(durable=True)<\/code> ile RabbitMQ yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda exchange&#8217;in kaybolmamas\u0131n\u0131 sa\u011flay\u0131n.<br \/>\n*   <strong>Kuyruk Kal\u0131c\u0131l\u0131\u011f\u0131:<\/strong> <code>declare_queue(durable=True)<\/code> ile kuyruklar\u0131n da kal\u0131c\u0131 olmas\u0131n\u0131 sa\u011flay\u0131n.<br \/>\n*   <strong>Mesaj Kal\u0131c\u0131l\u0131\u011f\u0131:<\/strong> <code>publish(properties={'delivery_mode': 2})<\/code> ile mesajlar\u0131n diskte kal\u0131c\u0131 olmas\u0131n\u0131 sa\u011flay\u0131n. Bu, RabbitMQ \u00e7\u00f6kse bile mesajlar\u0131n kaybolmamas\u0131n\u0131 garantiler. Ancak performans maliyeti olabilir.<\/p>\n<h3>Mesaj Onaylama (Acknowledgements)<\/h3>\n<p>*   T\u00fcketiciler, bir mesaj\u0131 ba\u015far\u0131yla i\u015flediklerinde RabbitMQ&#8217;ya bir <code>ack<\/code> (acknowledgement) g\u00f6ndermelidir. <code>client.basic_ack(delivery.delivery_tag)<\/code> ile yap\u0131l\u0131r.<br \/>\n*   E\u011fer bir mesaj i\u015flenemezse, <code>nack<\/code> (negative acknowledgement) g\u00f6nderilebilir. Bu, mesaj\u0131n ba\u015fka bir t\u00fcketiciye yeniden teslim edilmesini veya bir &#8220;dead-letter queue&#8221;ya y\u00f6nlendirilmesini sa\u011flayabilir.<br \/>\n*   <code>no_ack=False<\/code> kullanmak, mesajlar\u0131n kaybolmamas\u0131n\u0131 garanti alt\u0131na al\u0131r. T\u00fcketici \u00e7\u00f6kse bile, i\u015flenmemi\u015f mesajlar kuyrukta kal\u0131r ve ba\u015fka bir t\u00fcketici taraf\u0131ndan al\u0131nabilir.<\/p>\n<h3>Hata Y\u00f6netimi ve Yeniden Denemeler<\/h3>\n<p>*   Mesaj i\u015fleme s\u0131ras\u0131nda olu\u015fan hatalar\u0131 yakalay\u0131n. Hatal\u0131 mesajlar i\u00e7in yeniden deneme mekanizmalar\u0131 veya &#8220;dead-letter queue&#8221; (\u00f6l\u00fc harf kuyru\u011fu) kullanarak bu mesajlar\u0131 ayr\u0131 bir kuyru\u011fa y\u00f6nlendirin. Bu, ana i\u015f ak\u0131\u015f\u0131n\u0131n t\u0131kanmas\u0131n\u0131 \u00f6nler.<\/p>\n<h3>\u00d6l\u00e7eklenebilirlik<\/h3>\n<p>*   Birden \u00e7ok t\u00fcketici ayn\u0131 kuyru\u011fa ba\u011flanabilir. RabbitMQ, mesajlar\u0131 bu t\u00fcketiciler aras\u0131nda Round-Robin (s\u0131rayla) da\u011f\u0131tarak i\u015f y\u00fck\u00fcn\u00fc dengeleyecektir. Bu, uygulaman\u0131z\u0131n yatayda \u00f6l\u00e7eklenmesini sa\u011flar.<\/p>\n<h3>Ba\u011flant\u0131 Y\u00f6netimi<\/h3>\n<p>*   Puka, asenkron yap\u0131s\u0131 sayesinde ba\u011flant\u0131 kesintilerini daha iyi y\u00f6netir. Ancak yine de uygulaman\u0131z\u0131n yeniden ba\u011flant\u0131 mant\u0131\u011f\u0131n\u0131 (retry logic) uygun \u015fekilde kurdu\u011fundan emin olun.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<p>Bu rehberde, RabbitMQ&#8217;nun routing key mekanizmas\u0131n\u0131 Puka Python k\u00fct\u00fcphanesi ile nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 detayl\u0131 bir \u015fekilde inceledik. <code>Direct<\/code> ve <code>Topic<\/code> exchange&#8217;ler arac\u0131l\u0131\u011f\u0131yla mesajlar\u0131n belirli kurallara g\u00f6re nas\u0131l y\u00f6nlendirilece\u011fini \u00f6\u011frendik. Routing key&#8217;ler, mesaj tabanl\u0131 mimarilerde esnek, g\u00fc\u00e7l\u00fc ve \u00f6l\u00e7eklenebilir bir ileti\u015fim altyap\u0131s\u0131 kurmak i\u00e7in vazge\u00e7ilmez bir ara\u00e7t\u0131r. Puka&#8217;n\u0131n asenkron yap\u0131s\u0131 ise Python uygulamalar\u0131n\u0131zda y\u00fcksek performansl\u0131 mesajla\u015fma \u00e7\u00f6z\u00fcmleri geli\u015ftirmenize olanak tan\u0131r.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><strong>S: Routing key ve binding key aras\u0131ndaki fark nedir?<\/strong><br \/>\n<strong>C:<\/strong> Routing key, bir mesaj\u0131n g\u00f6nderildi\u011fi zaman atanm\u0131\u015f etikettir. Binding key ise bir kuyru\u011fun bir exchange&#8217;e ba\u011flan\u0131rken kulland\u0131\u011f\u0131 filtredir. Exchange, mesaj\u0131n routing key&#8217;ini, ba\u011fl\u0131 kuyruklar\u0131n binding key&#8217;leriyle kar\u015f\u0131la\u015ft\u0131rarak mesaj\u0131 do\u011fru kuyru\u011fa y\u00f6nlendirir.<\/p>\n<p><strong>S: Hangi exchange tipini kullanmal\u0131y\u0131m?<\/strong><br \/>\n<strong>C:<\/strong><br \/>\n*   <strong>Direct Exchange:<\/strong> Mesaj\u0131, routing key&#8217;i ile binding key&#8217;i tam olarak e\u015fle\u015fen tek bir veya belirli bir kategoriye ait kuyru\u011fa g\u00f6ndermek istedi\u011finizde.<br \/>\n*   <strong>Topic Exchange:<\/strong> Esnek desen e\u015fle\u015ftirme ile hiyerar\u015fik routing key&#8217;lere sahip mesajlar\u0131 birden \u00e7ok farkl\u0131 kritere g\u00f6re kuyruklara y\u00f6nlendirmek istedi\u011finizde.<br \/>\n*   <strong>Fanout Exchange:<\/strong> Routing key&#8217;i g\u00f6z ard\u0131 ederek gelen her mesaj\u0131 t\u00fcm ba\u011fl\u0131 kuyruklara yay\u0131nlamak istedi\u011finizde.<br \/>\n*   <strong>Headers Exchange:<\/strong> Mesaj\u0131n ba\u015fl\u0131klar\u0131na g\u00f6re y\u00f6nlendirme yapmak istedi\u011finizde.<\/p>\n<p><strong>S: Puka yerine ba\u015fka Python k\u00fct\u00fcphaneleri var m\u0131?<\/strong><br \/>\n<strong>C:<\/strong> Evet, Python i\u00e7in pop\u00fcler RabbitMQ k\u00fct\u00fcphaneleri aras\u0131nda <code>pika<\/code> (hem senkron hem de asenkron kullan\u0131m se\u00e7enekleri sunar) ve <code>aio-pika<\/code> (Puka gibi <code>asyncio<\/code> tabanl\u0131, modern ve yayg\u0131n kullan\u0131lan bir di\u011fer k\u00fct\u00fcphane) bulunmaktad\u0131r. Se\u00e7im, projenizin gereksinimlerine ve tercih etti\u011finiz asenkron programlama stiline g\u00f6re de\u011fi\u015febilir. Puka, basitli\u011fi ve <code>asyncio<\/code> entegrasyonu ile iyi bir se\u00e7enektir.<\/p>\n<p><strong>S: Mesajlar\u0131n kaybolmamas\u0131n\u0131 nas\u0131l sa\u011flar\u0131m?<\/strong><br \/>\n<strong>C:<\/strong> Exchange&#8217;leri ve kuyruklar\u0131 <code>durable=True<\/code> ile kal\u0131c\u0131 yap\u0131n. Mesajlar\u0131 <code>delivery_mode=2<\/code> (persistent) ile g\u00f6nderin. T\u00fcketicilerde <code>no_ack=False<\/code> kullanarak mesajlar\u0131 ba\u015far\u0131yla i\u015fledikten sonra <code>basic_ack<\/code> ile onaylay\u0131n.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Giri\u015f: Mesaj Kuyruklar\u0131 ve RabbitMQ&#8217;ya Genel Bak\u0131\u015f\nModern yaz\u0131l\u0131m mimarilerinde sistemler aras\u0131 ileti\u015fimin verimli, g\u00fcvenilir ve esnek olm","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-31035","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Giri\u015f: Mesaj Kuyruklar\u0131 ve RabbitMQ&#039;ya Genel Bak\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Giri\u015f: Mesaj Kuyruklar\u0131 ve RabbitMQ&#039;ya Genel Bak\u0131\u015f\" \/>\n<meta property=\"og:description\" content=\"Giri\u015f: Mesaj Kuyruklar\u0131 ve RabbitMQ&#039;ya Genel Bak\u0131\u015f Modern yaz\u0131l\u0131m mimarilerinde sistemler aras\u0131 ileti\u015fimin verimli, g\u00fcvenilir ve esnek olm\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-04T21:42:18+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Giri\u015f: Mesaj Kuyruklar\u0131 ve RabbitMQ&#8217;ya Genel Bak\u0131\u015f\",\"datePublished\":\"2025-10-04T21:42:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/\"},\"wordCount\":1768,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/\",\"name\":\"Giri\u015f: Mesaj Kuyruklar\u0131 ve RabbitMQ'ya Genel Bak\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-04T21:42:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Giri\u015f: Mesaj Kuyruklar\u0131 ve RabbitMQ&#8217;ya Genel Bak\u0131\u015f\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Giri\u015f: Mesaj Kuyruklar\u0131 ve RabbitMQ'ya Genel Bak\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/","og_locale":"tr_TR","og_type":"article","og_title":"Giri\u015f: Mesaj Kuyruklar\u0131 ve RabbitMQ'ya Genel Bak\u0131\u015f","og_description":"Giri\u015f: Mesaj Kuyruklar\u0131 ve RabbitMQ'ya Genel Bak\u0131\u015f Modern yaz\u0131l\u0131m mimarilerinde sistemler aras\u0131 ileti\u015fimin verimli, g\u00fcvenilir ve esnek olm","og_url":"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-04T21:42:18+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Giri\u015f: Mesaj Kuyruklar\u0131 ve RabbitMQ&#8217;ya Genel Bak\u0131\u015f","datePublished":"2025-10-04T21:42:18+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/"},"wordCount":1768,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/","url":"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/","name":"Giri\u015f: Mesaj Kuyruklar\u0131 ve RabbitMQ'ya Genel Bak\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-04T21:42:18+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/giris-mesaj-kuyruklari-ve-rabbitmqya-genel-bakis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Giri\u015f: Mesaj Kuyruklar\u0131 ve RabbitMQ&#8217;ya Genel Bak\u0131\u015f"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31035","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=31035"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31035\/revisions"}],"predecessor-version":[{"id":31036,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31035\/revisions\/31036"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31035"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31035"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31035"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}