Apa itu Kafka? #

Di era perkembangan aplikasi berbasis data saat ini, jumlah informasi yang mengalir dalam suatu sistem digital berkembang secara eksponensial. Sistem monolitik masa lalu yang hanya mengandalkan satu database relasional pusat untuk melayani semua kebutuhan pencatatan kini telah bergeser menuju arsitektur mikro (microservices) terdistribusi. Di dalam lingkungan baru ini, puluhan atau bahkan ratusan layanan independen harus terus-menerus bertukar informasi dengan cepat dan andal. Kita membutuhkan sebuah sistem penengah yang tidak hanya berfungsi sebagai jembatan pengiriman data biasa, tetapi juga mampu menampung data dalam volume sangat besar secara aman. Di sinilah Apache Kafka mengambil peran sentral sebagai platform event streaming terdistribusi yang menjadi standar industri global.

Dalam artikel ini, kita akan mendalami secara menyeluruh mengenai apa itu Apache Kafka, sejarah di balik pembuatannya, definisi konseptualnya sebagai platform streaming kejadian, arsitektur dasarnya, karakteristik desain yang membuatnya sangat cepat, serta berbagai skenario penggunaan nyata di dunia industri. Dengan memahami landasan ini, kita akan memiliki pijakan yang kokoh sebelum melangkah ke konfigurasi teknis yang lebih mendalam pada modul-modul berikutnya.

Sejarah Lahirnya Apache Kafka #

Untuk benar-benar memahami mengapa Apache Kafka dirancang seperti sekarang, kita perlu menengok kembali sejarah kelahirannya di tahun 2010. Pada saat itu, tim engineer di LinkedIn menghadapi tantangan besar terkait integrasi data internal mereka. LinkedIn memiliki arsitektur yang sangat kompleks dengan banyak pipa data kustom (custom data pipelines) yang menghubungkan sistem aplikasi dengan database analitis, sistem pemantauan performa, dan mesin pencarian.

Jay Kreps, Neha Narkhede, dan Jun Rao adalah para engineer utama yang menginisiasi proyek ini. Mereka menyadari bahwa pipa data kustom yang bersifat point-to-point tersebut sangat sulit dipelihara. Setiap kali ada layanan baru yang ditambahkan, tim harus menulis kode integrasi baru. Sistem antrean pesan tradisional yang ada pada waktu itu (seperti JMS atau RabbitMQ) tidak mampu menangani beban data pelacakan aktivitas pengguna (user activity tracking) LinkedIn yang sangat masif, yang menghasilkan miliaran peristiwa per hari.

flowchart TD
    subgraph P2P ["Arsitektur Point-to-Point di LinkedIn (Sebelum Kafka)"]
        direction TB
        Web["Aplikasi Web"]
        Web -->|Kustom API| DB["Database Analitik"]
        Web -->|Kustom Log| Mon["Sistem Monitoring"]
        Web -->|Kustom Sync| Search["Search Index (Lucene)"]
    end

Mereka memutuskan untuk membangun sistem baru dari nol yang mengadopsi konsep log transaksi database relasional (commit log), namun diimplementasikan sebagai sistem terdistribusi skala besar. Jay Kreps menamai sistem ini Kafka, terinspirasi dari nama penulis terkenal Franz Kafka, karena ia menyukai karya-karyanya dan menyadari bahwa Kafka dirancang sebagai sistem yang sangat dioptimalkan untuk aktivitas menulis (writing).

Pada tahun 2011, LinkedIn mendonasikan proyek ini ke Apache Software Foundation sebagai proyek open-source. Kafka dengan cepat menarik perhatian komunitas developer global dan segera lulus menjadi proyek tingkat atas (Top-Level Project) Apache pada tahun 2012. Beberapa tahun kemudian, pada tahun 2014, ketiga pendiri Kafka keluar dari LinkedIn untuk mendirikan Confluent, sebuah perusahaan yang fokus menyediakan platform Kafka tingkat perusahaan (enterprise) dan mendorong ekosistem Kafka hingga menjadi raksasa seperti saat ini.


Definisi: Lebih dari Sekadar Message Broker #

Banyak orang yang baru pertama kali belajar Kafka sering kali menyamakannya dengan message broker tradisional seperti RabbitMQ, ActiveMQ, atau Amazon SQS. Meskipun Kafka dapat digunakan untuk fungsi pengiriman pesan (messaging), menyamakan Kafka dengan broker pesan tradisional adalah sebuah kekeliruan besar.

