Apache Kafkadan Veriler Nasıl Okunur?#3
Apache Kafka Nedir, Ne Zaman Kullanılır? ve Apache Kafka Replication ve Acknowledgment konularından sonra kafkadan veri nasıl okunur kavramlarından aşağıda detaylıca bahsedilmektedir.
Daha önceki içeriklerde bahsettiğimiz üzere, kafkada her bir topic içerisinde birden fazla partition yer alabilir. Kafkada consume eden servis, öncelikle hangi partition’dan okuyacaksa o şekilde hareket eder. Partition’larda ise pozisyonları belirten, “offset” kavramı karşımıza çıkar.
İlgili topic’teki 1.partition’da okuma yapan bir servisimizin olduğunu varsayalım. Eğer daha öncesinde okuma işlemine başladıysa, hangi offset’de kaldığını hangi offset’den veriyi okumaya devam edeceğini bilmesi gerekir(Bunu data streaming örneği olarak bir video player’a benzetebiliriz). İşte burada ise karşımıza daha önce de bahsettiğimiz zookeeper çıkıyor. Kısaca zookeeper’dan tekrar bahsetmekte fayda var.
Zookeeper: Broker’ların koordinasyonundan, leader partition seçiminden, silinen topiclerden haberdar olunmasından ve consumer’ın okuma işlemine hangi offset’de kaldığının tutulması gibi birçok sorumluluğu vardır.
Apache Kafkadan Veri Okuma
Yukarıda bahsettiğimiz senaryodan bağımsız, consume eden servisin ilgili partition’dan yeni okuma yapmaya başladığını farzedelim.
Consumer servisimiz ilk olarak ilgili topic’in ilgili partition’ındaki “offset 0” pozisyonundan mesajı okur. Ardından mesaj okunur okunmaz yapılması istenen işlem(process) gerçekleştirilir. Sonrasında ise diğer event’i/mesajı okuyabilmemiz için kafkaya “offset 0” pozisyonuyla işimizin bittiğini belirtmek için commit işlemi gerçekleştiririz.
Commit işlemi yapıldıktan sonra böylelikle kafka, ilgili partition’daki offset pozisyonunu ilerletir. Bizim senaryomuza göre offset pozisyon 1'e gelmiş olur. Ve burada hangi offset pozisyonunda olduğumuzun bilgisi ise zookeeper’a yazılır.
Yukarıda bahsettiğimiz kafkadan genel veri okuma mantığıdır diyebiliriz. Sırasıyla şu şekildedir:
- Event oku
- İşlem yap(db process veya business logic olabilir)
- Commit et
- Offset pozisyonu ilerlet.
Apache Kafkadan Veri Okuma Yöntemleri Nelerdir?
1-)At Most Once Yöntemi(En Fazla Bir Kere Okuma)
Consumer servisimizin içerisindeki Kafka Reader servisimizin, yazımızın başında bahsettiğimiz gibi ilgili partition’daki ilk offset’ten mesajı okur okumaz, commit ettiğimizi varsayalım.
Commit işleminden sonra bir takım process’ler ve db işlemlerin olduğunu düşünelim. Commit edildikten sonra ise kafka reader servisimizin down olduğunu farzedelim. Burada process’e gönderilecek mesaj yok olmuş oldu ve biz direkt olarak commit işlemi de gerçekleştirdiğimizden artık offset 0 pozisyonu kaybolmuştur. Tekrar kafka reader’ı ayağa kaldırdığımızda, offset 1 pozisyonundan devam edecektir. Bu okuma yöntemine “at most once” yani en fazla bir kere okuma yöntemi adı verilir. Bu okuma yönteminde mesajımızın kaybolma ihtimali oldukça yüksektir.
2-)At Least Once(En Az Bir Kere Okuma)
Consumer servisimizde aynı şekilde Kafka Reader -> process(business logic->db process işlemlerimizin olduğunu düşünelim.
At least once okuma yönteminde ise reader servisimiz öncelikle offset 0 pozisyonundan event’i okur, process işlemine dahil eder ve son olarak db işlemlerini gerçekleştirdikten sonra commit işlemini gerçekleştirir. Yani commit yaparak, offset pozisyonunu ilerletmiş olur. Commit ile okuduğu mesajla işinin bittiğini kafkaya haber vermiş olur. Bu senaryoda reader servisimiz down olsa dahi, commit işlemi son aşamada yapıldığından mesaj kaybolma ihtimali yoktur. Aynı mesajın birden fazla okunup, process işlemine dahil edilmesi söz konusu olabilir. Bu yüzden “en az bir kere okuma” yani “at least once” okuma yaklaşımı adı verilir. Mesaj kaybolma ihtimali olmadığından genellikle en çok tercih edilen yöntemdir diyebiliriz.
3-)Exactly Once(Tam Bir Kere)
Performans açısından tercih edilen “exactly once(tam bir kere okuma)” yöntemindeyse, ilgili partition’daki ilgili offset’ten(offset 0 pozisyonunu varsayalım) event okunur okunmaz hemen bir transaction başlatılır. Bu yaklaşımda kafka reader servisimiz down olsa dahi transaction içerisinde mesaj var olduğundan, mesaj kaybolma riski düşüktür.
Consumer Group Kavramı Nedir?
Aynı topic’ten veri okuyan birden fazla consumer’ın olması halinde aynı mesajın tekrar tekrar okunmaması için consumer group kavramı kullanılır.
Consumer group’da 2 adet consumer’ımızın olduğunu ve okuyacakları topic’de de 2 adet partition olduğunu düşünelim. Burada her bir consumer bir partition’ı okuyacaktır. Aynı consumer group içerisinde her bir consumer sadece bir partition’dan okuma gerçekleştirebilir. Ancak bu bahsettiğimiz gibi aynı consumer group’daki consumer’lar için geçerlidir. Eğer farklı bir consumer group daha söz konusu ise, yeni gruptaki consumer’lar da aynı partition’ı okuyabilirler.
Kafka ile ilgili diğer yazı serimizde ise uygulamalı olarak kafkayı implemente ettiğimiz ve projemize uygun olarak tüm konfigürasyonlarını ayarladığımız servisi yazacağız.