DEBEZIUM CHANGE-DATA-CAPTURE CDC REAL-TIME EVENT-DRIVEN DATA-STREAMING KAFKA MICROSERVICES DATABASE DATA-INTEGRATION DISTRIBUTED-SYSTEMS DATA-PIPELINE OBSERVABILITY DATA-CONSISTENCY

Debezium: Mengalirkan Perubahan Data Database Secara Real-time untuk Aplikasi Modern

⏱️ 17 menit baca
👨‍💻

Debezium: Mengalirkan Perubahan Data Database Secara Real-time untuk Aplikasi Modern

1. Pendahuluan

Di dunia aplikasi modern yang serba cepat, data adalah jantung dari segalanya. Kita sering membutuhkan data terbaru secara instan untuk berbagai kebutuhan: memperbarui cache, mereplikasi database ke sistem analitik, mengindeks ulang pencarian, atau memicu proses bisnis lainnya. Bayangkan skenario di mana setiap perubahan pada data pelanggan di database utama Anda harus langsung tercermin di sistem CRM, analitik, atau bahkan memicu notifikasi real-time.

Secara tradisional, kita mungkin mengandalkan polling (memeriksa database secara berkala) atau trigger database. Namun, pendekatan ini memiliki keterbatasan: polling bisa boros sumber daya dan tidak real-time, sementara trigger database dapat membebani database dan sulit dikelola seiring pertumbuhan aplikasi.

Di sinilah Change Data Capture (CDC) hadir sebagai solusi elegan. CDC adalah pola desain di mana kita menangkap dan merekam semua perubahan pada data di database, lalu mengalirkan perubahan tersebut ke sistem lain secara real-time. Artikel sebelumnya sudah membahas konsep dasar CDC. Kali ini, kita akan menyelam lebih dalam ke salah satu implementasi CDC paling populer dan powerful: Debezium.

Debezium memungkinkan Anda mengubah database menjadi stream peristiwa (event stream), membuka pintu untuk membangun arsitektur event-driven yang lebih responsif, skalabel, dan tangguh. Siap mengubah cara Anda berinteraksi dengan data database? Mari kita mulai!

2. Apa Itu Debezium?

Debezium adalah platform open-source untuk Change Data Capture (CDC) yang mengubah database Anda menjadi stream peristiwa. Debezium memonitor log transaksi (transaction log) di database (misalnya, WAL di PostgreSQL, binlog di MySQL/MariaDB, redo log di Oracle, transaction log di SQL Server) dan menerjemahkan setiap operasi perubahan data (INSERT, UPDATE, DELETE) menjadi event yang dikirim ke Apache Kafka.

📌 Konsep Kunci:

3. Mengapa Menggunakan Debezium?

Debezium menawarkan banyak keuntungan dan membuka berbagai use case menarik untuk developer:

🎯 Contoh Konkret: Bayangkan Anda memiliki aplikasi e-commerce. Ketika status pesanan berubah dari “Pending” menjadi “Shipped” di database pesanan, Debezium dapat menangkap perubahan ini, mengirim event ke Kafka, yang kemudian memicu:

  1. Microservice notifikasi untuk mengirim SMS/email ke pelanggan.
  2. Microservice analitik untuk memperbarui metrik pengiriman real-time.
  3. Microservice inventaris untuk menyesuaikan stok jika ada pembatalan pesanan.

Semua ini terjadi secara otomatis dan real-time, tanpa perlu memodifikasi kode aplikasi e-commerce utama Anda untuk menangani setiap integrasi.

4. Arsitektur Debezium

Debezium tidak berdiri sendiri. Ia adalah bagian dari ekosistem yang lebih besar, biasanya Apache Kafka. Berikut adalah komponen utamanya:

+----------------+       +-------------------+       +---------------+       +-----------------+
|   Database     | <---- | Debezium Connector| <---- | Kafka Connect | <---- |  Apache Kafka   |
| (PostgreSQL,   |       | (PostgreSQL,      |       |  (Worker)     |       | (Topics)        |
|  MySQL, etc.)  |       |  MySQL, etc.)     |       |               |       |                 |
| (Transaction   |       |                   |       |               |       |                 |
|  Log/WAL)      |       |                   |       |               |       |                 |
+----------------+       +-------------------+       +---------------+       +--------+--------+
                                                                                       |
                                                                                       V
                                                                                +-------------+
                                                                                | Kafka       |
                                                                                | Consumers   |
                                                                                | (Microservices,|
                                                                                |  ELK Stack, |
                                                                                |  Data Lake, |
                                                                                |  Cache, etc.)|
                                                                                +-------------+
  1. Database Sumber: Database tempat Debezium akan menangkap perubahan (misalnya PostgreSQL, MySQL, MongoDB, SQL Server, Oracle).
  2. Debezium Connector: Ini adalah inti Debezium. Setiap jenis database memiliki connector spesifiknya. Connector ini bertanggung jawab untuk membaca log transaksi database dan menghasilkan event perubahan data.
  3. Kafka Connect: Sebuah framework dan runtime untuk menjalankan connector Kafka. Debezium connector berjalan di dalam Kafka Connect. Kafka Connect menyediakan skalabilitas dan ketahanan untuk connector Anda.
  4. Apache Kafka: Message broker terdistribusi yang sangat skalabel dan tahan banting. Event perubahan data yang dihasilkan oleh Debezium akan dipublikasikan ke topik-topik Kafka.
  5. Kafka Consumers: Aplikasi atau layanan lain yang berlangganan topik Kafka dan memproses event perubahan data. Ini bisa berupa microservice, sistem analitik, cache, indeks pencarian, dll.

5. Studi Kasus: Debezium dengan PostgreSQL dan Kafka

Mari kita coba setup Debezium untuk menangkap perubahan dari database PostgreSQL dan mengirimkannya ke Apache Kafka. Kita akan menggunakan Docker Compose untuk menyederhanakan setup lingkungan.

⚠️ Prasyarat: Pastikan Docker dan Docker Compose sudah terinstal di sistem Anda.

5.1. File docker-compose.yaml

Buat file docker-compose.yaml berikut:

version: '3.8'

services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.5.0
    hostname: zookeeper
    container_name: zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000

  kafka:
    image: confluentinc/cp-kafka:7.5.0
    hostname: kafka
    container_name: kafka
    ports:
      - "9092:9092"
      - "9094:9094"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181'
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:29092,PLAINTEXT_HOST://localhost:9094
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
    depends_on:
      - zookeeper

  postgres:
    image: postgres:15
    hostname: postgres
    container_name: postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: mydatabase
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d mydatabase"]
      interval: 5s
      timeout: 5s
      retries: 5
    # Konfigurasi PostgreSQL untuk logical replication (penting untuk Debezium)
    command: postgres -c wal_level=logical -c max_replication_slots=10 -c max_wal_senders=10

  kafka-connect:
    image: debezium/connect:2.4
    hostname: kafka-connect
    container_name: kafka-connect
    ports:
      - "8083:8083"
    environment:
      BOOTSTRAP_SERVERS: kafka:29092
      GROUP_ID: 1
      CONFIG_STORAGE_TOPIC: connect-configs
      OFFSET_STORAGE_TOPIC: connect-offsets
      STATUS_STORAGE_TOPIC: connect-status
      # Tambahkan plugin Debezium PostgreSQL jika belum ada di image default
      # (biasanya sudah ada di image debezium/connect)
    depends_on:
      - kafka
      - postgres

5.2. File init.sql untuk PostgreSQL

Buat file init.sql di direktori yang sama dengan docker-compose.yaml. Ini akan membuat tabel products saat PostgreSQL pertama kali diinisialisasi.

CREATE TABLE IF NOT EXISTS products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    price DECIMAL(10, 2) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Trigger untuk mengupdate `updated_at` secara otomatis
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
    NEW.updated_at = NOW();
    RETURN NEW;
END;
$$ language 'plpgsql';

CREATE OR REPLACE TRIGGER update_products_updated_at
BEFORE UPDATE ON products
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();

INSERT INTO products (name, price) VALUES ('Laptop', 1200.00);
INSERT INTO products (name, price) VALUES ('Mouse', 25.00);

5.3. Jalankan Lingkungan

Jalankan semua service dengan Docker Compose:

docker-compose up -d

Pastikan semua container berjalan dengan baik. Tunggu beberapa saat agar Kafka Connect siap.

5.4. Mendaftarkan Debezium Connector

Setelah kafka-connect berjalan, kita perlu memberitahunya untuk mulai memonitor PostgreSQL. Kita akan membuat connector Debezium melalui API REST Kafka Connect.

curl -X POST -H "Content-Type: application/json" --data '{
    "name": "product-connector",
    "config": {
        "connector.class": "io.debezium.connector.postgresql.PostgresConnector",
        "database.hostname": "postgres",
        "database.port": "5432",
        "database.user": "user",
        "database.password": "password",
        "database.dbname": "mydatabase",
        "database.server.name": "myserver",
        "topic.prefix": "dbserver",
        "table.include.list": "public.products",
        "plugin.name": "pgoutput",
        "slot.name": "debezium_slot"
    }
}' http://localhost:8083/connectors

Penjelasan konfigurasi penting:

Setelah perintah curl berhasil, Anda akan melihat respons JSON yang mengonfirmasi bahwa connector telah dibuat.

5.5. Memverifikasi Event di Kafka

Sekarang, mari kita ubah data di PostgreSQL dan lihat event yang dihasilkan di Kafka.

Masuk ke container PostgreSQL:

docker exec -it postgres psql -U user -d mydatabase

Lalu, lakukan beberapa operasi:

INSERT INTO products (name, price) VALUES ('Keyboard', 75.00);
UPDATE products SET price = 1500.00 WHERE name = 'Laptop';
DELETE FROM products WHERE name = 'Mouse';

Untuk melihat event di Kafka, Anda bisa menggunakan Kafka console consumer. Masuk ke container Kafka:

docker exec -it kafka kafka-console-consumer --bootstrap-server kafka:29092 --topic dbserver.public.products --from-beginning

Anda akan melihat event JSON yang berisi detail perubahan data, termasuk nilai before dan after untuk operasi UPDATE dan DELETE.

{
  "before": null,
  "after": {
    "id": 3,
    "name": "Keyboard",
    "price": "75.00",
    "created_at": "2023-10-27T10:00:00Z",
    "updated_at": "2023-10-27T10:00:00Z"
  },
  "source": { ... },
  "op": "c", // 'c' for create (insert)
  "ts_ms": 1678886400000,
  "transaction": null
}
// ... event lainnya untuk UPDATE dan DELETE

Selamat! Anda telah berhasil mengalirkan perubahan data database secara real-time menggunakan Debezium.

6. Best Practices dan Pertimbangan Penting

Meskipun powerful, ada beberapa hal yang perlu diperhatikan saat menggunakan Debezium:

Kesimpulan

Debezium adalah alat yang sangat berharga dalam toolkit developer modern. Dengan kemampuannya untuk mengubah database menjadi stream peristiwa real-time, ia membuka peluang baru untuk membangun aplikasi yang lebih reaktif, terdistribusi, dan efisien. Dari sinkronisasi data instan hingga arsitektur microservice yang longgar, Debezium memungkinkan Anda mengoptimalkan interaksi data dan meningkatkan pengalaman pengguna secara signifikan.

Memanfaatkan Debezium memang membutuhkan pemahaman tentang Kafka dan arsitektur event-driven, tetapi investasi ini akan terbayar lunas dengan fondasi data yang lebih tangguh dan fleksibel untuk aplikasi Anda. Sekarang giliran Anda untuk mencoba dan melihat bagaimana Debezium dapat mentransformasi sistem Anda!

🔗 Baca Juga