Episode ini membahas pengaturan include dan exclude table maupun database, routing event ke topic berbeda, strategi penamaan topic dan partitioning, serta penggunaan transforms seperti RegexRouter dan Filter untuk logika routing kustom.

Secara default Debezium menangkap semua database dan tabel yang bisa diakses, lalu mengirim semuanya ke topic dengan penamaan otomatis. Pada skala kecil itu nyaman, tapi di produksi kalian sering hanya butuh sebagian tabel, atau ingin mengatur penamaan dan distribusi topic agar konsumen mudah bekerja.
Episode 6 ini membahas tiga senjata utama: filtering untuk memilih tabel dan kolom, routing untuk mengubah tujuan topic, dan topic design untuk penamaan serta partitioning yang sehat. Di akhir episode kalian akan memakai Single Message Transforms untuk merakit logika ini.
Filtering dimulai di level connector. Properti include dan exclude bekerja sebagai whitelist dan blacklist:
{
"database.include.list": "inventory",
"table.include.list": "inventory.customers,inventory.orders",
"column.include.list": "inventory.customers.id,inventory.customers.email"
}Kombinasi yang perlu dipahami:
database.include.list membatasi database yang di-capture.table.include.list dan table.exclude.list mengontrol tabel — daftar include lebih didahulukan.column.include.list dan column.exclude.list mengontrol kolom, berguna untuk menyembunyikan kolom sensitif.Gunakan table.include.list daripada exclude bila jumlah tabel target sedikit, karena daftar white-list lebih mudah diprediksi saat tabel baru muncul.
Kadang kalian ingin menggabungkan beberapa tabel ke satu topic, atau mengubah format nama topic. RegexRouter adalah transform bawaan Kafka Connect yang paling sering dipakai:
{
"transforms": "route",
"transforms.route.type": "org.apache.kafka.connect.transforms.RegexRouter",
"transforms.route.regex": "(.*)\\.inventory\\.(.*)",
"transforms.route.replacement": "cdc-$2"
}Dengan konfigurasi di atas, event dari dbserver1.inventory.customers dialihkan ke topic cdc-customers dan event dari dbserver1.inventory.orders ke cdc-orders. Pola ini sangat berguna untuk menggabungkan event dari banyak tabel atau menghilangkan awalan yang tidak dibutuhkan.
Debezium juga menyediakan TopicRouting yang memindahkan event antar topic berdasarkan isi payload — cocok untuk routing dinamis berdasarkan nilai kolom.
Penamaan topic menentukan pengalaman konsumen dan keseimbangan beban. Aturan yang disarankan:
orders, bukan nama database fisik.Partisi sudah ditentukan saat topic dibuat:
docker exec -it kafka /opt/kafka/bin/kafka-topics.sh \
--bootstrap-server localhost:9092 \
--create --topic cdc-customers \
--partitions 6 --replication-factor 1Debezium memakai primary key baris sebagai message key, sehingga event untuk baris yang sama selalu masuk ke partisi yang sama dan urutannya terjaga. Saat menambah partisi, ingat bahwa urutan hanya dijamin di dalam satu partisi, bukan lintas partisi.
Selain routing, beberapa transform bawaan melengkapi desain topic:
{
"transforms": "filter",
"transforms.filter.type": "org.apache.kafka.connect.transforms.Filter",
"transforms.filter.predicate": "isTruncate",
"predicates": "isTruncate",
"predicates.isTruncate.type": "org.apache.kafka.connect.transforms.predicates.TopicNameMatches",
"predicates.isTruncate.pattern": "dbserver1.inventory.audit.*"
}Kombinasi yang umum dipakai di produksi:
Saat merangkai beberapa transform, perhatikan urutannya: daftar transforms dieksekusi sesuai urutan pemisah koma, dan transforms bersifat opsional — tanpa daftar ini event tetap dikirim apa adanya.
Selain mencocokkan nama topic, Kafka Connect mendukung predicate untuk mengeksekusi transform hanya pada kondisi tertentu — misalnya hanya saat source berasal dari database tertentu atau saat header punya nilai khusus. Kombinasi predicate dan transform membuat logika routing sangat ekspresif tanpa menulis kode custom.
{
"transforms": "drop",
"transforms.drop.type": "org.apache.kafka.connect.transforms.Filter",
"transforms.drop.predicate": "isArchive",
"predicates": "isArchive",
"predicates.isArchive.type": "org.apache.kafka.connect.transforms.predicates.RecordIsTombstone"
}Dengan RecordIsTombstone, transform membuang tombstone sebelum mencapai konsumen. Predicate ini penting saat konsumen hilir belum siap menangani value null.
Episode 6 melengkapi toolkit kalian dalam mendesain aliran event: filtering di level connector membatasi cakupan, RegexRouter mengendalikan tujuan topic, penamaan dan partitioning menjaga keseimbangan beban, serta transform melengkapi logika routing kustom.
Inti yang harus dibawa pulang:
Di episode 7 selanjutnya kita akan membahas monitoring, handling failures, dan debugging — memantau status connector dan lag, membaca log serta error handling, dan membangun alert untuk kegagalan connector.