Apache Kafka secara resmi didefinisikan sebagai sebuah Event Streaming Platform terdistribusi. Perbedaan mendasar ini terletak pada tiga kapabilitas utama yang dimiliki Kafka secara terpadu:

  1. Mempublikasikan (Publish) dan Berlangganan (Subscribe): Mengirimkan dan menerima aliran peristiwa (stream of events), mirip dengan fungsi antrean pesan tradisional.
  2. Menyimpan (Store): Menyimpan aliran peristiwa secara aman, persisten, dan tahan lama (durable) di dalam cluster penyimpanan terdistribusi selama jangka waktu yang kita tentukan.
  3. Memproses (Process): Mengolah dan mereaksi aliran peristiwa secara langsung pada saat kejadian berlangsung secara real-time.
flowchart TD
    subgraph APACHE_KAFKA ["APACHE KAFKA PLATFORM"]
        direction TB
        PUB_SUB["Publish/Subscribe <br/> Mengirim & Menerima Event"]
        STORAGE["Storage <br/> Menyimpan Event Persisten"]
        PROCESSING["Processing <br/> Memproses Aliran Event secara Real-Time"]
    end

Di dalam sistem antrean tradisional, setelah sebuah pesan dibaca oleh konsumen, pesan tersebut biasanya akan langsung dihapus dari sistem. Namun di dalam Kafka, data disimpan secara persisten di dalam cakram keras (disk) dan tidak langsung dihapus setelah dibaca. Data tersebut tetap berada di sana dan dapat dibaca berulang kali oleh konsumen yang berbeda, atau bahkan dibaca ulang oleh konsumen yang sama dari posisi awal sejarah (replayability). Karakteristik inilah yang membedakan Kafka secara radikal dari teknologi messaging biasa.


Arsitektur Dasar Apache Kafka #

Untuk memahami bagaimana Kafka mengelola aliran data, kita harus memahami beberapa komponen kunci yang menyusun arsitekturnya. Berikut adalah gambaran visual bagaimana data mengalir dari Producer ke Broker (yang dipecah menjadi beberapa Topic dan Partition) hingga ditarik oleh Consumer:

flowchart TD
    subgraph Klien ["Aplikasi Klien"]
        P1["Producer A"]
        P2["Producer B"]
        C1["Consumer Group 1 (App X)"]
        C2["Consumer Group 2 (App Y)"]
    end

    subgraph Cluster ["Kafka Cluster"]
        subgraph Broker1 ["Broker 1 (Server 1)"]
            T1_P0[("Topik A - Partisi 0 (Leader)")]
            T1_P1_R[("Topik A - Partisi 1 (Replica)")]
        end
        subgraph Broker2 ["Broker 2 (Server 2)"]
            T1_P1[("Topik A - Partisi 1 (Leader)")]
            T1_P0_R[("Topik A - Partisi 0 (Replica)")]
        end
    end

    P1 -->|Kirim Event| T1_P0
    P2 -->|Kirim Event| T1_P1

    T1_P0 -. Replikasi .-> T1_P0_R
    T1_P1 -. Replikasi .-> T1_P1_R

    T1_P0 -->|"Tarik Event (Pull)"| C1
    T1_P1 -->|"Tarik Event (Pull)"| C1
    T1_P0 -->|"Tarik Event (Pull)"| C2
    T1_P1 -->|"Tarik Event (Pull)"| C2

Mari kita bahas komponen-komponen tersebut satu per satu secara konseptual:

1. Event (Kejadian/Pesan) #

Event adalah unit data terkecil di dalam Kafka. Peristiwa ini mencatat fakta tentang sesuatu yang telah terjadi di dunia nyata atau di dalam aplikasi kita. Secara teknis, sebuah event di dalam Kafka ditulis sebagai kombinasi pasangan kunci (key), nilai (value), stempel waktu (timestamp), dan opsional metadata tambahan berupa headers.

  • Key: Digunakan untuk menentukan partisi tujuan pesan dan untuk keperluan identifikasi entitas (misal: ID Pengguna).
  • Value: Isi data utama dari peristiwa tersebut, biasanya diformat dalam JSON, Avro, Protobuf, atau teks biasa.
  • Timestamp: Waktu terjadinya peristiwa tersebut.

2. Producer (Pembuat Data) #

