Siapakah Kafka?
Franz Kafka adalah seorang novelis bahasa Jerman yang bepengaruh pada abad 20.
Kafka dilahirkan dalam keluarga kelas menengah Jerman-Yahudi di Praha, ibu kota Kerajaan Bohemia, yang saat itu merupakan bagian dari Kekaisaran Austro-Hongaria, sekarang ibu kota Republik Ceko.
Stop! cukup sampai disitu. Sebenarnya yang kita mau bahas adalah Apache Kafka
Apache Kafka adalah implementasi kerangka software bus menggunakan stream-processing. Apache Kafka juga merupakan proyek open-source yang dikembangkan oleh Apache Software Foundation yang ditulis menggunakan bahasa pemrograman Scala dan Java.
Kafka awalnya dikembangkan di LinkedIn, dan kemudian dijadikan open-source pada awal 2011. Jay Kreps, Neha Narkhede dan Jun Rao membantu menciptakan Kafka yang kemudian meninggalkan LinkedIn untuk membangun Confluent.
Jay Kreps memilih untuk menamai perangkat lunak tersebut dengan nama penulis Franz Kafka karena itu adalah โsistem yang dioptimalkan untuk penulisanโ, dan dia menyukai karya Kafka.
Kafka oooh Kafka, begitu ternyata kisah dibalik nama Kafka
Konsep Dasar Kafka
Perhatikan tulisan tebal diatas? yang ini โsistem yang dioptimalkan untuk penulisanโ.
Ya, ujung-ujungnya untuk menyimpan data juga ya
Kafka akan menyimpan data secara berkelanjutan dan tidak ada proses hapus data. Data yang disimpan didalam Kafka akan memiliki ID masing-masing dengan timestamp yang incremental.
Tipe data yang bisa disimpan di Kafka itu bisa teks atau binary. Tipe data teks bisa menyimpan berbagai macam format seperti JSON, CSV, dan lain sebagainya.
Kafka adalah suatu platform event streaming terdistribusi yang memungkinkan kita untuk membaca, menulis, menyimpan dan memproses suatu events (records atau messages) dari berbagai mesin.
Tapi, sebenernya buat apa sih kita pakai Kafka? harus ya?
Menurut dokumentasi resmi Kafka. Kafka bisa digunakan untuk berbagai macam hal sebagai berikut:
- Messaging
- Website Activity Tracking
- Metrics
- Log Aggregation
- Stream Processing
- Event Sourcing
- Commit Log
Mari kita coba memahami konsep dasar Kafka dengan memperhatikan hirarki berikut:
- Producers adalah aplikasi yang mengirimkan pesan ke server Kafka. Suatu server Kafka dapat menerima pesan dari satu atau lebih producer
- Clusters adalah tempat virtual dimana sekumpulan brokers dikelompokan. Server Kafka dapat memiliki satu atau lebih cluster untuk mendukung scalability, high availability dan fault-tolerant
- Brokers adalah komponen pada suatu server kafka yang bertugas menerima dan memberikan pesan. Dalam suatu clusters bisa terdapat banyak brokers
- Topics adalah tempat dimana pesan-pesan dikelompokan. Dalam satu brokers bisa terdapat banyak topic
- Partitions adalah pembagian penyimpanan pesan dalam suatu topics. Partisi digunakan untuk meningkatkan scalability dan peformance. Dimana setiap partisi dapat di tangani oleh suatu consumers tertentu. Satu topics bisa memiliki satu atau lebih partitions
- Offset adalah posisi terakhir dari suatu urutan pesan yang masuk ke dalam suatu partisi di dalam topik
- Messages, Records adalah pesan atau struktur pesan yang tersimpan dalam suatu topic
- Key, Value, Timestamp, biasanya didalam setiap pesan yang tersimpan di topic terdapat informasi key, value dan timestamp. Key bersifat opsional sedangkan value adalah isi dari pesan dan timestamp menunjukan waktu pesan dimasukan kedalam topik/partisi
- Consumer Groups adalah sekumpulan consumer yang mengambil pesan dari suatu topik. Consumer di dalam consumer grup dipastikan akan mendapatkan pesan sesuai dengan jumlah partisinya. Misal ada 3 partisi dalam suatu topik, lalu ada 2 consumers dalam suatu consumer groups, maka 1 consumer akan mengambil pesan dari 1 partisi, dan 1 consumer lagi akan mengambil pesan dari 2 partisi. Jika jumlah consumer lebih banyak dari jumlah partisi, maka akan ada consumer yang idle atau tidak pernah mendapatkan pesan. Satu consumer group dapat memiliki satu atau lebih consumer
- Consumers adalah aplikasi yang berfungsi untuk menarik data dari server Kafka pada suatu topik tertentu
Suatu aplikasi bisa berperan sebagai producer sekaligus consumer.
Praktek Dasar Kafka
Install Apache Kafka menggunakan docker pull bitnami/kafka:latest
. Bagi yang belum mengenal Docker silahkan baca dulu artikel tentang Docker disini. Katanya belajar Kafka kok malah pake Docker
Menjalankan Server Kafka dengan Konfigurasi Default
Untuk memulai menyalakan server Kafka, kita perlu menjalankan perintah berikut secara berurutan:
docker network create app-tier --driver bridge
. Perintah ini akan membuat network virtual yang digunakan untuk mengelompokan network yang ada di container docker. Nantinya akan digunakan untuk menghubungkan network container server Kafka dengan container server Zookeeper
- Jalankan server Zookeeper
docker run -d --name zookeeper-server --network app-tier -e ALLOW_ANONYMOUS_LOGIN=yes bitnami/zookeeper:latest
. Perintah ini digunakan untuk menjalankan server Zookeeper, jika kita belum pernah mengunduh image server Zookeeper maka secara otomatis akan di unduh.
- Jalankan server Kafka
docker run -d --name kafka-server --network app-tier -e ALLOW_PLAINTEXT_LISTENER=yes -e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-server:2181 bitnami/kafka:latest
- Lalu jalankan client Kafka untuk mendapat daftar topic yang ada
docker run -it --rm \
--network app-tier \
-e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-server:2181 \
bitnami/kafka:latest kafka-topics.sh --list --zookeeper zookeeper-server:2181
Pada gambar tersebut tidak terlihat daftar topik karena memang kita belum menambahkan topik apapun. Di Kafka sumber data yang dimasukan ke dalam topik biasanya berasal dari suatu kejadian (event) dimana disetiap kejadian ini ada suatu catatan (records) atau pesan (messages) yang harus dikirim atau disimpan. Istilah topik di Kafka bisa dianalogikan seperti folder pada sistem operasi dan event adalah file di dalam folder tersebut. Jadi sebelum Kafka bisa merekam suatu kejadian maka topik harus dibuat untuk bisa menampungnya.
Sekarang kita coba buat topic baru:
docker run -it --rm --network app-tier -e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-server:2181 bitnami/kafka:latest kafka-topics.sh --create --topic berita --partitions 3 --bootstrap-server 172.19.0.3:9092
Yay!, kita sudah berhasil membuat topic baru bernama berita
--bootstrap-server
, dari manakah kita tau bahwa server Kafka berada di IP address 172.19.0.3? sedangkan untuk port 9092 merupakan port default dari server Kafka.
Caranya dengan menggunakan perintah docker network inspect app-tier
. Perhatikan kembali bahwa nama network app-tier
sudah dibuat di langkah pertama. Masih bingung? tenang baca artikel tentang Docker Network disini.
Sebetulnya disini sudah tersedia juga docker compose filenya jadi tidak perlu eksekusi perintah di terminal satu-satu, namanya juga belajar ya, kita coba satu-satu
Sekarang kita cek proses container yang sedang berjalan dengan perintah docker ps
untuk memastikan server Zookeeper dan server Kafka masih hidup.
Yay! itโs still alive
Kafka Producer
Klien Kafka berkomunikasi dengan Kafka Broker melalui jaringan untuk menulis (atau membaca) event. Setelah event diterima oleh Kafka Broker, selanjutnya event akan disimpan secara persistent dan fault-tolerant dengan durasi waktu selama yang kita butuhkanโbahkan selamanya.
Klien Kafka adalah program yang mengakses server Kafka untuk menyimpan data. Persistent artinya disimpan ke dalam disk. Sedangkan fault-tolerant artinya Kafka akan berusaha menyimpan event sekalipun ada kendala di salah satu cluster asalkan selama masih ada cluster yang berfungsi.
Untuk menjalankan Kafka Producer ketikan perintah berikut ini pada terminal:
docker run -it --rm --network app-tier -e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-server:2181 bitnami/afka:latest kafka-console-producer.sh --bootstrap-server 172.19.0.3:9092 --topic berita
Jika tidak ada masalah, maka selanjutnya kita bisa mengetikan teks apapun untuk dikirim ke server Kafka. Disitu saya mengirim pesan sebagai berikut:
> Hi
> Saya producer
> apakah ada consumer yang mendengarkan
โฆ
Selanjutnya pesan tersebut bisa diambil oleh consumer.
Kafka Consumer
Because events are durably stored in Kafka, they can be read as many times and by as many consumers as you want. You can easily verify this by opening yet another terminal session and re-running the previous command again.
docker run -it --rm --network app-tier -e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper-server:2181 bitnami/kafka:latest kafka-console-consumer.sh --bootstrap-server 172.19.0.3:9092 --topic berita --group reader
Catatan Penting
- Perhatikan konfigurasi durasi waktu data disimpan, defaultnya adalah 7 hari
- Saat ini server Kafka masih bergantung dengan server Zookeeper untuk menyimpan metadata dari server Kafka. Selanjutnya ketergantungan ini akan hilang, sehingga server Kafka dapat berdiri sendiri tanpa server Zookeeper. Di versi selanjutnya server Kafka akan menyimpan sendiri metadatanya di dalam Topic khusus. Semoga versi Kafka terbaru ini segera rilis, lumayan mengurangi biaya dan beban pemeliharaan server
- Pahami bagaimana Kafka di desain melalui dokumentasi resminya atau disini
- Perhatikan ekosistem Kafka agar kita bisa mendapatkan banyak ide ketika menggunakan Kafka. Seperti Kafka Connect, Kafka Streams, kSQL, dan lain sebagainya
- Baca sampai selesai buku The Definitive Guide Kafka versi 2.0 dari Confluent
Konsep Kafka Dalam Satu Diagram
Referensi lain yang layak dibaca:
โ https://kafka.apache.org/quickstart
โ https://kafka.apache.org/documentation/#quickstart
โ Download eBook https://www.confluent.io/resources/kafka-the-definitive-guide-v2/
โ https://www.confluent.io/resources
Photo by Ross Sokolovski on Unsplash