Takip et

3-Broker Kafka Cluster: Docker Compose ile Uygulamalı Kafka Öğrenimi

Günümüzün veri odaklı dünyasında, sistemler arası hızlı ve güvenilir veri akışı, uygulama performansının ve kullanıcı deneyiminin temelini oluşturuyor. Mikroservis mimarileri yükselişe geçtikçe, bu karmaşık yapıların birbirleriyle tutarlı bir şekilde konuşmasını sağlamak ise kritik bir ihtiyaç haline geldi. İşte tam bu noktada, Apache Kafka devreye giriyor. Peki, Kafka’nın gerçek gücünü ve dağıtık yapısının avantajlarını en iyi nasıl deneyimleyebilirsiniz? Elbette, uygulamalı bir yaklaşımla, kendi çoklu broker’lı kümenizi kurarak!

Modern uygulama geliştirme, genellikle bağımsız olarak çalışan küçük, odaklanmış servislerden oluşan mikroservis mimarisini benimser. Bu servisler, veri alışverişi yapmak ve iş akışlarını koordine etmek için etkili bir iletişim mekanizmasına ihtiyaç duyarlar. Apache Kafka, bu iletişim katmanını sağlamak için tasarlanmış, yüksek performanslı, ölçeklenebilir ve dayanıklı bir dağıtık akış platformudur.

Tek bir Kafka broker’ı ile başlamak cazip gelse de, bu yaklaşım Kafka’nın en temel faydalarını göz ardı etmek anlamına gelir: yüksek erişilebilirlik, hata toleransı ve ölçeklenebilirlik. Tek bir broker arızalandığında tüm sisteminiz durur ve bu, üretim ortamları için kabul edilemez bir risktir. Çoklu broker’lardan oluşan bir küme kurarak, verilerinizin birden fazla sunucuya dağıtılmasını ve çoğaltılmasını sağlarsınız. Bu, bir broker çevrimdışı kalsa bile verilerinize erişilebileceği ve sisteminizin kesintisiz çalışmaya devam edeceği anlamına gelir.

Uygulamalı olarak 3-broker’lı bir Kafka kümesi oluşturmak, bu dağıtık sistemin nasıl çalıştığını derinlemesine anlamanıza yardımcı olur. Broker’lar arası iletişimi, veri çoğaltma mekanizmalarını ve hata toleransının pratik uygulamalarını gözlemleme fırsatı bulursunuz. Bu sayede, “replication factor” (çoğaltma faktörü) veya “partitioning” (bölümleme) gibi kavramların teoride kalmayıp, somut bir deneyim haline gelmesini sağlarsınız. Ayrıca, gerçek dünya senaryolarında karşılaşabileceğiniz sorunları simüle etme ve bu sorunlara karşı sisteminizi nasıl daha dirençli hale getireceğinizi öğrenme şansı elde edersiniz. Örneğin, bir broker’ı bilerek kapatarak sistemin nasıl tepki verdiğini gözlemleyebilir, böylece Kafka’nın otomatik hata kurtarma özelliklerini deneyimleyebilirsiniz. Bu tür deneyimler, karmaşık dağıtık sistemleri tasarlarken ve yönetirken paha biçilmez içgörüler sunar. Dolayısıyla, Kafka öğrenme yolculuğunuzda sadece teorik bilgiyle yetinmek yerine, bu güçlü platformun kalbine inmek ve kendi ellerinizle bir küme kurmak, bilginizi pekiştirmenin en etkili yoludur.

Kafka’nın Temel Taşları Nelerdir?