Producer adalah aplikasi klien yang bertugas untuk membuat dan mengirimkan event ke dalam sistem Apache Kafka. Sebagai contoh, sebuah layanan pembayaran (Payment Service) bertindak sebagai producer ketika mengirimkan peristiwa transaksi sukses ke Kafka.

3. Consumer (Penerima Data) #

Consumer adalah aplikasi klien yang berlangganan (subscribe) dan membaca event dari Kafka. Berbeda dengan sistem asinkron tradisional di mana broker mendorong (push) data ke penerima, di dalam Kafka konsumen lah yang aktif menarik (pull) data dari broker ketika mereka memiliki kapasitas untuk memprosesnya.

4. Topic (Topik) #

Topic adalah folder atau kategori logis yang digunakan untuk mengelompokkan peristiwa-peristiwa yang sejenis. Misalnya, kita bisa membuat topik bernama transaksi-sukses untuk menampung semua data transaksi pembayaran, dan topik klik-halaman untuk melacak aktivitas klik pengguna di website kita.

5. Partition (Partisi) #

Setiap topik di dalam Kafka tidak disimpan dalam satu file tunggal yang besar. Sebaliknya, topik dipecah menjadi beberapa bagian yang lebih kecil yang disebut Partition. Partisi adalah unit fisik paralelisme di dalam Kafka. Peristiwa-peristiwa di dalam satu partisi dijamin tersimpan secara berurutan dan diberi nomor urut unik yang disebut Offset.

flowchart LR
    subgraph Topic1 ["Topik: transaksi-sukses"]
        direction TB
        subgraph P0 ["Partisi 0"]
            P0_0["Offset 0"] --> P0_1["Offset 1"] --> P0_2["Offset 2"] --> P0_3["Offset 3"]
        end
        subgraph P1 ["Partisi 1"]
            P1_0["Offset 0"] --> P1_1["Offset 1"] --> P1_2["Offset 2"]
        end
        subgraph P2 ["Partisi 2"]
            P2_0["Offset 0"] --> P2_1["Offset 1"] --> P2_2["Offset 2"] --> P2_3["Offset 3"] --> P2_4["Offset 4"]
        end
    end

6. Broker (Server Kafka) #

Broker adalah server fisik atau virtual yang menjalankan proses Apache Kafka. Broker bertanggung jawab untuk menerima pesan dari producer, menyimpannya ke dalam cakram keras, dan melayani permintaan pembacaan data dari consumer. Kumpulan broker yang saling terhubung dan bekerja sama disebut sebagai Cluster.


Karakteristik Desain Apache Kafka #

Mengapa Kafka mampu menangani jutaan pesan per detik dengan latensi yang sangat rendah? Jawabannya terletak pada keputusan desain arsitektur yang sangat brilian yang diambil oleh para penciptanya. Berikut adalah empat pilar utama desain fisik Kafka:

1. Sistem Log Append-Only (Distributed Commit Log) #

Struktur penyimpanan internal Kafka sangat sederhana: sebuah berkas log biner yang hanya memperbolehkan operasi penulisan di akhir file (append-only). Kita tidak bisa mengubah data yang sudah ditulis (immutable), dan kita tidak bisa menyisipkan data di tengah file.

Karena hanya melakukan penulisan berurutan (sequential write) di akhir file, sistem operasi dapat mengoptimalkannya dengan sangat efisien. Menulis secara berurutan di cakram keras mekanis modern (HDD) bahkan bisa menyamai kecepatan menulis acak di memori (RAM), karena jarum pembaca cakram keras tidak perlu bergerak mencari lokasi sektor yang kosong.

flowchart LR
    subgraph AO ["Penulisan Append-Only"]
        direction LR
        D0["Data Lama 0"] --> D1["Data Lama 1"] --> D2["Data Lama 2"] --> D3["Data Baru 3 (Hanya di ujung)"]
        style D3 fill:#22c55e,stroke:#15803d,color:#fff
    end

2. Pemanfaatan Page Cache Sistem Operasi #

Banyak aplikasi database besar mencoba mengelola memori cache mereka sendiri di dalam ruang pengguna (user space memori atau JVM heap). Kafka melakukan pendekatan sebaliknya. Kafka menyerahkan manajemen caching sepenuhnya kepada sistem operasi melalui Page Cache.

