Episode ini membahas Kafka Connect: arsitektur worker standalone dan distributed, source dan sink connector, converter dan transforms, REST API, deployment dengan task parallelism, dead letter queues, serta Single Message Transforms seperti InsertField dan TimestampRouter.

Memindahkan data antara Kafka dan sistem eksternal — database, object storage, atau message queue — tidak perlu ditulis dari nol setiap kali. Kafka Connect adalah framework yang menjalankan connector: komponen yang menyalin data masuk (source) dari sistem lain ke Kafka, atau keluar (sink) dari Kafka ke sistem lain.
Nilai utama Kafka Connect adalah ia menangani hal-hal rumit yang biasanya menyita waktu: scaling dengan task paralel, pengelolaan offset, retry dan error handling, serta distribusi workload antar worker. Kalian cukup menulis file konfigurasi, dan framework mengurus sisanya.
Episode 12 ini akan membawa kalian memahami arsitektur worker, perbedaan source dan sink connector, REST API untuk mengelola connector, teknik deployment dengan task parallelism, dead letter queue, dan Single Message Transforms (SMT) untuk memodifikasi data di perjalanan.
Connector dijalankan di dalam proses bernama worker. Dua mode yang didukung:
JdbcSourceConnector membaca tabel database menjadi record.S3SinkConnector menyimpan record menjadi file di object storage.Converter mengubah format data antara Kafka dan sistem eksternal: JsonConverter, AvroConverter, atau StringConverter. Transforms memodifikasi record di tengah perjalanan — misalnya menambah field atau mengubah key — sebelum mencapai sink. Urutan pemrosesan: converter source → transforms → writer, dan sebaliknya untuk sink.
Connect worker membuka REST API untuk mengelola connector:
curl -s http://localhost:8083/connectorscurl -s http://localhost:8083/connectors mengembalikan daftar nama connector dalam JSON. Endpoint lain: GET /connectors/{name} untuk status, PUT /connectors/{name}/config untuk update, dan DELETE /connectors/{name} untuk menghapus.
Distribusi Kafka menyertakan dua connector dasar: FileStreamSource dan FileStreamSink. Untuk integrasi database, JdbcSourceConnector membaca tabel atau query menjadi topic, dan JdbcSinkConnector menulis record ke tabel:
{
"name": "jdbc-sink-orders",
"config": {
"connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector",
"topics": "orders",
"connection.url": "jdbc:postgresql://localhost:5432/app",
"auto.create": "true",
"insert.mode": "upsert"
}
}connector.class menentukan implementasi yang dipakai, dan connection.url menunjuk database tujuan. Ubah nama connector untuk menambahkan lebih banyak instance.
Ekosistem Kafka Connect sangat kaya: connector untuk MongoDB, Elasticsearch, MySQL, PostgreSQL, AWS S3, Azure Blob, dan ratusan lainnya tersedia di Connector Hub Confluent. Sebelum menulis connector sendiri, cek dahulu apakah connector yang dibutuhkan sudah tersedia — menulis connector custom adalah pekerjaan terakhir yang kalian inginkan.
Satu connector membagi kerja menjadi beberapa task yang berjalan paralel. tasks.max menentukan jumlah maksimum task:
{
"name": "s3-sink-orders",
"config": {
"connector.class": "io.confluent.connect.s3.S3SinkConnector",
"topics": "orders",
"s3.bucket.name": "data-orders",
"flush.size": "10000",
"tasks.max": "4"
}
}tasks.max=4 memungkinkan sink membaca 4 partition berbeda secara paralel. Aturan penting: jumlah task sink tidak boleh melebihi jumlah partition topic, karena satu partition hanya bisa dibaca satu task dalam satu group.
Connector yang gagal memproses record bisa dikonfigurasi untuk mengirim record bermasalah ke dead letter queue (DLQ) alih-alih menghentikan pipeline:
{
"name": "jdbc-sink-orders",
"config": {
"connector.class": "io.confluent.connect.jdbc.JdbcSinkConnector",
"topics": "orders",
"errors.tolerance": "all",
"errors.deadletterqueue.topic.name": "orders-errors",
"errors.deadletterqueue.context.headers.enable": "true"
}
}Dengan errors.tolerance=all, connector melanjutkan pemrosesan record lain dan menulis record yang gagal ke topic orders-errors beserta header konteks error — informasi yang sangat berharga untuk debugging.
SMT memodifikasi record satu per satu sebelum ditulis ke sink:
{
"name": "s3-sink-orders",
"config": {
"connector.class": "io.confluent.connect.s3.S3SinkConnector",
"topics": "orders",
"transforms": "insertTs,router",
"transforms.insertTs.type": "org.apache.kafka.connect.transforms.InsertField$Value",
"transforms.insertTs.timestamp.field": "ingested_at",
"transforms.router.type": "org.apache.kafka.connect.transforms.TimestampRouter",
"transforms.router.topic.format": "orders-${timestamp}"
}
}Rantai transformasi didefinisikan dengan alias yang dipisahkan koma pada transforms. SMT dijalankan berurutan: insertTs menambah field ingested_at, lalu router mengarahkan record ke topic orders-YYYY-MM-DD berdasarkan timestamp — pola umum untuk log berpartisi waktu.
Info
Perubahan konfigurasi connector melalui REST API diterapkan tanpa restart worker. Connect worker akan mendistribusikan ulang task secara otomatis, menjadikan deployment connector bersifat rolling dan tanpa downtime.
Di episode 12 ini kalian sudah memahami arsitektur Kafka Connect, perbedaan worker standalone dan distributed, source dan sink connector, converter dan transforms, REST API untuk manajemen, task parallelism, dead letter queue, serta Single Message Transforms.
Inti yang harus dibawa pulang:
tasks.max menentukan paralelisme; sink task tidak boleh melebihi jumlah partition.errors.tolerance=all mencegah satu record rusak menghentikan pipeline.Di episode 13 selanjutnya kita akan membahas Kafka Streams — library stream processing untuk memfilter, mengagregasi, dan menggabungkan data yang mengalir. Kalian akan belajar KStream, KTable, state store dengan RocksDB, windowing, serta processing guarantee exactly-once.