Kafka Consumer

Consumers

Consumer menggunakan model pull untuk membaca data dari Kafka. Berbeda dengan model push, di mana Kafka mengirimkan data ke consumer secara langsung.
Consumer tidak perlu menentukan partisi mana yang ingin dibaca. Kafka memastikan bahwa setiap partisi akan dibaca oleh satu atau lebih consumer, sehingga setiap consumer akan membaca data dari partisi yang telah ditentukan secara otomatis.
Consumer dapat membaca lebih dari satu partisi, tergantung pada konfigurasi yang telah ditentukan.
Jika broker mengalami kegagalan, maka consumer akan melakukan proses recovery secara otomatis untuk memulihkan koneksi dan membaca data dari broker yang tersedia.
Data pada setiap partisi akan dibaca secara berurutan dari offset terendah hingga tertinggi. Hal ini memastikan bahwa data yang telah diproduksi sebelumnya akan dibaca terlebih dahulu sebelum data baru yang diproduksi setelahnya.

Consumer Deserialization

Ketika sebuah consumer mengambil data dari Kafka, data tersebut awalnya dalam bentuk byte. Namun, agar data tersebut bisa dimanfaatkan oleh aplikasi, maka perlu dilakukan proses deserialisasi. Deserialisasi dilakukan untuk mengubah data byte kembali ke tipe data asalnya. Terdapat beberapa jenis deserialisasi yang umum digunakan di Kafka, beberapa jenis deserialisasi yang umum digunakan di Kafka antara lain:
String / JSON: digunakan untuk mengubah data byte menjadi tipe data string atau objek JSON.
Int, Float: digunakan untuk mengubah data byte menjadi tipe data numerik seperti integer atau float.
Avro: digunakan untuk mengubah data byte menjadi tipe data yang telah didefinisikan dalam skema Avro.
Protobuf: digunakan untuk mengubah data byte menjadi tipe data yang telah didefinisikan dalam skema Protobuf.
Proses deserialisasi kurang lebih seperti berikut :

Consumer Groups

Consumer dapat membaca data dalam grup tertentu disebut juga consumer group. Nama consumer group dapat di identifikasi dengan group.id. Setiap consumer tersebut akan membaca patition tertentu.
Jika jumlah consumer lebih banyak dari jumlah partition maka consumer tersebut akan inactive
Tiap topic sendiri bisa memiliki lebih dari 1 consumer group. Dalam penerapanya semisal consumer group mewakili masing masing service.

Consumer Offsets

Ketika Consumer Group membaca data, Kafka akan secara periodik melakukan commit / menyimpan offset ke topic dengan nama _consumer_offsets. Sehingga ketika ada broker yang fail, Consumer hanya akan membaca data dari offset terakhir yang sudah dicommit.

Delivery Semantics for Consumers

Ada 3 semantic yaitu :
At Least Once
Offset akan di commit setelah message di proses
Jika proses gagal, data akan dibaca kembali
Ada potensi untuk duplikat data. Harus dipastikan bahwa data di proses secara idempoten.
At Most Once
Offset akan di commit setelah message di terima
Ketika proses gagal, data akan hilang.
Exactly Once Hanya bisa diachieve menggunakan cara :
Jika menggunakan Kafka Workflows, bisa menggunakan Transactional API → Kafka Stream API
Jika External System Workflows (open search), bisa menggunakan Idempoten Consumer
Secara default java menggunakan semantic At Least Once