Ketika data ditulis ke sistem file, sistem operasi secara otomatis menyimpannya di memori cadangan (page cache). Ketika konsumen membaca data yang baru saja ditulis, data tersebut langsung diambil dari memori cache sistem operasi tanpa perlu melakukan akses fisik ke cakram keras. Hal ini meminimalkan penggunaan memori JVM heap dan menghindarkan sistem dari jeda pembersihan memori (Garbage Collection pause) Java yang lama.

3. Transfer Data Zero-Copy #

Pada server aplikasi tradisional, ketika mengirim berkas dari cakram keras ke jaringan socket, data harus melalui perjalanan panjang:

  1. Data dibaca dari cakram keras ke page cache sistem operasi.
  2. Data disalin dari page cache ke buffer aplikasi (user space).
  3. Data disalin kembali dari buffer aplikasi ke buffer socket sistem operasi.
  4. Data disalin dari buffer socket ke kartu jaringan (NIC).

Proses ini sangat membuang siklus CPU karena menyalin data yang sama berkali-kali. Kafka memanfaatkan fungsi sistem operasi bernama sendfile (di Linux/Unix) yang mengimplementasikan teknik Zero-Copy. Data disalin langsung dari page cache sistem operasi ke kartu jaringan tanpa pernah masuk ke memori aplikasi Java. Hal ini secara drastis mengurangi penggunaan CPU dan memaksimalkan bandwidth kartu jaringan.

flowchart TD
    subgraph Traditional ["Alur Transfer Tradisional"]
        direction LR
        Disk1["Disk"] --> PC1["Page Cache"] --> US["User Space (JVM Heap)"] --> SB1["Socket Buffer"] --> NIC1["NIC (Network Card)"]
    end
    subgraph ZeroCopy ["Alur Zero-Copy (Sendfile)"]
        direction LR
        Disk2["Disk"] --> PC2["Page Cache"] --> SB2["Socket Buffer"] --> NIC2["NIC (Network Card)"]
        style PC2 stroke-dasharray:5,5
        style SB2 stroke-dasharray:5,5
    end

4. Penggabungan Pesan (Batching) dan Kompresi #

Alih-alih mengirimkan satu pesan satu per satu melalui koneksi TCP jaringan yang mahal, klien producer Kafka secara cerdas menggabungkan beberapa pesan ke dalam satu kelompok (batch) sebelum mengirimkannya. Broker Kafka juga menyimpan kelompok pesan tersebut apa adanya tanpa memecahnya, dan mengirimkannya sebagai satu batch utuh ke konsumen.

Kita juga dapat mengaktifkan kompresi data (seperti Gzip, Snappy, Lz4, atau zstd) di sisi producer. Karena pesan dikompresi dalam bentuk batch, rasio kompresinya menjadi jauh lebih tinggi dibandingkan mengompresi pesan satu per satu, sehingga menghemat bandwidth jaringan dan ruang penyimpanan disk secara signifikan.


Kasus Penggunaan Riil di Dunia Industri #

Dengan segala kelebihan desainnya, di mana sajakah Apache Kafka biasanya diimplementasikan? Berikut adalah beberapa contoh use case nyata di industri teknologi saat ini:

1. Pelacakan Aktivitas Pengguna (User Activity Tracking) #

Ini adalah use case asli Kafka di LinkedIn. Setiap interaksi pengguna di aplikasi atau website—seperti klik tombol, halaman yang dilihat, pencarian kata kunci, dan waktu tinggal pengguna—dikirim sebagai event ke topik Kafka. Tim data analitik kemudian mengonsumsi data ini secara real-time untuk memperbarui algoritma rekomendasi lowongan pekerjaan atau konten yang sesuai dengan minat pengguna saat itu juga.

2. Log Aggregation & Centralized Logging #

Perusahaan dengan arsitektur microservices yang besar memiliki ribuan server yang menghasilkan jutaan baris berkas log setiap menitnya. Mengakses log langsung ke mesin server satu per satu adalah hal yang mustahil dilakukan saat terjadi insiden.

Kita dapat menggunakan agen pengumpul log (seperti Filebeat atau Fluentd) untuk membaca log lokal di setiap mesin dan mengirimkannya langsung ke Kafka. Dari Kafka, data log dialirkan ke sistem pencarian dan analitik seperti Elasticsearch (ELK Stack) atau Splunk untuk mempermudah pemantauan terpusat.

3. Pemrosesan Data Real-Time (Real-Time ETL) #