Kafka’nın çalışma prensiplerini anlamak için bazı temel kavramları bilmek şarttır. Bu kavramlar, Kafka kümenizin nasıl veri depoladığını, işlediğini ve ilettiğini açıklar. İster tecrübeli bir geliştirici olun ister Kafka dünyasına yeni adım atın, bu yapı taşları sağlam bir temel oluşturmanıza yardımcı olacaktır.

  • Broker (Aracı): Kafka kümesinin ana bileşenidir. Bir broker, mesajları alır, depolar ve tüketicilere sunar. Her broker, disk üzerinde belirli bir miktarda depolama alanına sahiptir. Bir Kafka kümesi, genellikle birden fazla broker’dan oluşur ve bu broker’lar birlikte çalışarak yüksek erişilebilirlik ve ölçeklenebilirlik sağlar.
  • Topic (Konu): Kafka’da mesajların kategorize edildiği mantıksal bir adlandırma birimidir. Örneğin, bir e-ticaret uygulamasında ‘siparişler’, ‘ürünler’ veya ‘kullanıcı hareketleri’ gibi farklı topic’leriniz olabilir. Producer’lar mesajları topic’lere yazar, Consumer’lar ise topic’lerden mesajları okur.
  • Partition (Bölüm): Her topic, bir veya daha fazla partition’a ayrılır. Partition’lar, bir topic’in gerçekte verilerinin depolandığı sıralı, değiştirilemez birer kayıt günlüğüdür. Yeni mesajlar her zaman partition’ın sonuna eklenir. Partition’lar sayesinde Kafka, verileri yatay olarak ölçekleyebilir ve birden fazla broker’a dağıtabilir. Aynı topic’in farklı partition’ları, farklı broker’lar üzerinde barındırılabilir.
  • Offset (Ofset): Bir partition içindeki her mesajın benzersiz, sıralı bir kimliği vardır. Bu kimliğe “offset” denir. Consumer’lar, bir partition’daki mesajları okurken en son hangi offset’e kadar okuduklarını takip ederler. Bu, bir tüketici durdurulup tekrar başlatıldığında kaldığı yerden devam etmesini sağlar.
  • Producer (Üretici): Kafka topic’lerine mesaj gönderen istemci uygulamalardır. Producer’lar hangi topic’e ve hangi partition’a mesaj göndereceklerine karar verebilirler. Genellikle, mesajların anahtarlarına (key) göre belirli partition’lara yönlendirilmesi sağlanır, bu da aynı anahtara sahip mesajların her zaman aynı partition’a gitmesini garantiler ve mesajların sırasını korur.
  • Consumer (Tüketici): Kafka topic’lerinden mesaj okuyan istemci uygulamalardır. Consumer’lar genellikle bir “Consumer Group” (Tüketici Grubu) içinde çalışır. Aynı tüketici grubundaki farklı tüketiciler, bir topic’in farklı partition’larından mesajları eş zamanlı olarak işleyerek iş yükünü dağıtabilirler.
  • Zookeeper: Kafka’nın kendisi, dağıtık bir sistem olarak çalışmak için meta verileri (broker listeleri, topic konfigürasyonları, partition liderleri vb.) yönetmek üzere Apache ZooKeeper’a bağımlıdır. ZooKeeper, dağıtık koordinasyon hizmetleri sunan, yüksek oranda erişilebilir ve güvenilir bir servisidir. Kafka broker’ları ZooKeeper’a bağlanarak birbirlerini ve küme durumunu öğrenirler. Ancak Kafka’nın daha yeni sürümleri (KRaft modu) ZooKeeper bağımlılığını ortadan kaldırmayı hedeflemektedir. Bizim kuracağımız küme için hala ZooKeeper’a ihtiyacımız olacak.

Bu temel bileşenler, Kafka’nın nasıl yüksek performanslı ve güvenilir bir veri akış platformu sağladığını anlamanın anahtarıdır. Her bir bileşenin rolünü kavramak, karmaşık veri boru hatları tasarlarken ve sorun giderirken size büyük avantaj sağlayacaktır.

Docker ve Docker Compose Neden Kafka İçin İdeal Bir Çözüm?

Dağıtık sistemlerin kurulumu ve yönetimi, özellikle geliştirme veya test ortamlarında, genellikle zaman alıcı ve karmaşık olabilir. Bağımlılıkları kurmak, farklı servisleri yapılandırmak ve bunların birbiriyle uyumlu çalışmasını sağlamak, geliştiriciler için ciddi bir baş ağrısı haline gelebilir. İşte tam bu noktada Docker ve Docker Compose, Kafka gibi karmaşık sistemler için hayat kurtarıcı bir çözüm sunar.

Docker, uygulamaları ve bağımlılıklarını tek bir pakette (container – kapsayıcı) toplamanıza olanak tanıyan bir platformdur. Bu kapsayıcılar, herhangi bir ortamda (geliştirici makinesi, test sunucusu, üretim sunucusu) tutarlı bir şekilde çalışır. Kafka söz konusu olduğunda, bu şu anlama gelir: Bir Kafka broker’ını veya ZooKeeper’ı çalıştırmak için işletim sisteminize Java kurmak, JAR dosyalarını indirmek, ortam değişkenlerini ayarlamak gibi adımlarla uğraşmanıza gerek kalmaz. Sadece ilgili Docker imajını çekip çalıştırmanız yeterlidir. Her bir Kafka broker’ı veya ZooKeeper örneği kendi izole kapsayıcısında çalışır, bu da bağımlılık çakışmalarını ortadan kaldırır ve temiz bir çalışma ortamı sağlar.

