Mendalami arsitektur streaming dan event-driven: Apache Kafka sebagai tulang punggung event streaming, Change Data Capture (CDC) untuk sinkronisasi database, dan praktik merancang pipeline real-time yang andal

Setelah di episode 6 kita merancang pipeline batch yang sehat, sekarang kita masuk ke mode kedua: streaming. Tidak semua data perlu real-time, tapi ketika kebutuhan itu ada — fraud detection, monitoring IoT, rekomendasi personal, atau sinkronisasi antar sistem — arsitek harus merancangnya dengan benar.
Mengapa episode ini penting? Karena streaming adalah salah satu area paling mudah salah desain: orang sering membangun arsitektur real-time untuk kebutuhan yang sebenarnya batch, atau membangun batch di atas fondasi yang seharusnya event-driven. Memahami kapan dan bagaimana memakai streaming membedakan arsitek yang berpikir matang dari yang sekadar mengikuti hype.
Apache Kafka adalah platform event streaming paling dominan. Model mentalnya sederhana: append-only log. Producer menulis event ke topik, consumer membaca dengan offset sendiri — sehingga banyak consumer bisa membaca topik yang sama tanpa saling mengganggu.
Producer --> [topik: order-events] --> Consumer A (real-time fraud check)
\----> Consumer B (update data warehouse)
\----> Consumer C (feature store)Keunggulan utama untuk arsitek:
| Kemampuan | Arti Praktis |
|---|---|
| Append-only log | Semua event tersimpan, bisa diputar ulang |
| Multiple consumers | Satu event melayani banyak beban |
| Retention tersimpan | Bisa re-proses dari titik mana pun |
| High throughput | Jutaan event per detik |
Contoh CLI Kafka untuk praktik:
kafka-topics.sh --bootstrap-server localhost:9092 --create \
--topic order-events --partitions 6 --replication-factor 3
kafka-console-producer.sh --bootstrap-server localhost:9092 \
--topic order-events --property "key.type=int" --property "parse.key=true"CDC adalah teknik menangkap perubahan pada database (INSERT, UPDATE, DELETE) dan menerbitkannya sebagai event. Ini fondasi sinkronisasi modern: alih-alih menyalin seluruh tabel berulang kali, kita hanya mengalirkan perubahan.
Tool CDC populer: Debezium (embedded di Kafka Connect), atau CDC bawaan cloud (DMS, Datastream, Fivetran). Perubahan database (sistem transaksional) diterjemahkan menjadi event dengan struktur seperti:
{
"op": "u",
"after": { "id": 42, "status": "shipped", "qty": 3 },
"before": { "id": 42, "status": "paid", "qty": 3 },
"source": { "table": "orders", "ts_ms": 1780000000000 }
}Dengan pola ini, warehouse bisa selalu menampilkan near-real-time state, dan cache/search index bisa di-update dari event yang sama.
Important
CDC adalah arsitektur yang kuat, tapi bukan pengganti ETL untuk transformasi berat. Gunakan CDC untuk sinkronisasi dan state replication; tetap pakai batch/streaming transform untuk agregasi dan analisis. Mencampur keduanya tanpa aturan jelas adalah sumber data yang tidak konsisten.
Sebelum membangun platform streaming, uji kebutuhan dengan tabel sederhana:
| Kebutuhan | Keterbaruan | Rekomendasi |
|---|---|---|
| Dashboard revenue harian | 1 hari | Batch |
| Report operasional | 1 jam | Batch / micro-batch |
| Fraud detection | Detik | Streaming |
| Alerting sistem | Menit | Streaming |
| Sinkronisasi cache/search | Detik-menit | CDC → event |
| Machine learning online | Detik | Streaming + feature store |
Warning
Pertanyaan pertama yang harus ditanyakan pada kebutuhan "real-time": siapa yang benar-benar mengonsumsi data dalam detik? Jika jawabannya tidak ada — kalian sedang membangun pipeline mahal yang hasilnya dibaca besok pagi. Streaming punya biaya operasional dan kompleksitas jauh di atas batch.
Streaming harus menjamin tidak ada event yang hilang atau diduplikasi. Di Kafka + Flink, gunakan checkpointing dengan exactly-once — bukan at-least-once yang bisa menghasilkan duplikat saat retry.
Bahkan dengan exactly-once, desain sink idempotent sebagai lapis kedua: target table memiliki key unik, dan write memakai upsert. Ini pengaman terhadap edge case.
Jika konsumen lebih lambat dari producer, jangan menumpuk di memori — gunakan mekanisme backpressure (buffer bounded) dan monitor consumer lag. Lag yang terus naik berarti sistem perlu di-scale.
kafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--describe --group order-processor
# LAG bertambah terus → konsumen kewalahan → scale out partitionEvent adalah API antar sistem. Wajib pakai schema registry (Confluent Schema Registry / schema di message format) agar perubahan skema event dideteksi — consumer lama tidak dipecahkan oleh producer baru.
Event yang gagal diproses jangan di-drop. Kirim ke DLQ (topik terpisah) untuk ditinjau manual. Ini beda antara "data hilang diam-diam" dan "data tertunda tapi bisa dipulihkan".
1. Debezium: baca WAL PostgreSQL produksi → topik order-events (Kafka)
2. Flink job: validasi + enrich (join dengan dim) → topik order-enriched
3. Sink: tulis ke lakehouse (Delta) dengan upsert per business key
4. Monitoring: lag consumer, error rate, throughput → Grafana
5. DLQ: event gagal → topik order-dlq → review harianEvaluasi: exactly-once aktif, sink idempotent, lag ter-monitor, skema ter-registry, DLQ ada. Jika kelima poin terpenuhi, pipeline streaming kalian layak produksi.
Tip
Mulai kecil: alirkan satu tabel kritis (misal order) via CDC ke lakehouse sebelum membangun platform streaming penuh. Buktikan stabilitas dengan satu aliran, baru perluas ke sistem lain. Kesalahan arsitektur streaming jauh lebih mudah diperbaiki saat cakupannya kecil.
Inti yang harus dibawa pulang:
Di episode 8 selanjutnya kita akan membahas Data Governance Framework — data catalog, lineage, metadata, dan data stewardship sebagai kerangka pengelolaan data yang akuntabel. Sampai jumpa di episode 8!