Apache Kafka, dağıtılmış bir etkinlik deposu ve akış platformudur. Bu yazıda Kafka'yı, bileşenlerini ve bazı bilgileri çok fazla ayrıntıya girmeden açıklamak için elimden geleni yapacağım.



Bileşenler


Zookeeper


Zookeeper, Kafka küme düğümlerinin koordinasyonu ve durumunun izlenmesi için kullanılır. Ayrıca Kafka konularını (topic), bölümleri (partition), uzaklıkları (offset) vb. takip eder.


Cluster


Bu Kafka'ya özgü değildir, dolayısıyla dağıtılmış bilgi işlem sisteminde yaygın bir terminolojidir. Sadece ortak bir amaç doğrultusunda çalışan bir grup sunucudur. Kafka'nın dağıtılmış bir sistem olduğu göz önüne alındığında, kümesinde aracılar adı verilen bir grup sunucu bulunabilir. Tek Broker Kümesi ve Çoklu Broker Kümesi olmak üzere iki tür küme vardır.


Broker


Kafka aracısı, Kafka yazılımını çalıştıran ve verileri depolayan bir sunucudur. Kafka kümesinde bir veya daha fazla aracı bulunabilir. Üretici ile tüketici arasındaki olay alışverişinin sorumluluğundadır. Kafka üreticisi için olay alıcısı, Kafka tüketicisi için ise olay gönderici görevi görür.


Event


Olaylar durumdaki önemli bir değişikliktir. Sistemde "bir şey" olduğunda tetiklenirler. Kafka'ya veri okuduğunuzda veya yazdığınızda bunu olaylar biçiminde yaparsınız. Kavramsal olarak bir etkinliğin bir anahtarı, değeri, zaman damgası ve isteğe bağlı meta veri başlıkları bulunur.


Topic


Verilerin veya olayların saklandığı "kategorileri/grupları" temsil ederler. Kafka Konusu, bir veri akışına veya olay akışına verilen benzersiz bir addır. Örneğin "alarmlar".


Producer


Yapımcı, sorumluluğu Kafka'ya olayları yayınlamak/göndermek (yazmak) olan bir varlıktır. Bu sizin programınız. Etkinlik her zaman seçilen konuya gönderilir.


Consumer


Tüketici, sorumluluğu Kafka'dan olaylara abone olmak/almak (okumak) ve bunları iş mantığına göre işlemek olan bir varlıktır. Bu senin programın. Bir tüketici, etkinlikleri almak için bir veya daha fazla konuya abone olabilir.


Consumer Group


Birden fazla tüketicinin iş yükünü paylaşmak üzere birleştirildiği tüketici grubunu temsil eder. Birden fazla tüketici grubunun aynı veya farklı konulara abone olması mümkündür. Aynı tüketici grubundaki iki veya daha fazla tüketici aynı mesajı almıyor. Her tüketici her zaman farklı bir mesaj alır, böylece mükerrer işlem yapılmaz. Bunun nedeni, mesajın o tüketici grubundaki herhangi bir tüketici tarafından tüketildiği anda ofsetin bir sonraki sayıya geçmesidir.


Partition


Kafka'daki her konu bölümlere ayrılabilir. Kısa versiyon, Kafka'nın verileri daha verimli yönetmesini sağlayan bir konu içindeki bölümler halinde bölümler. Bir yapımcı, bir konuyu kullanarak komisyoncuya veri yazdığında, komisyoncu o konuyla bağlantılı verileri saklar. Çok büyük bir veri kümesi olması durumunda, komisyoncu bunu tek bir makinede saklamakta zorlanacaktır. Kafka'nın dağıtım sistemi olduğu göz önüne alındığında, konuyu bölümlere ayırarak ve bölümleri veri depolamak için farklı bir makineye dağıtarak bundan yararlanabiliriz. Bir konuya ilişkin bölüm sayısı konu oluşturma sırasında tanımlanır.


Offset


Kafka konusunun her bölümünde, her mesaja atanan bir sıra numarası (Offset) vardır. Bir bölüme yeni bir mesaj geldiğinde mesaja bir sıra numarası atanır. Herhangi bir konu için her bölümün farklı uzaklıkları olacaktır. Bu mahsup numarası konu bölümünde yerel olduğundan burada genel kavramı geçerli değildir. Buna dayanarak bir mesajı bulmak/tanımlamak istiyorsanız "Konu Adı - Bölüm No - Ofset No" komutunu kullanarak isim oluşturabilirsiniz.


Replica


Kafka'da çoğaltma, verilerin yalnızca bir aracıya değil birçok aracıya yazılması anlamına gelir. Çoğaltma faktörü bir konu ayarıdır ve konu oluşturma sırasında belirtilir. Çoğaltma faktörünün 1 olması, çoğaltmanın olmadığı anlamına gelir.


Bilgiler


Bu çok çok kısa bir liste ama "bilinmesi gereken" bazı listeler içeriyor. İsterseniz bu görselleştirme aracını kullanabilirsiniz.



Anlambilim


At-least-once (En azından bir kere)


Bir mesaj mutlaka bir kez yazılacaktır ancak birden fazla kez de yazılması mümkündür.


At-most-once (En fazla bir kez)


Bir mesaj kesinlikle en fazla bir kez yazılacaktır ancak muhtemelen hiç yazılmayabilir.


Exactly-once (Tam olarak bir kez)


Bir mesaj mutlaka bir kez yazılacaktır.


Öneriler



Some commands


// List all topics

$ kafka-topics.sh --bootstrap-server localhost:9092 --list
errors-topic
warnings-topic

// List details of a topic

$ kafka-topics.sh --bootstrap-server localhost:9092 --describe --topic errors-topic
Topic: errors-topic TopicId: EMvnZ6AXQ1O50G4yh4dLDA PartitionCount: 3 ReplicationFactor: 1 Configs: retention.ms=3600000,delete.retention.ms=3600000
Topic: errors-topic Partition: 0 Leader: 1 Replicas: 1 Isr: 1
Topic: errors-topic Partition: 1 Leader: 1 Replicas: 1 Isr: 1
Topic: errors-topic Partition: 2 Leader: 1 Replicas: 1 Isr: 1

// List all consumer groups

$ kafka-consumer-groups.sh --bootstrap-server localhost:9092 --list
errors-topic-group
warnings-topic-group

// List details of consumer group

$ kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group errors-topic-group
GROUP TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
errors-topic-group errors-topic 0 1 1 0 inanzzz-server-2e6992aa-107b-4eb4-82df-32478a7b9478 /172.31.0.1 inanzzz-server
errors-topic-group errors-topic 1 - 0 - inanzzz-server-2e6992aa-107b-4eb4-82df-32478a7b9478 /172.31.0.1 inanzzz-server
errors-topic-group errors-topic 2 - 0 - inanzzz-server-2e6992aa-107b-4eb4-82df-32478a7b9478 /172.31.0.1 inanzzz-server

// Purge messages in a topic by changing retention from 1 hour (3600000) to 1 second (1000). You should revert it afterwards!

$ kafka-configs.sh --bootstrap-server localhost:9092 --topic errors-topic --alter --add-config retention.ms=1000
Completed updating config for topic errors-topic.