Docker Compose ise, birden fazla Docker kapsayıcısını tanımlamanıza ve tek bir komutla çalıştırmanıza olanak tanıyan bir araçtır. Kafka kümesi gibi birden fazla servisten (ZooKeeper, birden fazla Kafka broker’ı) oluşan bir dağıtık sistemi kurarken, Docker Compose’un gücü ortaya çıkar. Tek bir docker-compose.yml dosyası ile tüm kümenizin mimarisini, her bir servisin yapılandırmasını (portlar, ortam değişkenleri, bağımlılıklar) ve aralarındaki ağ bağlantılarını deklaratif bir şekilde tanımlayabilirsiniz. Bu dosya, kümenizin “planı” gibidir. Bu yaklaşımın sunduğu avantajlar saymakla bitmez:

  • Kolay Kurulum ve Hızlı Başlangıç: Karmaşık kurulum adımları yerine sadece bir docker-compose up komutuyla tüm kümenizi saniyeler içinde ayağa kaldırabilirsiniz. Bu, özellikle yeni bir projeye başlarken veya bir ekip üyesinin ortamını kurarken büyük zaman kazancı sağlar.
  • Tekrarlanabilirlik: docker-compose.yml dosyası, kümenizin tam yapılandırmasını içerdiği için, aynı dosyayı kullanan herkes aynı ortamı elde eder. Bu, “benim makinemde çalışıyordu” gibi sorunları ortadan kaldırır ve geliştirme ile test ortamları arasında tutarlılık sağlar.
  • İzolasyon: Her servis kendi kapsayıcısında çalıştığı için, bağımlılık çakışmaları yaşanmaz. Bir serviste yapılan değişiklikler veya güncellemeler diğer servisleri doğrudan etkilemez. Bu da sorun gidermeyi ve hata ayıklamayı kolaylaştırır.
  • Versiyonlama ve Sürüm Kontrolü: docker-compose.yml dosyasını versiyon kontrol sisteminize (Git gibi) ekleyerek, kümenizin yapılandırmasını kodunuzla birlikte yönetebilirsiniz. Bu, farklı geliştirme aşamaları için farklı Kafka kümesi yapılandırmalarını kolayca denemenize olanak tanır.
  • Kaynak Verimliliği: Kapsayıcılar, sanal makinelere kıyasla daha hafiftir ve daha az kaynak tüketirler. Bu da, geliştirme makinenizde birden fazla servis içeren bir Kafka kümesini sorunsuzca çalıştırmanıza imkan tanır.

Özetle, Docker ve Docker Compose, Kafka’nın güçlü dağıtık yeteneklerini masaüstü bilgisayarınıza getirmek için mükemmel bir kombinasyon sunar. Karmaşıklığı soyutlayarak, öğrenme sürecinizi hızlandırır ve sizi Kafka’nın iç işleyişine odaklanmaya teşvik eder. Bu sayede, “nasıl kurulur” derdinden ziyade, “Kafka ile neler yapabilirim” sorusuna daha fazla odaklanabilirsiniz.

Adım Adım: 3-Broker Kafka Kümesi Nasıl Kurulur?

Kafka’nın teorik temellerini ve Docker’ın bize sağladığı kolaylıkları anladığımıza göre, artık kolları sıvayıp kendi 3-broker’lı Kafka kümemizi kurmanın zamanı geldi. Bu bölümde, adım adım bir docker-compose.yml dosyası oluşturacak, kümemizi ayağa kaldıracak ve temel kontrolleri yapacağız.

Gerekli Araçları Hazırlama: Nereden Başlamalıyız?

Başlamadan önce bilgisayarınızda kurulu olması gereken temel araçlar var:

  1. Docker Desktop: Docker Engine ve Docker Compose’u içeren entegre bir pakettir. Windows, macOS ve Linux için mevcuttur. Eğer kurulu değilse, Docker web sitesinden indirebilirsiniz. Kurulumdan sonra Docker Desktop uygulamasının çalıştığından emin olun.
  2. Metin Düzenleyici / IDE: docker-compose.yml dosyasını düzenlemek için Visual Studio Code gibi bir metin düzenleyiciye ihtiyacınız olacak.

Bu araçlar hazır olduğunda, yeni bir proje klasörü oluşturarak başlayabiliriz. Örneğin, masaüstünüzde kafka-cluster adında bir klasör oluşturun.

Docker Compose Dosyasını Oluşturma: Kafka Dünyamızı Şekillendiriyoruz

Oluşturduğumuz kafka-cluster klasörünün içine docker-compose.yml adında bir dosya oluşturun ve aşağıdaki içeriği bu dosyaya yapıştırın. Bu dosya, kümemizin tüm yapılandırmasını içerecek.


