Apache Kafka 💫 🌌 ✨
Tags: pubsub, kafka, apachekafka, queue
Published: 2021-12-25 21:12:00

Apache Kafka, verileri uygun ölçekte toplamak, işlemek, depolamak ve analiz etmek için en popüler açık kaynaklı akış izleme yazılımıdır. Mükemmel performansı, düşük gecikme süresi, hata toleransı ve yüksek verimi ile bilinir ve saniyede binlerce mesajı işleyebilir. (1)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ae631eh1aewk9uc8vvod.jpeg)

Apache Kafka açık kaynaklı, dağıtılmış (distrubuted) bir publish-subscribe (yayınla-abone ol) mesajlaşma sistemidir.

**Esas olarak aşağıdaki özelliklerle tasarlanmıştır:**

**Kalıcı mesajlaşma (Persistent messaging):** Apache Kafka, O(1) disk yapıları ile tasarlanmıştır. Çok büyük boyutlarda bile sabit zamanlı performans sağlar.

**Yüksek aktarım hızı (High throughput) :** Büyük verileri göz önünde bulunduran Kafka, ticari donanımlar üzerinde çalışmak ve saniyede milyonlarca iletiyi desteklemek üzere tasarlanmıştır.

**Dağıtılmış (Distrubuted):** Apache Kafka mesajları Kafka sunucuları (Kafka servers) üzerinde bölümlendirmeyi ve tüketimi bir tüketici makineleri kümesi (cluster of consumer machines) üzerinde dağıtmayı açıkça destekler.

**Çoklu istemci desteği (Multiple client support):** Apache Kafka sistemi, Java, .NET, PHP, Ruby ve Python gibi farklı platformlardan istemcilerin kolay entegrasyonunu destekler.

**Gerçek zamanlı (Real time):** Üretici ileti dizileri (producer threads) tarafından üretilen mesajlar, tüketici ileti dizileri (consumer threads) tarafından anında görülebilmelidir; bu özellik, Karmaşık Olay İşleme (Complex Event Processing - CEP) sistemleri gibi olay tabanlı (event-based ) sistemler için kritik öneme sahiptir.
Kafka, Hadoop sistemlerinde paralel veri yüklemeyi de destekler.

Aşağıdaki şema, tipik bir büyük veri toplama ve analiz senaryosunu göstermektedir.


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3m8pqog57jg98s3tor2a.png)

**Etkinlik Akışı (Event Streaming) Nedir?**
Olay akışı, veri tabanları, sensörler, mobil cihazlar, bulut hizmetleri ve yazılım uygulamaları gibi olay kaynaklarından olay akışları biçiminde gerçek zamanlı olarak veri yakalama uygulamasıdır ve doğru bilginin doğru yerde, doğru zamanda olması için verilerin sürekli akışını ve yorumlamasını sağlar. (3)

**Etkinlik Akışını Ne İçin Kullanabilirim?**

•Borsalar, bankalar ve sigortalar gibi ödemeleri ve finansal işlemleri gerçek zamanlı olarak işlemek için.
•Lojistik ve otomotiv endüstrisinde olduğu gibi otomobilleri, kamyonları, filoları ve gönderileri gerçek zamanlı olarak izlemek için
•IoT cihazlarından veya diğer ekipmanlardan sensor verilerini sürekli olarak yakalamak ve analiz etmek.
•Perakende, otel ve seyahat endüstrisi ve mobil uygulamalar gibi müşteri etkileşimlerini ve siparişlerini toplamak ve anında tepki vermek.
•Hastane bakımındaki hastaları izlemek ve acil durumlarda zamanında tedaviyi sağlamak için durum değişikliklerini tahmin etmek.
•Bir şirketin farklı bölümleri tarafından üretilen verileri birbirine bağlamak, depolamak ve kullanıma sunmak. (3)

**Şirketler Kafkayı Hangi Amaçlarla Kullanıyor?**

**New York Times:** Yayınlanan içeriği gerçek zamanlı olarak depolamak ve okuyucuların kullanımına sunan çeşitli uygulamalara ve sistemlere dağıtmak için Apache Kafka ve Kafka Akışları API'sini kullanır.

**Pinterest:** Reklam altyapılarının gerçek zamanlı, tahmine dayalı bütçeleme sistemine güç sağlamak için Apache Kafka ve Kafka Streams API'sini büyük ölçekte kullanır.

**Linkedin:** Apache Kafka, LinkedIn'de etkinlik akışı verileri (activity stream data) ve operasyonel ölçümler için kullanılır. (Örneğin Profilime kimler baktı)

**Firefox:** Kafka'yı, Telemetri, Test Pilotu vb. projeler için son kullanıcı tarayıcısından performans ve kullanım verilerini toplamak için kullanır.

