Apache Kafka: Mimari ve Zero Copy [1/5]

Apache Kafka: Architecture and Zero Copy [1/5]

Cihat Solak
Intertech
9 min readJun 29, 2024

--

Kafka, kendisini yalnızca bir mesaj kuyruk sistemi olarak değil, open-source distributed event streaming platform olarak tanımlar. Yüksek performans, dayanıklılık ve ölçeklenebilirlik sunarak gerçek zamanlı veri akışını sağlar. Geniş ekosistemi, Kafka Connect ve Kafka Stream gibi bileşenleriyle birlikte gelir. Bu özellikleri sayesinde, anlık veri işleme ve veri aktarma süreçlerinde idealdir. Diğer kuyruk sistemlerine kıyasla, Kafka’nın kendi ekosistemi içinde diğer bileşenleriyle uyumlu çalışması ve basit entegrasyonlarıyla öne çıkması ayırt edici özelliklerindendir.

Kafka can process high volumes of data with low latency.

Apache Kafka is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications.

(Apache Kafka, binlerce şirket tarafından yüksek performanslı veri hatları, akış analitiği, veri entegrasyonu ve görev açısından kritik uygulamalar için kullanılan açık kaynaklı bir dağıtılmış olay akışı platformudur.)

Kafka: Özellikleri ve Sunduğu Avantajlar

🟥 Scalability (Ölçeklenebilirlik): Kafka can handle a high volume of data with low latency. It is designed to be horizontally scalable, so you can add more brokers to the cluster as the data volume increases. (Kafka, düşük gecikme süresiyle yüksek hacimli verileri işleyebilir. Yatay olarak ölçeklenebilir olacak şekilde tasarlanmıştır, böylece veri hacmi arttıkça cluster’a daha fazla broker ekleyebilirsiniz.)

Günümüzde Kafka, Elasticsearch’in native cluster yapısına benzer bir yapı sunar. Bu, yatayda ölçeklenmeye uygun bir cluster yapısıdır ve sistemdeki problemler veya artan yük durumlarında kolayca ölçeklendirme imkanı sağlar.

RabbitMQ’da da native cluster yapısı bulunmasına rağmen, yatayda ölçeklenmeyi sağlayan sharding özelliği bulunmaz. Kafka’daki cluster yapısı ise, yatayda ölçeklenmeyi ve kuyruktaki verilerin parçalı şekilde farklı sanal makinelerde veya konteynerlerde tutulmasını sağlayarak yüksek hacimli trafiği işlemeye olanak tanır. Bu durum, Kafka’nın RabbitMQ’dan farklı olarak daha etkili bir şekilde büyük veri akışlarını işlemesine olanak sağlar.

RabbitMQ’da sharding özelliği doğrudan yerleşik olarak bulunmamaktadır. Ancak, RabbitMQ’da veri yükünü dağıtmak ve ölçeklendirmek için bazı yöntemler ve araçlar kullanılabilir. Sharding, veriyi yatay olarak bölmek ve farklı düğümlere dağıtmak anlamına gelir.

Sharding is a database partitioning technique that divides large databases into smaller, more manageable pieces called shards to improve performance and scalability.

🟧 Durability (Dayanıklılık): Kafka stores all published records for a configurable amount of time, providing durability in the event of system failures. (Kafka, yayınlanan tüm kayıtları yapılandırılabilir bir süre boyunca saklar ve sistem arızaları durumunda dayanıklılık sağlar.)

Kafka, mesajları kalıcı şekilde saklayabilme özelliğiyle diğer kuyruk sistemlerinden ayrılır. Diğer kuyruk sistemlerinde mesajlar işlendikten sonra genellikle kuyruktan silinirken, Kafka’da isteğe bağlı olarak silinmezler. Özellikle mikroservis ekosistemlerinde event sourcing pattern kullanıldığında, Kafka’yı eventlerin kalıcı olarak saklandığı bir veritabanı gibi kullanabiliriz. Bu özellik, Kafka’nın mesajları saklama ve geri alma yeteneği sayesinde öne çıkar.

Varsayılan (default) mesaj saklama süresi (retention period) genellikle 7 gündür. Bu süre log.retention.ms veya topic düzeyinde retention.ms yapılandırma parametreleri ile ayarlanabilir. Dolayısıyla talep edilirse ömür boyu şeklinde ayarlanabilir.

Örneğin, log.retention.ms=604800000 olarak ayarlanırsa (bu 7 gün anlamına gelir), mesajlar 7 gün boyunca saklanır ve ardından silinir.

Kafka can publish and consume data at large scale simultaneously with multiple consumer groups.

🟩 Fault Tolerance (Hata Toleransı): Kafka is designed to be highly available and can tolerate broker failures without losing data. (Kafka yüksek oranda kullanılabilir olacak şekilde tasarlanmıştır ve veri kaybı olmadan broker arızalarını tolere edebilir.)

Kafka, veriyi kopyalayarak (replica) kuyrukta saklar ve bu kopyaları farklı cluster node’larında tutabilir. Bu yapı, veri kaybına karşı son derece dirençli olmasını sağlar ve Kafka’yı popüler kuyruk sistemlerinden biri olan RabbitMQ’dan ayırır. Bu özellik, Kafka’nın yüksek toleranslı ve güvenilir bir veri iletim sistemi olmasını sağlar.

🟦 High Throughput (Yüksek Verimlilik): Kafka can process millions of records per second, making it suitable for high-throughput applications. (Kafka saniyede milyonlarca kaydı işleyebilir, bu da onu yüksek verimli uygulamalar için uygun hale getirir.)

Kafka, Zero Copy özelliği sayesinde mesajları belleği atlayarak, doğrudan fiziksel diske yazabilir. Bu, yüksek hacimli verilerin işlenmesini sağlar. Gelen bir mesaj genellikle önce belleğe kaydedilir ve ardından fiziksel diske yazılır. Ancak Kafka’nın bu özelliği sayesinde, belleği atlayarak doğrudan diske yazabilir, veri işleme sürecini hızlandırabilir.

🟫 Publish-Subscribe Model: Kafka uses a publish-subscribe model for messaging, where producers write data to kafka topics and consumers read from those topics. (Kafka, üreticilerin kafka konularına veri yazdığı ve tüketicilerin bu konulardan okuduğu mesajlaşma için bir yayınla-abone ol modeli kullanır.)

Diğer kuyruk sistemlerinde olduğu gibi, Kafka’da da publisher mesaj gönderirken, subscriber mesajları dinler. Ancak eğer gerçek zamanlı veya gerçek zamanlıya yakın (örneğin, veri tabanında yer alan tablodaki değişiklikleri kuyruğa göndermek gibi) bir senaryonuz varsa, Kafka daha iyi bir çözüm sunabilir.

🟪 Low Latency (Düşük Gecikme Süresi): Kafka has low latency, allowing for real-time processing of data streams. (amount of time required to process each message) (Kafka, veri akışlarının gerçek zamanlı işlenmesine olanak tanıyan düşük gecikme süresine sahiptir. (her bir mesajı işlemek için gereken süre)

Kullanıcıların üye olduğunda hoşgeldin email’i gibi sürekli ancak anlık olmayan olaylar için RabbitMQ tercih edilebilirken, mouse hareketleri, IoT cihazlarından alınan anlık veriler veya bir tablodaki değişikliklerin takip edilmesi gibi sürekli ve gerçek zamanlı veri akışı gerektiren durumlarda Kafka daha uygun olacaktır.

RabbitMQ, verinin daha kesintili bir şekilde aktığı senaryolar için idealdir. Örneğin, kullanıcıların yüklemiş veya yükleyeceği resimleri işlemek gibi durumlarda tercih edilebilir, çünkü bu senaryolarda anlık ve kesintisiz veri akışı beklenmez.

Kafka’nın karmaşık yapısı ve öğrenme eğrisi daha yüksek olduğundan, uygun olan sistemi uygun yerde kullanmak önemlidir. Genel olarak, anlık verinin aktığı yerlerde Kafka, verinin anlık akışının olmadığı yerlerde ise RabbitMQ kullanmak mantıklı bir seçim olabilir. Çünkü Kafka, karmaşık ve sürekli veri akışlarını daha profesyonel bir şekilde yönetir.

Kafka is optimized for real-time data processing, whereas RabbitMQ focuses on secure message delivery.

🟨 Support For Multiple Languages (Çoklu Dil Desteği): Kafka has client libraries for multiple programming languages, including Java, Phyton, and C++. (Kafka, Java, Phyton ve C++ dahil olmak üzere birden fazla programlama dili için istemci/client kütüphanelerine sahiptir.)

RabbitMQ, çeşitli dillerde geniş destek sunar ve Masstransit gibi araçlarla diğer uygulamalarla tam entegrasyon sağlar. Ancak Kafka’nın mevcut gücünden yararlanmak için Kafka’nın kendi native kütüphanesi tercih edilmelidir. Çünkü Kafka’nın kendi kütüphanesi, performans ve özelliklerin tam olarak kullanılmasını sağlar. MassTransit’in Kafka tarafına kısıtlı desteği vardır.

Masstransit, Kafka’yı kullanarak bir ileti sistemi oluşturmanıza ve işlemlerinizi Kafka üzerinden yönetmenize imkan tanır. Ancak, Kafka’nın tüm özelliklerini tam olarak desteklemeyebilir veya bazı gelişmiş özellikleriyle entegrasyonunda kısıtlamalar olabilir.

🟥 Integration With Other Systems (Diğer Sistemlerle Entegrasyon): Kafka can be easily integrated with other systems, such as Hadoop, Spark and Elasticsearch, using connectors. (Kafka, konektörler kullanılarak Hadoop, Spark ve Elasticsearch gibi diğer sistemlerle kolayca entegre edilebilir.)

Kafka’nın kendi ekosistemi, Kafka Connect, Kafka Streams, Elasticsearch gibi çeşitli bileşenlerle zenginleşmiştir ve farklı sistemlerle yüksek entegrasyon sağlar. Kod yazmadan bir problemi çözebilmek genellikle tercih edilir çünkü her yazılan kod, bakımı ve testi gerektirir. Bu nedenle, diğer kuyruk sistemlerinde ekstra kod yazma ihtiyacını ortadan kaldırarak Kafka’nın ekosistemi içindeki araçlarla problemler çözülebilir.

✔️✔️ RabbitMQ veya daha düşük seviyeli kuyruk sistemleri, anlık verinin bulunmadığı senaryolarda tercih edilebilir. Bu, RabbitMQ’nun anlık veriyi işleyemediği anlamına gelmez; ancak Kafka’da anlık veri işleme konusu diğer sistemlere göre daha profesyonel, basit ve sağlıklı bir şekilde ele alınır.

Zero Copy Nedir? Nasıl Çalışır? Ne Sağlar?

Apache Kafka’da zero copy terimi, veri aktarım sürecinde CPU kullanımını ve bellek kopyalama işlemlerini minimize eden bir teknik anlamına gelir. Bu teknik, Kafka’nın yüksek verimlilik ve düşük gecikme süreleriyle büyük hacimli verileri işleyebilmesini sağlar.

Kafka’s zero-copy feature allows for efficient data transfer by reducing CPU and memory usage during data transmission.

Çalışma Prensibi

Zero copy, veriyi bir yerden başka bir yere taşırken, verinin bellekte tekrar tekrar kopyalanmasını önler. Geleneksel veri aktarım yöntemlerinde, veri diskte okunur, uygulama belleğine kopyalanır ve ardından ağ üzerinden gönderilir. Bu süreç, CPU ve bellek kaynaklarını yoğun şekilde kullanır.

Kafka’da zero copy, özellikle Linux sistemlerinde, verinin diskten doğrudan ağ soketine taşınmasını sağlar. Bu, işletim sisteminin sağladığı sendfile sistem çağrısı ile gerçekleştirilir.

Kafka vs Geleneksek Kuyruk Sistemi

Apache Kafka is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications.

Design And Use Cases (Tasarım ve Kullanım Örnekleri)

Kafka ve diğer kuyruk sistemleri arasında benzerlikler olmasına rağmen, kullanılabilirlikleri ve performansları farklılık gösterebilir. Gerçek zamanlı veri işleme gerektiren durumlarda Kafka tercih edilirken, RabbitMQ gibi alternatifler ek kodlama gerektirebilir. En uygun kuyruk sistemi, mevcut ihtiyaçlara bağlı olarak değişecektir. Eğer mevcut sistem gereken işlevselliği sağlıyorsa, yeni bir geçiş yerine mevcut sistemi iyileştirmek daha mantıklı olabilir.

Distribution Model (Kafka-Pull | RabbitMQ-Push)

Publisher/Subscriber modeli diğer kuyruk sistemlerine benzerlik gösterir, ancak RabbitMQ’da mesajlar kuyruktan tüketicilere RabbitMQ tarafından iletilirken, Kafka’da tüketiciler mesajları kuyruktan almak için Kafka’ya talepte bulunurlar. Kafka’da bir tüketici mesajları almak için aktif olarak Kafka’ya sorgu gönderir, bu da sürekli bir sorgulama durumunu gerektirir.

Message Persistence Mechanism (Mesaj Kalıcılık Mekanizması)

Diğer kuyruk sistemlerinde, mesajlar işlendikten sonra genellikle silinirken, Kafka’da mesajlar varsayılan olarak 7 gün boyunca muhafaza edilir. İşlenen mesajlar ömür boyu saklanmak istenirse, bu talep doğrultusunda mümkün olabilir.

Performance and Scability (Performans ve Ölçeklenebilirlik)

Kafka, yüksek hacimli trafiği işleme kabiliyetindeki mimarisi ve ek özellikleriyle, veriyi doğrudan fiziksel diske kaydetme gibi yöntemler sayesinde etkin bir şekilde yönetebilir. Mimari yapısı, ElasticSearch benzeri bir yapıya sahiptir. Verileri bölümlere ayırır ve bu bölümleri ayrı ayrı replike eder. Ayrıca, hem bölümlendirme hem de parçalama (sharding) yapısı desteği sunar, bu da sistemin ölçeklenebilirliğini artırır ve esneklik sağlar. Bu nedenle, Kafka’nın büyütülüp küçültülmesi, diğer sistemlere kıyasla daha kolay ve daha verimlidir. Bu mimari, sistemdeki yük arttıkça büyüme ve küçülme işlemlerini kolaylaştırır.

Community and Ecosystem (Topluluk ve Ekosistem)

Kafka, kendi ekosistemiyle güçlü bir altyapı sunarak diğer kuyruk sistemlerinden ayrılır. Entegrasyon yeteneği sayesinde farklı bileşenlerle sorunları çözmek için Kafka veya bileşenlerini kullanarak kod yazma ihtiyacını ortadan kaldırır, böylece iş sorumluluklarını daha etkin bir şekilde yönetebiliriz.

Kafka, kuyruk sistemlerinden ziyade bir akış platformudur ve anlık veri trafiğini etkin bir şekilde yönetebilir. Ancak, küçük ölçekli problemler için veya verinin anlık akışının gerekmediği durumlarda, diğer kuyruk sistemlerinin tercih edilmesi daha uygun olabilir.

Typecial Use Case (Tipik Kullanım Örnekleri)

More than 80% of all Fortune 100 companies trust, and use Kafka.

Messaging (Kafka acts as as message broker) | Mesajlaşma (Kafka mesaj aracısı olarak görev yapar)

Kafka, klasik kuyruk sistemleri gibi kullanılabilir, ancak anlık veri akışının gerekmediği durumlarda daha temel ve doğal olan RabbitMQ gibi sistemler tercih edilebilir. Kafka’nın diğer kuyruk sistemlerine göre daha karmaşık bir yapısı vardır ve yeni bir yazılımcının RabbitMQ’ya aşina olma olasılığı daha yüksektir.

Application Activity Tracking (Uygulama Etkinliği Takibi)

Kafka, stok tablosundaki değişiklikler gibi anlık veri içeren senaryolar için daha uygun bir seçenektir. Örneğin, bir e-ticaret sitesinde stok tablosundaki herhangi bir değişiklik anında kaydedilerek, bu bilgilerin anlık olarak diğer sistemlerle paylaşılması gerekebilir. Bu durumda, Kafka gibi bir streaming platformu kullanmak, verinin hızlı ve güvenilir bir şekilde aktarılmasını sağlayabilir.

Log Aggregation (Günlük Toplama)

Sistemlerin gelişmesiyle birlikte log miktarları da artar, bu da logların farklı yerlere taşınması ihtiyacını doğurur. Kafka, logları farklı konumlara taşımak için ideal bir araçtır, özellikle ElasticSearch gibi depolama alanlarına entegre olabilen yapısıyla dikkat çeker. Bu sayede, logların etkili bir şekilde yönlendirilmesi ve depolanması sağlanabilir.

Real-time Data Processing (Gerçek Zamanlı Veri İşleme)

Kafka, özellikle anlık verinin yoğun olduğu ortamlarda tercih edilmesi gereken bir çözümdür.

--

--