version: '3.8'

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.4.0
    hostname: zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
    restart: always

  kafka-broker-1:
    image: confluentinc/cp-kafka:7.4.0
    hostname: kafka-broker-1
    container_name: kafka-broker-1
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-broker-1:29092,PLAINTEXT_HOST://localhost:9092
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
    depends_on:
      - zookeeper
    restart: always

  kafka-broker-2:
    image: confluentinc/cp-kafka:7.4.0
    hostname: kafka-broker-2
    container_name: kafka-broker-2
    ports:
      - "9093:9092" # Dışarıdan 9093, içeride 9092
    environment:
      KAFKA_BROKER_ID: 2
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-broker-2:29093,PLAINTEXT_HOST://localhost:9093
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
    depends_on:
      - zookeeper
    restart: always

  kafka-broker-3:
    image: confluentinc/cp-kafka:7.4.0
    hostname: kafka-broker-3
    container_name: kafka-broker-3
    ports:
      - "9094:9092" # Dışarıdan 9094, içeride 9092
    environment:
      KAFKA_BROKER_ID: 3
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka-broker-3:29094,PLAINTEXT_HOST://localhost:9094
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
    depends_on:
      - zookeeper
    restart: always

  kafka-ui:
    image: provectuslabs/kafka-ui:latest
    container_name: kafka-ui
    ports:
      - "8080:8080"
    environment:
      KAFKA_CLUSTERS_0_NAME: local-kafka-cluster
      KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS: kafka-broker-1:29092,kafka-broker-2:29093,kafka-broker-3:29094
      KAFKA_CLUSTERS_0_ZOOKEEPER: zookeeper:2181
      KAFKA_CLUSTERS_0_JMX_PORT: 9999 # JMX bağlantısı için isteğe bağlı
      KAFKA_CLUSTERS_0_JMX_HOSTNAME: kafka-broker-1 # Broker'lardan birine bağlanması yeterli
    depends_on:
      - kafka-broker-1
      - kafka-broker-2
      - kafka-broker-3
    restart: always

docker-compose.yml Açıklaması:

  • version: '3.8': Docker Compose dosyasının format sürümünü belirtir.
  • services: Tanımlanacak tüm servisleri (kapsayıcıları) içerir.
  • zookeeper:
    • image: Confluent'in resmi ZooKeeper imajını kullanıyoruz.
    • ports: Yerel makinenizdeki 2181 portunu kapsayıcının 2181 portuna eşler.
    • environment: ZooKeeper için gerekli ortam değişkenlerini ayarlar.
  • kafka-broker-1, kafka-broker-2, kafka-broker-3:
    • image: Confluent'in resmi Kafka imajını kullanıyoruz.
    • ports: Her broker için farklı bir dış port (9092, 9093, 9094) kullanarak aynı iç porta (9092) yönlendirme yapıyoruz. Bu, yerel makinenizden her broker'a ayrı ayrı erişmenizi sağlar.
    • environment:
      • KAFKA_BROKER_ID: Her broker'ın küme içinde benzersiz bir ID'si olmalıdır. (1, 2, 3)
      • KAFKA_ZOOKEEPER_CONNECT: Kafka'nın bağlanacağı ZooKeeper servisini belirtir. (Örn: zookeeper:2181)
      • KAFKA_ADVERTISED_LISTENERS: Bu kritik bir ayardır. Kafka broker'ının kendisini diğer Kafka servislerine ve istemcilere (Producer/Consumer) hangi adres ve portta duyuracağını belirtir. İç ağ (Docker ağı) için PLAINTEXT://kafka-broker-1:29092 gibi bir yapı kullanırken, dışarıdan erişim (yerel makine) için PLAINTEXT_HOST://localhost:9092 gibi bir yapı kullanırız.
      • KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: Consumer offset'lerinin depolandığı dahili __consumer_offsets topic'i için çoğaltma faktörüdür. Geliştirme ortamında 1 olarak ayarlanması yeterlidir.
    • depends_on: Kafka broker'larının ZooKeeper servisi başlamadan başlamamasını sağlar.
  • kafka-ui: Kafka kümesini izlemek ve yönetmek için popüler bir web arayüzü olan Kafka UI'yı ekliyoruz.
    • ports: Yerel makinenizdeki 8080 portunu Kafka UI'ın 8080 portuna eşler.
    • environment: Kafka UI'ın hangi Kafka broker'larına bağlanacağını ve kümenin adını belirtiriz. KAFKA_CLUSTERS_0_BOOTSTRAPSERVERS kısmında, broker'ların Docker içindeki adreslerini (Örn: kafka-broker-1:29092) virgülle ayırarak belirtiriz.
    • depends_on: Tüm Kafka broker'larının başlamasını bekler.
Uzman İpucu: KAFKA_ADVERTISED_LISTENERS ayarı, özellikle Docker ortamlarında veya NAT arkasında çalışan Kafka kümelerinde doğru yapılandırılması gereken en kritik ayarlardan biridir. Yanlış ayarlandığında producer veya consumer'lar broker'lara bağlanmakta sorun yaşayabilir. İç ve dış erişim için ayrı dinleyiciler tanımlamak en iyi yaklaşımdır.

Kümemizi Ayağa Kaldırma ve Durumunu Kontrol Etme

Şimdi terminalinizi veya komut istemcinizi açın ve docker-cluster klasörüne gidin:


cd path/to/your/kafka-cluster

Ardından, tüm servisleri ayağa kaldırmak için aşağıdaki komutu çalıştırın:


docker-compose up -d

Bu komut, Docker Compose dosyasındaki tüm servisleri arka planda (-d detach modu) başlatacaktır. İmajların indirilmesi biraz zaman alabilir, bu tamamen internet hızınıza bağlıdır.