Dalam bisnis retail modern, inventaris barang di gudang harus terus diperbarui. Ketika terjadi pembelian di kasir toko fisik atau di aplikasi e-commerce, peristiwa penjualan dikirim ke Kafka. Aliran data ini kemudian diproses oleh sistem pemrosesan aliran (stream processing) untuk mengurangi stok barang di sistem inventaris secara instan, serta memperbarui dashboard analitik penjualan yang dipantau oleh tim manajemen.

4. Event Sourcing dan Arsitektur CQRS #

Dalam arsitektur Event Sourcing, status akhir dari suatu aplikasi tidak disimpan secara langsung di database. Sebaliknya, aplikasi menyimpan seluruh rangkaian riwayat peristiwa (chronological events) yang memicu perubahan status tersebut. Kafka sangat ideal untuk pola ini karena sifat lognya yang persisten dan tidak dapat diubah (immutable). Jika database utama mengalami kerusakan total, kita dapat membangun ulang (rebuild) seluruh status database dari awal hanya dengan memutar ulang (replay) seluruh peristiwa yang tersimpan di dalam Kafka dari offset nol.

5. Pengumpulan Metrik dan Pemantauan Sistem (Metrics & Ingest System) #

Selain log aplikasi, Kafka juga menjadi tulang punggung untuk mengumpulkan metrik performa sistem secara real-time. Metrik server seperti penggunaan CPU, konsumsi memori RAM, I/O disk, latency jaringan, hingga metrik bisnis (misalnya jumlah registrasi per menit) dikirimkan secara berkala ke Kafka. Agen pemantauan (seperti Telegraf atau Prometheus) dapat bertindak sebagai producer. Data metrik ini kemudian disalurkan ke database deret waktu (time-series database seperti InfluxDB atau Prometheus) dan divisualisasikan menggunakan Grafana. Dengan Kafka sebagai penyangga, lonjakan lalu lintas metrik yang sangat masif tidak akan membebani database pemantauan kita, menjaga dasbor performa tetap responsif saat terjadi insiden.

6. Sinkronisasi Database via Change Data Capture (CDC) #

Dalam arsitektur modern, kita sering kali perlu mereplikasi data dari database relasional operasional utama (OLTP) ke database analitik (OLAP atau Data Warehouse) secara instan tanpa membebani database utama. Teknik CDC (Change Data Capture) menangani hal ini dengan mendengarkan perubahan langsung pada log transaksi database (seperti binlog di MySQL atau Write-Ahead Log di PostgreSQL). Alat CDC (seperti Debezium) menangkap setiap perubahan (insert, update, delete) dan mengirimkannya ke Kafka sebagai aliran event. Layanan konsumen kemudian membaca event tersebut untuk memperbarui database pencarian (seperti Elasticsearch) atau menyuntikkannya ke Data Warehouse (seperti BigQuery atau Snowflake) secara real-time.

flowchart TD
    subgraph CQRS ["Event Sourcing & CQRS dengan Kafka"]
        App["Aplikasi"] -->|Kirim Event Transaksi| Kafka{"Topik Kafka (Persisten)"}
        Kafka -->|Asinkron| SQL["Proses Event ke SQL"]
        Kafka -->|Asinkron| NoSQL["Proses Event ke NoSQL"]
        SQL --> SQL_DB[("Read DB SQL <br/> (Optimasi Query)")]
        NoSQL --> NoSQL_DB[("Search DB NoSQL <br/> (Optimasi Search)")]
    end

Ringkasan #

  • Event Streaming Platform — Apache Kafka didesain sejak awal bukan hanya sebagai antrean pesan biasa, tetapi sebagai platform streaming data terdistribusi yang komprehensif (Publish/Subscribe, Store, dan Process).
  • Asal Usul Skala Besar — Dilahirkan di LinkedIn pada 2010 untuk memecahkan kompleksitas pipa data kustom dan keterbatasan throughput message broker tradisional.
  • Kunci Kecepatan Ekstrem — Kecepatan luar biasa Kafka didukung oleh struktur penyimpanan biner append-only log, pemanfaatan page cache OS secara optimal, teknik transfer data Zero-Copy, serta mekanisme batching dan kompresi pesan.
  • Kasus Penggunaan Luas — Sangat ideal digunakan untuk pelacakan aktivitas real-time, agregasi log terpusat, pemrosesan aliran data (Real-Time ETL), serta implementasi arsitektur modern seperti Event Sourcing dan CQRS.

  Berikutnya: Queue Tradisional →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact