☕ Java & Spring Boot Entegrasyonu
Java & Spring Boot Entegrasyonu: Spring Kafka, ham Apache Kafka client'ını Spring Data JPA'nın JDBC'yi sardığı gibi sarar: connection açmayı, transaction yönetimini ve sonuç setl
Spring Kafka, ham Apache Kafka client'ını Spring Data JPA'nın JDBC'yi sardığı gibi sarar: connection açmayı, transaction yönetimini ve sonuç setlerini elle eşleştirmeyi manuel yapmak yerine bir metoda anotasyon eklersiniz ve Spring tüm lifecycle'ı kablolar. `@KafkaListener(topics = "orders")` ile otomatik deserializasyon, consumer group yönetimi, hata işleme ve offset commit'i elde edersiniz — eskiden 40 satır olan `KafkaConsumer.poll()` boilerplate kodu 2 satıra iner. Peki Spring bunu bu kadar temiz sardığı hâlde ham Kafka client API'sini neden öğrenmeye değer? Çünkü `@KafkaListener`'ınız yük altında sessizce mesaj düşürmeye başladığında veya CI'da her 30 saniyede bir rebalance yaptığında, teşhis etmenin tek yolu anotasyonun gerçekte ne yaptığını anlamaktır — `max.poll.records`, `session.timeout.ms`, `enable.auto.commit` Spring'in kendi özelliklerine eşleştirdiği ham client config'leridir ve birini yanlış ayarlamak dashboard'da sağlıklı görünen ama hiç offset commit etmeyen bir consumer üretir. Java açısından, ilişki Spring Data JPA ile ham JDBC arasındaki ilişkiyle birebir aynıdır: üretkenlik için soyutlamayı kullanırsınız ama soyutlamanın sızdığı %5'lik durumları debug etmek için altta yatan driver'ı anlamanız gerekir. QA için bu şu anlama gelir: bir `@KafkaListener` bileşenine karşı yapılan herhangi bir entegrasyon testi, işlemden sonra offset'lerin gerçekten commit edildiğini de doğrulamalıdır — işleyen ama commit etmeyen bir consumer, bir sonraki yeniden başlatmada tetiklenmeyi bekleyen bir yeniden işleme bombasıdır.
application.yml — Kafka yapılandırması
Micro Lab: Kod yazma
TODO satirini beklenen cozumdeki kritik satirla degistir. Bu gercek runtime degil; amac dogru yapinin yazilmasini kontrollu olarak pekistirmek.
application.yml'deki Her Satır Hangi Ham Kafka Config'ine Karşılık Gelir?
`bootstrap-servers: localhost:9092` — hem producer hem consumer'ın broker'ı bulacağı TEK adres; ikisi de bu satırı okur.
`producer.acks: all` + `retries: 3` — Java kodundaki `props.put("acks","all")` çağrısının YAML karşılığıdır; Spring bunu runtime'da otomatik `Properties` nesnesine çevirir.
consumer.auto-offset-reset…
`consumer.auto-offset-reset: earliest` — yeni bir consumer group ilk kez bağlandığında offset 0'dan mı yoksa sadece yeni mesajlardan mı başlayacağını belirler.
spring.json.trusted.packages…
`spring.json.trusted.packages: "com.example.events"` bir GÜVENLİK sınırıdır — `JsonDeserializer`, bu paket dışındaki bir sınıfa deserialize etmeyi REDDEDER, kötü niyetli bir payload'ın rastgele sınıf yüklemesini engeller.
Spring Boot Consumer — @KafkaListener
@KafkaListener Arkasında Poll Döngüsü Nasıl Gizlenir?
Raw API'deki while(true) {…