Servislerin durumunu kontrol etmek için:


docker-compose ps

Çıktıda tüm servislerin Up durumunda olduğunu görmelisiniz.

Herhangi bir servisin loglarını izlemek için (örneğin kafka-broker-1):


docker-compose logs -f kafka-broker-1

Kümenizi durdurmak ve kaldırmak için (container'lar, ağlar ve volume'ler dahil):


docker-compose down -v

Artık 3-broker'lı Kafka kümeniz ve bir yönetim arayüzü olan Kafka UI (http://localhost:8080 adresinden erişilebilir) hazır! Bu temel kurulum, Kafka'nın güçlü özelliklerini keşfetmek için sağlam bir zemin sunuyor.

Kafka Kümemizde Veri Akışı: Producer ve Consumer Nasıl Çalışır?

Kümemizi kurduk, şimdi sırada bu küme üzerinde gerçek bir veri akışı yaratmak var. Kafka'nın kalbinde, verilerin üreticiler (Producer) tarafından topic'lere yazılması ve tüketiciler (Consumer) tarafından bu topic'lerden okunması yatar. Bu bölümde, basit komut satırı araçlarını kullanarak bir topic oluşturacak, mesaj gönderecek ve bu mesajları tüketeceğiz.

Örnek Bir Konu (Topic) Oluşturma

