18/05/2024 - KAFKA
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.
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.
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.
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.
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.
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".
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.
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.
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.
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.
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.
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.
Bu çok çok kısa bir liste ama "bilinmesi gereken" bazı listeler içeriyor. İsterseniz bu görselleştirme aracını kullanabilirsiniz.
retention.ms
ve delete.retention.ms
ayarları konu oluşturma sırasında yapılandırılmışsa geçerlidir. Gerçek silme işlemi belirtilen süreden biraz daha uzun sürede başlar. Örneğin. (saklama ms + ~5 dakika)sarama.ProducerMessage.Key
alanını tuşladığınızdan emin olun. Mesajın hangi bölüme gideceğine, mesaj anahtarının karmasına (HashPartitioner
) göre karar verilir. Anahtar varyasyonu düşük ancak bölüm sayısı yüksekse bölümlerin çoğunun herhangi bir mesaj almamasının büyük olasılıkla mümkün olduğunu unutmayın. Örneğin. 6 anahtar varyasyon ve 30 bölüm olduğu göz önüne alındığında, yalnızca 6 bölüm bölümlerin amacını aşan mesajlar alacaktır. Emin olmadığınızda sarama.ProducerMessage.Key
ayarını RandomPartitioner
'ın bölümlerdeki mesaj tahsisini işlemesine izin verecek şekilde ayarlamaktan kaçının. Bu, en azından mesajları eşit şekilde dağıtacak ve tüketim performansını artıracaktır.Bir mesaj mutlaka bir kez yazılacaktır ancak birden fazla kez de yazılması mümkündür.
Bir mesaj kesinlikle en fazla bir kez yazılacaktır ancak muhtemelen hiç yazılmayabilir.
Bir mesaj mutlaka bir kez yazılacaktır.
isolation_level=1
kullanarak tüketici izolasyon düzeyinin yalnızca taahhüt edilen mesajları tüketecek şekilde ayarlandığından emin olun. - ref. Bunu yapmazsanız tüketici kaydedilmemiş ve iptal edilmiş mesajları tüketecektir.acks=all
komutunu kullanabilirsiniz - ref.enable.idempotence=true
komutunu kullanabilirsiniz - ref.auto.create.topics.enable=false
'ı kullanabilirsiniz. - ref. İşlemi özel bir servis tarafından manuel olarak gerçekleştirin.// 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.