Pada Proyek: Orkestrasi Pipeline dengan Airflow, kita mengolah data secara batch: DAG bangun tengah malam, membaca sumber yang sudah lengkap, lalu selesai sebelum pagi. Kali ini datanya tidak menunggu: setiap pesanan yang masuk di halaman checkout TokoKita harus mengalir sebagai event yang diproses dalam hitungan detik. Kita akan membangun streaming pipeline di atas Apache Kafka — producer yang menerbitkan event pesanan, topic multi-partition sebagai kanal utamanya, consumer group yang mengagregasi nilai pesanan ke jendela per menit, plus perlengkapan produksi: pengelolaan offset, consumer idempoten, validasi event berevolusi, dan pemantauan lag. Lima masalah khas streaming — pemilihan kunci partition, commit offset, kegagalan consumer di tengah batch, event rusak, dan pemantauan lag — kita selesaikan satu per satu pada tiap bagian proyek.

Arsitektur Ringkas #

Alur stream dari checkout sampai jendela per menit mengikuti pola producer → topic → consumer group yang dibedah pada chapter Producers dan Consumers dan Consumer Groups:

Producer menulis event berkunci sehingga urutan pesanan per pelanggan terjaga pada satu partition. Consumer group membaca dengan commit manual setelah hasil tersimpan (pola at-least-once), lalu monitor menghitung consumer lag dari selisih offset akhir partition dengan committed offset.

Perilaku yang Diharapkan #

Seluruh demo dijalankan dari akar bundle proyek. Laporan pemantauan lengkap dihasilkan satu perintah:

bash
python3 -m src.monitor

Output yang Dihasilkan (bagian awal dan akhir; 21 baris jendela di tengah dipangkas):

text
statistik topic sebelum dikonsumsi:
  partition 0: 31 pesan (offset akhir 30)
  partition 1: 81 pesan (offset akhir 80)
  partition 2: 8 pesan (offset akhir 7)
lag grup agregator-pesanan sebelum konsumsi: 120
event terproses: 120

=== Laporan Stream: tokokita.pesanan ===
consumer group : agregator-pesanan
total event    : 120 (0.083 event/detik selama 1440 detik)

jendela            jumlah  event/detik  total nilai   rata-rata
2024-03-01T09:00      5        0.083      7258500   1451700.0
...
2024-03-01T09:23      5        0.083      6739000   1347800.0

consumer lag:
  partition 0: lag 0
  partition 1: lag 0
  partition 2: lag 0
  total lag: 0

Perilaku seluruh modul dikunci oleh 84 tes pytest yang semuanya berjalan terhadap simulasi — dari keunikan offset per partition sampai skenario consumer berhenti di tengah batch lalu pulih tanpa duplikat di hilir.

Struktur Proyek #

text
streaming-data-dengan-kafka/
├── _index.md
├── part-1 ... part-9/
├── src/                   # local_kafka, producer, consumer, partitioner,
│                          # offsets, idempotent, validator, monitor,
│                          # kafka_client_adapter (py_compile saja)
├── tests/                 # conftest + 8 berkas tes pytest
└── config/                # docker-compose KRaft, topic.yaml, schema v1

Seluruh kode sumber proyek tersedia pada bagian Berkas Sumber di bawah halaman ini. Setiap bagian pengerjaan merujuk ke berkas yang sama, sehingga kondisi proyek tetap utuh di setiap tahap.

Tahapan Pengerjaan #

Proyek dikerjakan dalam sembilan bagian berurutan dan setiap bagian menghasilkan kode yang dapat dijalankan:

  1. Bagian 1 merancang bentuk event pesanan sebagai fakta yang tidak berubah.
  2. Bagian 2 menyiapkan cluster Kafka KRaft (konfigurasi) dan topic pada simulasi.
  3. Bagian 3 membangun producer checkout dengan send/flush dan partitioner.
  4. Bagian 4 membangun consumer poll loop yang mengagregasi jendela per menit.
  5. Bagian 5 mengatur topic dan partition: murmur2, kunci timpang, dan beban.
  6. Bagian 6 mengelola offset: at-most-once vs at-least-once, lalu replay.
  7. Bagian 7 menangani kegagalan consumer dengan jurnal event_id (idempoten).
  8. Bagian 8 memvalidasi event terhadap schema berevolusi.
  9. Bagian 9 memantau stream: lag, metrik jendela, dan jembatan ke ekosistem nyata.

Mulailah dari Bagian 1 karena setiap bagian dibangun di atas hasil bagian sebelumnya.

# Bagian 1: Memahami Event Stream

Rancang event pesanan TokoKita sebagai fakta bertimestamp yang tidak berubah, lalu bangkitkan dataset deterministik untuk seluruh proyek.

Buka →
# Bagian 2: Menyiapkan Kafka

Siapkan cluster Apache Kafka 4.x mode KRaft (konfigurasi docker-compose dan topic) lalu buat topic pada simulasi lokal yang dipakai seluruh proyek.

Buka →
# Bagian 3: Membuat Producer

Bangun producer event pesanan dengan API send/flush, partitioner bawaan, dan simulator checkout TokoKita yang dapat direproduksi.

Buka →
# Bagian 4: Membuat Consumer

Bangun consumer dengan poll loop, consumer group, dan commit manual, lalu agregasikan event pesanan ke jendela per menit.

Buka →
# Bagian 5: Mengatur Topic dan Partition

Bedah partitioner murmur2 bawaan Kafka, ukur beban partition dengan kunci timpang, lalu pilih kunci yang tepat untuk topic tokokita.pesanan.

Buka →
# Bagian 6: Mengelola Offset

Uji commit offset at-most-once vs at-least-once dengan crash di titik yang sama, lalu putar ulang histori topic dengan seek tanpa mengubah committed offset.

Buka →
# Bagian 7: Menangani Kegagalan Konsumen

Bangun consumer idempoten dengan jurnal event_id dan state hilir permanen sehingga pengiriman ulang at-least-once tidak menghasilkan duplikat di hasil akhir.

Buka →
# Bagian 8: Memvalidasi Event

Pasang gerbang validasi berbasis schema JSON berevolusi di depan consumer, tolak event rusak dan versi belum dikenal dengan pesan galat yang jelas.

Buka →
# Bagian 9: Memantau Stream

Ukur consumer lag dan metrik per jendela dari state nyata stream, lalu petakan jembatan menuju ekosistem pemantauan Kafka produksi dan tutup proyek.

Buka →