Veri göndermeden önce mesajları kategorize edeceğimiz bir topic'e ihtiyacımız var. Kafka'nın kendi komut satırı araçları (Docker container'ı içinden erişilebilir) ile bu işlemi gerçekleştirebiliriz. kafka-broker-1 container'ı içinden topic oluşturma komutunu çalıştıracağız. Bu komutu çalıştırmak için öncelikle bir broker container'ı içine girmemiz gerekiyor:


docker exec -it kafka-broker-1 bash

Şimdi container içindeyiz. Topic oluşturma komutu:


kafka-topics --create --topic my-first-topic --bootstrap-server kafka-broker-1:29092,kafka-broker-2:29093,kafka-broker-3:29094 --partitions 3 --replication-factor 3

Komut Açıklaması:

  • kafka-topics: Kafka topic yönetimi için kullanılan araç.
  • --create: Yeni bir topic oluşturma emri.
  • --topic my-first-topic: Oluşturulacak topic'in adı.
  • --bootstrap-server kafka-broker-1:29092,kafka-broker-2:29093,kafka-broker-3:29094: Kafka kümesindeki broker'ların adreslerini belirtir. Burada Docker iç ağındaki adresleri kullanıyoruz.
  • --partitions 3: Topic'in 3 ayrı bölüme ayrılacağını belirtir. Bu, veri paralel işleme ve ölçeklenebilirlik için önemlidir.
  • --replication-factor 3: Her bir partition'ın 3 farklı broker'da kopyalanacağını belirtir. Bu, yüksek erişilebilirlik ve veri dayanıklılığı sağlar. Bir broker çevrimdışı kalsa bile veriler kaybolmaz.

Çıktıda Created topic my-first-topic. benzeri bir mesaj görmelisiniz. Artık container'dan exit yazarak çıkabilirsiniz.

Mesaj Üreticisi (Producer) ile Veri Gönderme

Şimdi oluşturduğumuz topic'e mesaj gönderelim. Yine kafka-broker-1 container'ı içinden komut satırı producer'ını çalıştırabiliriz:


docker exec -it kafka-broker-1 bash

Container içinde, mesaj göndermek için:


kafka-console-producer --topic my-first-topic --bootstrap-server kafka-broker-1:29092,kafka-broker-2:29093,kafka-broker-3:29094

Komutu çalıştırdıktan sonra, yanıp sönen bir imleç göreceksiniz. Buraya istediğiniz mesajları yazıp Enter tuşuna basarak gönderebilirsiniz:


Merhaba Kafka!
Bu benim ilk mesajım.
Uygulamalı öğrenmek harika!

Mesajları göndermeyi bitirdiğinizde Ctrl+C tuş kombinasyonu ile producer'dan çıkabilirsiniz. Ardından container'dan da exit yazarak çıkın.

Mesaj Tüketicisi (Consumer) ile Veri Alma

Gönderdiğimiz mesajları şimdi tüketelim. Başka bir terminal penceresi açın (veya aynı terminalde farklı bir sekme) ve yine bir Kafka broker container'ı içine girin (örneğin kafka-broker-2 bu sefer farklı bir broker kullanalım):


docker exec -it kafka-broker-2 bash

Container içinde, mesajları tüketmek için:


kafka-console-consumer --topic my-first-topic --bootstrap-server kafka-broker-1:29092,kafka-broker-2:29093,kafka-broker-3:29094 --from-beginning

Komut Açıklaması:

  • kafka-console-consumer: Kafka topic'lerinden mesaj tüketmek için kullanılan araç.
  • --from-beginning: Topic'teki tüm mevcut mesajları baştan itibaren okumak için kullanılır. Bu parametre olmadan, tüketici sadece komut çalıştırıldıktan sonra gelen mesajları okur.

Komutu çalıştırdığınızda, daha önce gönderdiğiniz mesajları terminalde görmelisiniz:


Merhaba Kafka!
Bu benim ilk mesajım.
Uygulamalı öğrenmek harika!

Şimdi başka bir terminalde producer'ı tekrar başlatıp yeni mesajlar göndermeyi deneyin. Consumer penceresinde bu yeni mesajların anında belirdiğini göreceksiniz. Bu, Kafka'nın gerçek zamanlı veri akışı yeteneğini gösterir.

Gerçek Dünya Senaryosu: Mikroservis İletişimi

Bu temel Producer/Consumer yapısını bir e-ticaret senaryosuna uyarlayalım. Bir sipariş uygulamasının yeni siparişleri bir Kafka topic'ine ('new-orders') gönderdiğini hayal edin. Bu, "Sipariş Producer" görevini üstlenir.

Ardından, farklı mikroservisler aynı new-orders topic'inden eş zamanlı olarak mesajları tüketebilir:

  • Ödeme Servisi (Consumer): Yeni siparişleri alır ve ödeme işlemlerini başlatır.
  • Envanter Servisi (Consumer): Yeni siparişleri alır ve stok güncellemelerini yapar.
  • Bildirim Servisi (Consumer): Yeni siparişleri alır ve müşteriye sipariş onayı e-postası veya SMS gönderir.
  • Analitik Servisi (Consumer): Yeni siparişleri alır ve gerçek zamanlı satış verilerini işler.

Bu senaryoda, her bir servis bağımsızdır ve kendi hızında çalışır. Sipariş uygulaması, tüm tüketicilerin hazır olup olmadığını düşünmeden siparişleri Kafka'ya bırakabilir. Kafka, mesajların güvenli bir şekilde depolanmasını ve tüm tüketicilere iletilmesini garanti eder. Eğer Envanter Servisi geçici olarak çevrimdışı kalırsa, Kafka mesajları onun için bekletir ve tekrar çevrimiçi olduğunda kaldığı yerden devam etmesini sağlar. Bu, mikroservislerin esnek, dayanıklı ve ölçeklenebilir olmasını sağlayan temel bir modeldir.

Bu basit örnekler ve senaryo, Kafka'nın dağıtık sistemlerde veri akışını nasıl kolaylaştırdığını ve farklı servisler arasında güvenilir bir iletişim köprüsü kurduğunu açıkça göstermektedir. Artık kendi kümenizle deney yapmaya hazırsınız!

Performans ve Yönetim İpuçları: Kafka'yı Daha Verimli Kullanmak

Kendi Kafka kümenizi başarıyla kurdunuz ve üzerinde veri akışını deneyimlediniz. Şimdi, bu güçlü platformu daha verimli kullanmak, performansını optimize etmek ve yönetimini kolaylaştırmak için bazı ileri düzey ipuçlarına göz atalım. Bu pratik bilgiler, Kafka'yı geliştirme ortamınızdan daha büyük ölçekli projelere taşırken size rehberlik edecektir.

İzleme ve Yönetim Araçları: Kafka UI/Control Center

Komut satırı, Kafka'yı öğrenmek için harika bir başlangıç noktası olsa da, büyük bir kümenin veya çok sayıda topic'in yönetimini ve izlenmesini zorlaştırabilir. İşte burada Kafka UI gibi araçlar devreye girer. Bizim docker-compose.yml dosyamızda da yer alan Kafka UI, web tabanlı bir arayüzdür ve şunları sağlar:

  • Topic'leri, partition'ları ve broker'ları görüntüleme.
  • Topic'lerin içine bakarak mesajları görme ve arama.
  • Consumer group'ları ve onların offset'lerini takip etme.
  • Yeni topic'ler oluşturma veya mevcut topic'leri silme (dikkatli olun!).

Kafka UI, geliştirme ve test ortamları için oldukça yeterli bir araçtır. Üretim ortamları için ise Confluent Control Center (Confluent platformunun bir parçasıdır) veya Apache Kafka'nın kendi izleme araçları gibi daha kapsamlı çözümler mevcuttur. Bu tür araçlar, Kafka kümenizin sağlığını, performans metriklerini (üretici/tüketici gecikmeleri, disk kullanımı, ağ trafiği vb.) gerçek zamanlı olarak izlemenize olanak tanır ve olası sorunları proaktif olarak tespit etmenize yardımcı olur.

Veri Bütünlüğü ve Tolerans: Replication Factor ve Acks

Kafka'nın en önemli avantajlarından biri veri bütünlüğü ve hata toleransıdır. Bu özellikleri doğru şekilde kullanmak, sisteminizin dayanıklılığını artırır.

  • Replication Factor (Çoğaltma Faktörü): Bir topic oluştururken --replication-factor parametresini kullanmıştık. Bu, her partition'ın kaç farklı broker'da kopyasının tutulacağını belirler. Örneğin, replication-factor 3, her partition'ın 3 farklı broker'da bir ana (leader) ve iki yedek (follower) kopyasının olacağı anlamına gelir. Bir broker arızalandığında, yedeklerden biri otomatik olarak yeni lider olur ve veri kaybı yaşanmaz. Üretim ortamlarında genellikle 3 olarak ayarlanır. Bu ayarı düşürmek performansı artırabilir ancak veri kaybı riskini yükseltir.
  • Acks (Acknowledgements): Producer'ların mesaj gönderirken broker'lardan beklediği onay seviyesini belirler.
    • acks=0: Producer mesajı gönderir ve herhangi bir onay beklemez. En düşük gecikme, en yüksek potansiyel veri kaybı riski.
    • acks=1: Producer, mesajın partition'ın liderine yazıldığını onayladıktan sonra devam eder. Orta seviye gecikme ve daha az veri kaybı riski.
    • acks=all (veya acks=-1): Producer, mesajın lider tarafından yazıldığını ve tüm in-sync yedeklere (ISR) çoğaltıldığını onayladıktan sonra devam eder. En yüksek gecikme, ancak veri kaybı riski neredeyse sıfırdır. Kritik veriler için bu ayar tercih edilir.

    Doğru acks ayarı, uygulamanızın veri güvenliği gereksinimleri ile performans beklentileri arasındaki dengeye bağlıdır.

Disk Alanı ve Ağ Kullanımı Optimizasyonu

Kafka, verileri diskte depolar ve bu da disk alanı yönetimi gerektirir. Ayrıca, yoğun veri akışı ağ kaynaklarını tüketebilir.

  • Mesaj Sıkıştırma: Producer'lar, mesajları broker'a göndermeden önce sıkıştırabilirler (gzip, snappy, lz4 gibi algoritmalarla). Bu, ağ bant genişliğini azaltır ve disk alanı tasarrufu sağlar. Tüketiciler, sıkıştırılmış mesajları otomatik olarak açar. Performans üzerinde minimal bir etkiyle büyük faydalar sağlayabilir.
  • Log Retention (Günlük Tutma): Kafka, mesajları belirli bir süre veya belirli bir boyuta ulaşana kadar saklar. Topic bazında retention.ms (mesajın ne kadar süre saklanacağı) ve retention.bytes (partition'ın diskte ne kadar yer kaplayacağı) ayarlarını yapılandırarak disk kullanımını kontrol edebilirsiniz. Varsayılan olarak 7 gün veya belirli bir boyuta ulaşana kadar saklanır. İhtiyaçlarınıza göre bu ayarları değiştirmek önemlidir.
  • Donanım Seçimi: Üretim ortamlarında Kafka için SSD diskler, yüksek ağ bant genişliği ve yeterli RAM, genel performansı önemli ölçüde artırır. Bu, özellikle yüksek throughput ve düşük gecikme gerektiren uygulamalar için kritiktir.

Bu ipuçları, Kafka kümenizi daha güvenilir, performanslı ve yönetilebilir hale getirmenize yardımcı olacaktır. Unutmayın, her sistemin kendine özgü gereksinimleri vardır, bu yüzden bu ayarları kendi kullanım durumunuza göre test etmek ve optimize etmek önemlidir.

Sonuç: Kafka Maceranız Daha Yeni Başlıyor!

Bu makale boyunca, Apache Kafka'nın modern veri akışı mimarilerindeki önemini, temel bileşenlerini ve Docker Compose ile nasıl hızlıca 3-broker'lı bir küme kurabileceğimizi detaylı bir şekilde inceledik. Kendi ellerinizle bir Kafka kümesi kurmak, topic oluşturmak, mesaj üretip tüketmek ve hatta bir yönetim arayüzü kullanmak, Kafka'nın gücünü ve esnekliğini pratik bir şekilde deneyimlemenizi sağlamıştır. Bu uygulamalı yaklaşım, karmaşık dağıtık sistemlerin altında yatan prensipleri anlamak için en etkili yollardan biridir.

Kafka'nın yüksek erişilebilirlik, ölçeklenebilirlik ve hata toleransı gibi özellikleri, onu günümüzün veri odaklı uygulamaları için vazgeçilmez bir araç haline getiriyor. Mikroservisler arası iletişimin omurgası olmaktan, gerçek zamanlı veri işleme ve analitik boru hatlarının temeline kadar geniş bir kullanım alanına sahiptir. Bu rehber, Kafka öğrenme yolculuğunuzun sadece başlangıcıdır. Şimdi öğrendiklerinizi kullanarak daha karmaşık senaryoları denemeye, farklı producer ve consumer kütüphaneleriyle çalışmaya ve gerçek uygulamalar geliştirmeye başlayabilirsiniz. Kafka dünyasında keşfedilecek çok daha fazlası var!

Sıkça Sorulan Sorular (SSS)

1. Üretim ortamında da Docker Compose kullanabilir miyim?

Cevap: Geliştirme ve test ortamları için Docker Compose mükemmel bir araçtır. Ancak üretim ortamları için genellikle Kubernetes gibi daha gelişmiş container orchestrasyon platformları veya Helm chart'ları tercih edilir. Bunun nedeni, Kubernetes'in otomatik ölçeklendirme, kendini iyileştirme, daha sofistike ağ ve depolama yönetimi gibi üretim düzeyinde ihtiyaç duyulan yetenekleri sağlamasıdır. Docker Compose, tek sunuculu (single-host) ortamlar için tasarlanmışken, Kubernetes çok sunuculu (multi-host) ve yüksek erişilebilirliğe sahip ortamlar için idealdir.

2. Kafka yerine başka bir mesaj kuyruğu sistemi kullanabilir miyim?

Cevap: Elbette. Kafka, özellikle yüksek hacimli gerçek zamanlı veri akışı ve olay tabanlı mimariler için tasarlanmıştır. Ancak daha geleneksel mesaj kuyruğu ihtiyaçlarınız varsa, RabbitMQ veya ActiveMQ gibi çözümler de değerlendirilebilir. Bu sistemler, genellikle daha düşük gecikme süresi gerektiren, daha çok istek/cevap (request/response) tarzı iletişimler için uygundur. Seçim, projenizin spesifik gereksinimlerine, veri hacmine, gecikme beklentilerine ve hata toleransı ihtiyaçlarına bağlıdır.

3. Kafka'da veri depolama süresini nasıl ayarlarım?

Cevap: Kafka'da verilerin diskte ne kadar süre saklanacağını (log retention) topic bazında veya broker bazında ayarlayabilirsiniz. En yaygın kullanılan ayarlar şunlardır:

  • retention.ms: Mesajların milisaniye cinsinden ne kadar süre saklanacağını belirtir. Örneğin, 604800000 ms (7 gün).
  • retention.bytes: Bir partition'ın diskte tutabileceği maksimum veri boyutunu bayt cinsinden belirtir. Bu sınıra ulaşıldığında en eski mesajlar silinir.

Bu ayarları topic oluştururken veya mevcut bir topic'i güncellerken kafka-configs aracıyla yapabilirsiniz. Örneğin, mevcut bir topic'i güncellemek için:


docker exec -it kafka-broker-1 kafka-configs --bootstrap-server kafka-broker-1:29092 --alter --topic my-first-topic --add-config retention.ms=86400000


(Bu komut, my-first-topic adlı topic'in mesaj saklama süresini 1 güne ayarlar.)

4. Kafka kümemi geliştirmek için hangi kaynakları kullanabilirim?

Cevap: Kafka'yı daha derinlemesine öğrenmek için birçok harika kaynak bulunmaktadır:

  • Apache Kafka Resmi Dokümantasyonu: En doğru ve güncel bilgi kaynağıdır.
  • Confluent Blog ve Dokümantasyon: Confluent, Kafka'nın arkasındaki şirket olup, çok sayıda açıklayıcı blog yazısı ve derinlemesine dokümantasyon sunar.
  • Çevrimiçi Kurslar: Udemy, Coursera gibi platformlarda Kafka'ya özel kurslar bulabilirsiniz.
  • Kitaplar: "Kafka: The Definitive Guide" gibi kitaplar, konuyu kapsamlı bir şekilde ele alır.
  • Topluluk Forumları ve GitHub: Sorularınızı sormak ve diğer geliştiricilerle etkileşim kurmak için harika yerlerdir.

5. Bu küme yapısı mobil uygulamalar için nasıl kullanılabilir?

Cevap: Doğrudan mobil uygulamalarınızdan bir Kafka kümesine bağlanmak genellikle iyi bir uygulama değildir. Bunun yerine, mobil uygulamalarınız, API Gateway veya arka uç servisleriniz üzerinden Kafka ile etkileşime girmelidir. Mobil uygulama, bir REST API'ye istek gönderir, bu arka uç servisi Kafka'ya bir mesaj (producer) yazar veya Kafka'dan mesajları tüketip (consumer) mobil uygulamaya uygun formatta geri döndürür. Mobil uygulamalarınızın kullanıcı arayüzünü (UI) tasarlarken, verileri gerçek zamanlı olarak Kafka'dan alan bir arka uç servisinin bu verileri mobil uyumlu (responsive) bir şekilde sunabilmesi için modern web geliştirme tekniklerini (örneğin, CSS media query'ler, esnek düzenler) kullanmanız gerekebilir. Bu, uygulamanızın farklı ekran boyutlarına ve cihazlara dinamik olarak uyum sağlamasını sağlar.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.