**Spotify:** Kafka, Spotify'da günlük dağıtım sistemlerinin (log delivery system) parçası olarak kullanılır.

**Twitter:** Storm akışını işleme altyapılarının bir parçası olarak kafkayı kullanır.

**Trivago:** Storm'da akış işleme ve uygulama günlüklerinin işlenmesi için Kafka'yı kullanır.

**Urban Airship:** Mobil cihazlardan gelen veri noktalarını ara belleğe almak için Kafka'yı kullanır.

**Adidas:** Kafka'yı Hızlı Veri Akışı Platformunun çekirdeği olarak kullanarak kaynak sistemleri entegre eder ve ekiplerin izleme, analiz ve raporlama çözümleri için gerçek zamanlı olay işleme uygulamasına olanak tanır.

**Uber:** Apache Kafka, Uber'in genel altyapı yığınının temel bir parçasıdır ve çeşitli çevrimiçi ve neredeyse gerçek zamanlı kullanım durumlarına güç sağlar.

**Hacker Rank:** Kafka'yı bir hizmet platformu olarak olaylar olarak kullanır. Altyapısındaki tüm dahili faaliyetleri Kafka'da yayınlar ve çok çeşitli dahili hizmetler buna abone olur.

**Netflix:** Gerçek zamanlı izleme ve olay işleme hattı için Kafka'yı kullanır.

**Oracle:** Geliştiricilerin aşamalı veri işlem hatlarını uygulamak için OSB'nin yerleşik arabuluculuk özelliklerinden yararlanmalarına olanak tanıyan OSB (Oracle Service Bus) adlı Enterprise Service Bus ürününden Kafka'ya yerel bağlantı sağlar.

**Rabobank:** Hollanda'nın en büyük 3 bankasından biridir. Müşterileri finansal olaylar hakkında gerçek zamanlı olarak uyaran bir sistemleri vardır ve bu sistem Kafka Streams (Kafka akışları) kullanılarak oluşturulmuştur.

**Amadeus:** Apache Kafka'yı, hem gerçek zamanlı hem de toplu veri işleme için kullanılır.

**Airbnb:** Apache Kafka'yı istisna takibinde kullanır.

**Bandwidth:** Faturalandırma ve veri analitiği için çağrı ve mesaj veri kayıtlarını işlemek için İletişim Platformlarında Kafka'yı kullanır.

**ByteDance:** Çevrimiçi model eğitimi ve gerçek zamanlı veri analitiği gibi çeşitli hizmetler için olayları (events) ve günlükleri (logs) toplamak üzere Kafka'yı bir veri merkezi olarak kullanır.

**Cityzen Data:** Makine verilerini toplamak, depolamak ve analiz etmek için Kafka'yı kullanır.

**DataDog:** Kafka'yı veri aracısı olarak kullanır.

**DataSift:** Kullanıcının veri akışı tüketimini gerçek zamanlı olarak izlemek için Kafka'yı kullanır.

**DataVisor:** Dolandırıcılık algılama sistemlerimizdeki çeşitli mikro hizmetleri birbirine bağlayan kritik bir gerçek zamanlı veri hattı olarak Apache Kafka'yı kullanır.

**Emerging threats:** Ortaya çıkan tehditler, arama dizinleri, uyarı sistemleri vb. için milyarlarca kötü amaçlı yazılım olayını işlemek için olay hattında (event pipeline) Kafka'yı kullanır.

**LINE:** Hizmetlerinin birbiriyle iletişim kurması için merkezi bir veri merkezi olarak Apache Kafka'yı kullanır. Her gün yüz milyarlarca mesaj üretilir ve çeşitli iş mantığı, tehdit algılama, arama indeksleme ve veri analizini yürütmek için kullanılır. LINE, tüketicilerin (consumers) verimli bir şekilde tüketebileceği alt konuları (sub topics) sağlayan konuları (topics) güvenilir bir şekilde dönüştürmek ve filtrelemek için Kafka Streams'ten yararlanır. (1)

**Kafka Nasıl Çalışır?**
Kafka, yüksek performanslı bir TCP ağ protokolü aracılığıyla iletişim kuran sunucular ve istemcilerden oluşan dağıtılmış bir sistemdir . Bulut ortamlarının yanı sıra şirket içi donanımda, sanal makinelerde ve kapsayıcılarda devreye alınabilir.

**Servers(Sunucular) :**
Kafka, birden çok veri merkezine veya bulut bölgesine yayılabilen bir veya daha fazla sunucu kümesi olarak çalıştırılır. Bu sunuculardan bazıları, aracılar (brokers) olarak adlandırılan depolama katmanını oluşturur.
Diğer sunucular, Kafka'yı ilişkisel veritabanları (reletional databases) ve diğer Kafka kümeleri gibi mevcut sistemlerinizle bütünleştirmek için verileri olay akışları (event streams) olarak sürekli olarak içeri ve dışarı aktarmak için Kafka Connect'i çalıştırır .
Görev açısından kritik kullanım senaryolarını uygulamanıza izin vermek için bir Kafka kümesi (Kafka Cluster), yüksek düzeyde ölçeklenebilir ve hataya dayanıklıdır: sunucularından herhangi biri arızalanırsa, diğer sunucular, herhangi bir veri kaybı olmadan sürekli işlemler sağlamak için onların işlerini üstlenir.

**Clients (İstemciler) :**
Olay akışlarını paralel, ölçekte ve ağ sorunları veya makine arızaları durumunda bile hataya dayanıklı bir şekilde okuyan, yazan ve işleyen dağıtılmış uygulamalar (distributed applications) ve mikro hizmetler yazmanıza olanak tanır. Kafka , Kafka topluluğu tarafından sağlanan düzinelerce istemciyle desteklenen bu tür bazı istemcilerle birlikte gönderilir.(3)

**Temel Kavramlar ve Terminoloji**

**Event (Olay):** Bir olay , dünyada veya işinizde "bir şey olduğu" gerçeğini kaydeder. Belgelerde kayıt veya mesaj olarak da adlandırılır. Kafka'ya veri okuduğunuzda veya yazdığınızda, bunu olaylar şeklinde yaparsınız. Kavramsal olarak, bir olayın bir anahtarı (key), değeri (value), zaman damgası(timestamp) ve isteğe bağlı meta veri başlıkları (metadata headers) vardır.

İşte örnek bir olay:
Event Key (Olay anahtarı): "Alice"
Event Value (Etkinlik değeri): "Bob'a 200$ ödeme yapıldı"
Event Timestamp (Etkinlik zaman damgası) : "25 Haziran 2020, 14:06"

**Producers(Üreticiler)**
Olayları Kafka'ya yayınlayan (yazan) istemci (client)uygulamalarıdır ve consumers (tüketiciler ), bu olaylara abone olan (okuyan ve işleyen) kişilerdir. Kafka'da producers(üreticiler) ve consumers(tüketiciler) birbirlerinden tamamen ayrı ve bağımsızdır; bu, Kafka'nın bilinen yüksek ölçeklenebilirliğini elde etmek için önemli bir tasarım öğesidir. Örneğin, üreticilerin (producers) hiçbir zaman tüketicileri (consumers) beklemesine gerek yoktur. Kafka, olayları tam olarak bir kez (exactly-once) işleme yeteneği gibi çeşitli garantiler sağlar. Üreticiler, seçtikleri konularda veri yayınlar. (4)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y53gfzm50o8x6pdjsndp.png)

Etkinlikler organize edilir ve konularda (topics) kalıcı olarak saklanır. (Varsayılan olarak bu süre 7 gündür) Çok basitleştirilmiş, bir topic(konu) bir dosya sistemindeki bir klasöre benzer ve olaylar o klasördeki dosyalardır. Örnek bir topic(konu) adı "ödemeler" olabilir. Kafka'daki konular her zaman çok üreticili(multi-producer) ve çok abonelidir(multi-subscriber) Bir konunun (topic) kendisine olay yazan sıfır, bir veya çok sayıda üreticisinin(producers) yanı sıra bu olaylara abone olan sıfır, bir veya çok sayıda tüketici (consumers)olabilir. Bir topic deki (konudaki) olaylar gerektiği kadar okunabilir geleneksel mesajlaşma sistemlerinin aksine, olaylar tüketimden sonra silinmez. Bunun yerine, Kafka'nın olaylarınızı konu (topic) başına yapılandırma ayarı (per- topic configuration setting) aracılığıyla ne kadar süreyle tutması gerektiğini tanımlarsınız, ardından eski olaylar atılır. Kafka'nın performansı, veri boyutuna göre etkin bir şekilde sabittir, bu nedenle verileri uzun süre saklamak tamamen iyidir.

Konular (Topics) bölümlenmiştir , yani bir topic farklı Kafka brokerlerinde bulunan bir dizi "buckets" (kovaya) yayılmıştır. Verilerinizin bu dağıtılmış yerleşimi ölçeklenebilirlik (scability) için çok önemlidir, çünkü istemci (client) uygulamalarının aynı anda birçok aracıdan (brokers) veri okumasına ve yazmasına olanak tanır. Bir topic'e yeni bir olay yayınlandığında, aslında konunun bölümlerinden (topic's partitions) birine eklenir. Aynı olay anahtarına sahip olaylar (örneğin, bir müşteri veya araç kimliği) aynı bölüme (partition) yazılır ve Kafka, belirli bir konu bölümünün(topic- partition) herhangi bir tüketicisinin (consumer), o bölümün olaylarını (partition's events) her zaman tam olarak yazıldığı sırayla okuyacağını garanti eder.




Bu örnek topic (konu), P1–P4 arasında dört bölüme (partitions)sahiptir. İki farklı producer(üretici) consumer(istemci), ağ üzerinden konuların bölümlerine olaylar yazarak birbirinden bağımsız olarak konuya yeni olaylar yayınlamaktadır. Aynı anahtara sahip olaylar (şekilde renkleri ile gösterilmiştir) aynı bölüme (partition) yazılır. Her iki üreticinin (producers) de uygunsa aynı bölüme (partition)yazabileceğini unutmayın.

Verilerinizi hataya dayanıklı ve yüksek düzeyde kullanılabilir hale getirmek için , coğrafi bölgeler veya veri merkezleri (datacenters) arasında bile her topic (konu) çoğaltılabilir (replicated) , böylece her zaman bir şeyler ters gittiğinde verilerin bir kopyasına sahip olan birden çok broker (aracı) vardır. komisyoncular üzerinde bakım yapmak vb. Ortak bir üretim ayarı, 3'lük bir çoğaltma faktörüdür (replication factor) yani, verilerinizin her zaman üç kopyası olacaktır. Bu çoğaltma, konu bölümleri (topic- partitions) düzeyinde gerçekleştirilir. (3)

**Mesajlaşmanın geleneksel olarak iki modeli vardır:**

**1.)Queuing (Kuyruğa alma)**
Kuyrukta (queue), bir tüketici havuzu (pool of consumers) bir sunucudan okuyabilir ve her ileti bunlardan birine gider. (Tüm consumer'ları 1 grup içerisine koymalısınız (5))

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6kiiv9urh85zgupk43jm.PNG)

**2.) Publish- Subscribe (Yayınla- abone ol)**
Publish-subscribe 'da (yayınla-abone ol) ileti tüm tüketicilere (consumers) yayınlanır. (Her bir consumer'ı kendine ait başka bir Consumer Group içine aktarmalısınız (5))

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9r3dbw9e2xfci7q3yty3.PNG)

Kafka, her ikisini de genelleştiren tek bir tüketici soyutlaması sunar tüketici grubu (consumer group)

Tüketiciler (Consumers ) kendilerini bir tüketici grubu (Consumer group) adıyla etiketlerler ve bir konuya (topic) yayınlanan her ileti, abone olan (subscribing ) her tüketici grubu içindeki bir tüketici örneğine (consumer instance ) teslim edilir.
Tüketici örnekleri ayrı işlemlerde (processes) veya ayrı makinelerde olabilir

Tüm tüketici örnekleri (consumer instances ) aynı tüketici grubuna (consumer group) sahipse, bu, tüketiciler üzerindeki geleneksel kuyruk dengeleme yükü (traditional queue balancing load ) gibi çalışır.
Tüm tüketici örneklerinin (consumer instances) farklı tüketici grupları (consumer groups) varsa, bu publish-subscribe (yayınla-abone ol) gibi çalışır ve tüm iletiler tüm tüketicilere(consumers) yayınlanır.(4)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gm45x0jgo7em9xwkudxh.png)

**ZooKeeper:**
ZooKeeper, yapılandırma bilgilerini korumak, adlandırmak, dağıtılmış senkronizasyon sağlamak ve grup hizmetleri sağlamak için merkezi bir hizmettir. Bu tür hizmetlerin tümü dağıtılmış uygulamalar tarafından bir şekilde veya başka bir şekilde kullanılır.
ZooKeeper ayrıca dağıtılmış uygulamalar için yüksek performanslı bir koordinasyon hizmetidir.

Adlandırma, yapılandırma yönetimi (configuration management), senkronizasyon ve grup hizmetleri gibi ortak hizmetleri basit bir arayüzde sunar, böylece bunları sıfırdan yazmak zorunda kalmazsınız.

Grup yönetimi, lider seçimi (leader election) ve varlık protokollerini (presence protocols) uygulamak için hazır olarak kullanabilirsiniz. Ve kendi özel ihtiyaçlarınız için üzerine inşa edebilirsiniz. (4)

**Kaynaklar:**
(1) https://kafka.apache.org/powered-by
(2)Garg, N. (2013). Apache kafka (pp. 30–31). Birmingham, UK: Packt Publishing.
(3) https://kafka.apache.org/documentation/#gettingStarted
(4) Thein, K. M. M. (2014). Apache kafka: Next generation distributed messaging system. International Journal of Scientific Engineering and Technology Research, 3(47), 9478–9483.
(5) https://www.youtube.com/watch?v=ZphPT3r6fnU&t=3339s