Kata Pembuka
Dalam era teknologi yang semakin berkembang pesat, kebutuhan untuk mengelola data dalam jumlah besar dan secara real-time menjadi sangat krusial. Apache Kafka hadir sebagai solusi andal yang memungkinkan pengiriman dan pengolahan data secara cepat dan terdistribusi. Kafka telah digunakan oleh berbagai perusahaan besar untuk membangun sistem yang dapat menangani aliran data yang sangat besar dengan latensi rendah, seperti sistem pemrosesan transaksi, analisis data waktu nyata, dan integrasi antar sistem yang berbasis event-driven.
Artikel ini akan membahas dasar-dasar Apache Kafka, konsep utamanya, serta bagaimana mengintegrasikan Kafka ke dalam aplikasi berbasis Spring Boot. Kita akan mempelajari cara mengatur Kafka di proyek Spring Boot Anda, membuat producers dan consumers, serta mengeksplorasi potensi penuh dari Kafka untuk membangun aplikasi yang scalable dan efisien.
Pengenalan Apache Kafka
Apache Kafka adalah platform distribusi berbasis log terdistribusi yang dirancang untuk menangani aliran data secara real-time. Dikembangkan oleh LinkedIn dan kemudian disumbangkan ke Apache Software Foundation, Kafka telah menjadi salah satu alat paling populer dalam mengelola stream data besar yang perlu diproses dan dianalisis dengan cepat.
Kafka dikenal sebagai platform messaging yang memungkinkan berbagai aplikasi untuk mempublikasikan, mengkonsumsi, menyimpan, dan memproses data dalam jumlah besar dengan kecepatan tinggi. Kafka banyak digunakan untuk membangun sistem event-driven architecture, di mana perubahan dalam satu aplikasi dapat segera memicu tindakan di aplikasi lain melalui event atau pesan yang diteruskan oleh Kafka.
- High Throughput: Kafka mampu menangani jutaan pesan per detik bahkan pada infrastruktur minimal, menjadikannya ideal untuk aplikasi berskala besar.
- Scalability: Kafka dirancang untuk menskalakan, memungkinkan Anda menambah lebih banyak broker ke dalam cluster Kafka untuk menangani lebih banyak data tanpa kehilangan kinerja.
- Durability: Data yang dikirimkan ke Kafka disimpan secara persisten dalam log, dan Kafka mendukung replikasi data antar broker untuk memastikan ketersediaan dan keamanan data yang tinggi.
- Fault Tolerance: Kafka memiliki mekanisme toleransi kegagalan yang baik dengan replikasi dan pengelolaan cluster secara otomatis, sehingga tetap bisa berjalan meskipun ada beberapa node yang gagal.
Contoh Kasus Penggunaan Kafka
- Monitoring dan Analytics Real-Time: Kafka digunakan untuk memproses dan menganalisis data sensor atau log sistem dalam waktu nyata, memungkinkan organisasi untuk membuat keputusan cepat.
- Pengelolaan Transaksi: Di sektor keuangan, Kafka digunakan untuk mengelola dan memproses aliran data transaksi, misalnya dalam sistem pembayaran atau perdagangan saham.
- Komunikasi Antar-Layanan: Dalam arsitektur microservices, Kafka sering digunakan untuk komunikasi antar-layanan, memastikan bahwa setiap perubahan atau event dapat disampaikan dengan cepat dan terdistribusi dengan baik.
Pengantar Integrasi Kafka dan Spring Boot
- Kemudahan Konfigurasi: Spring Boot menyediakan pengaturan otomatis yang memudahkan integrasi Kafka tanpa harus menulis banyak kode boilerplate. Dengan pengaturan yang sederhana, Anda dapat langsung mulai mengirim dan menerima pesan.
- Dukungan untuk Asynchronous Processing: Integrasi ini mendukung pemrosesan asinkron, yang memungkinkan aplikasi untuk tetap responsif sambil memproses data secara paralel.
- Pengelolaan Dependency yang Mudah: Dengan Maven atau Gradle, Anda dapat mengelola dependency Kafka dan Spring Boot dengan mudah, memastikan bahwa Anda selalu menggunakan versi terbaru yang kompatibel.
- Monitoring dan Manajemen yang Mudah: Spring Boot Actuator, yang dapat digunakan bersamaan dengan Kafka, memungkinkan Anda untuk memantau dan mengelola aplikasi dengan lebih baik, memberikan visibilitas terhadap kinerja dan kesehatan aplikasi.
- Kemampuan Scaling: Dengan arsitektur microservices yang sering digunakan dalam aplikasi berbasis Spring Boot, Kafka memungkinkan aplikasi untuk diskalakan dengan mudah, baik dalam hal pengiriman maupun pemrosesan pesan.
Integrasi Kafka Pada Project Spring Boot
1. Buka File pom.xml
Temukan file pom.xml di root direktori proyek Spring Boot Anda. File ini mengatur dependency, plugin, dan konfigurasi build untuk proyek Maven Anda.
2. Tambahkan Dependency Kafka
Di dalam elemen <dependencies>, tambahkan dependency berikut untuk mendukung Kafka:
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
3. Mengatur Versi Dependency (Opsional)
Jika Anda ingin mengontrol versi secara eksplisit, Anda dapat menambahkan tag <version>
di dalam dependency tersebut. Namun, jika Anda menggunakan spring-boot-starter-parent
seperti pada proyek ini, versi yang tepat akan dikelola oleh Spring Boot.
4. Contoh Penggalan Bagian Dependency Kafka dalam pom.xml
Setelah menambahkan dependency Kafka, bagian <dependencies>
dalam pom.xml
Anda seharusnya terlihat seperti berikut:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.3.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.mhyusuf</groupId>
<artifactId>YBoilerplate</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>YBoilerplate</name>
<description>YBoilerplate</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>21</java.version>
</properties>
<dependencies>
...
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
</dependencies>
5. Menyimpan Perubahan dan Mengupdate Proyek
Setelah menambahkan dependency, simpan perubahan pada pom.xml
. Jika Anda menggunakan IDE seperti IntelliJ IDEA atau Eclipse, pastikan untuk mengupdate proyek Maven Anda agar IDE mengenali perubahan dependency yang baru ditambahkan.
6. Verifikasi Dependency
Anda dapat memverifikasi bahwa dependency Kafka telah ditambahkan dengan sukses dengan menjalankan perintah berikut di terminal proyek Anda:
PS D:\analisa\YBoilerplate> mvn dependency:tree
[INFO] Scanning for projects... [INFO] [INFO] ----------------------< com.mhyusuf:YBoilerplate >---------------------- [INFO] Building YBoilerplate 0.0.1-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:3.6.1:tree (default-cli) @ YBoilerplate --- [INFO] com.mhyusuf:YBoilerplate:jar:0.0.1-SNAPSHOT [INFO] +- org.springframework.boot:spring-boot-starter-web:jar:3.3.3:compile [INFO] | +- org.springframework.boot:spring-boot-starter:jar:3.3.3:compile [INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:3.3.3:compile [INFO] | | | +- ch.qos.logback:logback-classic:jar:1.5.7:compile [INFO] | | | | \- ch.qos.logback:logback-core:jar:1.5.7:compile [INFO] | | | +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.23.1:compile [INFO] | | | | \- org.apache.logging.log4j:log4j-api:jar:2.23.1:compile [INFO] | | | \- org.slf4j:jul-to-slf4j:jar:2.0.16:compile [INFO] | | +- jakarta.annotation:jakarta.annotation-api:jar:2.1.1:compile [INFO] | | \- org.yaml:snakeyaml:jar:2.2:compile [INFO] | +- org.springframework.boot:spring-boot-starter-json:jar:3.3.3:compile [INFO] | | +- com.fasterxml.jackson.core:jackson-databind:jar:2.17.2:compile [INFO] | | | +- com.fasterxml.jackson.core:jackson-annotations:jar:2.17.2:compile [INFO] | | | \- com.fasterxml.jackson.core:jackson-core:jar:2.17.2:compile [INFO] | | +- com.fasterxml.jackson.datatype:jackson-datatype-jdk8:jar:2.17.2:compile [INFO] | | +- com.fasterxml.jackson.datatype:jackson-datatype-jsr310:jar:2.17.2:compile [INFO] | | \- com.fasterxml.jackson.module:jackson-module-parameter-names:jar:2.17.2:compile [INFO] | +- org.springframework.boot:spring-boot-starter-tomcat:jar:3.3.3:compile [INFO] | | +- org.apache.tomcat.embed:tomcat-embed-core:jar:10.1.28:compile [INFO] | | +- org.apache.tomcat.embed:tomcat-embed-el:jar:10.1.28:compile [INFO] | | \- org.apache.tomcat.embed:tomcat-embed-websocket:jar:10.1.28:compile [INFO] | +- org.springframework:spring-web:jar:6.1.12:compile [INFO] | | \- org.springframework:spring-beans:jar:6.1.12:compile [INFO] | \- org.springframework:spring-webmvc:jar:6.1.12:compile [INFO] | +- org.springframework:spring-aop:jar:6.1.12:compile [INFO] | \- org.springframework:spring-expression:jar:6.1.12:compile [INFO] +- org.springframework.boot:spring-boot-starter-thymeleaf:jar:3.3.3:compile [INFO] | \- org.thymeleaf:thymeleaf-spring6:jar:3.1.2.RELEASE:compile [INFO] | +- org.thymeleaf:thymeleaf:jar:3.1.2.RELEASE:compile [INFO] | | +- org.attoparser:attoparser:jar:2.0.7.RELEASE:compile [INFO] | | \- org.unbescape:unbescape:jar:1.1.6.RELEASE:compile [INFO] | \- org.slf4j:slf4j-api:jar:2.0.16:compile [INFO] +- org.springframework.boot:spring-boot-devtools:jar:3.3.3:runtime [INFO] | +- org.springframework.boot:spring-boot:jar:3.3.3:compile [INFO] | \- org.springframework.boot:spring-boot-autoconfigure:jar:3.3.3:compile [INFO] +- org.projectlombok:lombok:jar:1.18.34:compile [INFO] +- org.springframework.boot:spring-boot-starter-test:jar:3.3.3:test [INFO] | +- org.springframework.boot:spring-boot-test:jar:3.3.3:test [INFO] | +- org.springframework.boot:spring-boot-test-autoconfigure:jar:3.3.3:test [INFO] | +- com.jayway.jsonpath:json-path:jar:2.9.0:test [INFO] | +- jakarta.xml.bind:jakarta.xml.bind-api:jar:4.0.2:test [INFO] | | \- jakarta.activation:jakarta.activation-api:jar:2.1.3:test [INFO] | +- net.minidev:json-smart:jar:2.5.1:test [INFO] | | \- net.minidev:accessors-smart:jar:2.5.1:test [INFO] | | \- org.ow2.asm:asm:jar:9.6:test [INFO] | +- org.assertj:assertj-core:jar:3.25.3:test [INFO] | | \- net.bytebuddy:byte-buddy:jar:1.14.19:test [INFO] | +- org.awaitility:awaitility:jar:4.2.2:test [INFO] | +- org.hamcrest:hamcrest:jar:2.2:test [INFO] | +- org.junit.jupiter:junit-jupiter:jar:5.10.3:test [INFO] | | +- org.junit.jupiter:junit-jupiter-api:jar:5.10.3:test [INFO] | | | +- org.opentest4j:opentest4j:jar:1.3.0:test [INFO] | | | +- org.junit.platform:junit-platform-commons:jar:1.10.3:test [INFO] | | | \- org.apiguardian:apiguardian-api:jar:1.1.2:test [INFO] | | +- org.junit.jupiter:junit-jupiter-params:jar:5.10.3:test [INFO] | | \- org.junit.jupiter:junit-jupiter-engine:jar:5.10.3:test [INFO] | | \- org.junit.platform:junit-platform-engine:jar:1.10.3:test [INFO] | +- org.mockito:mockito-core:jar:5.11.0:test [INFO] | | +- net.bytebuddy:byte-buddy-agent:jar:1.14.19:test [INFO] | | \- org.objenesis:objenesis:jar:3.3:test [INFO] | +- org.mockito:mockito-junit-jupiter:jar:5.11.0:test [INFO] | +- org.skyscreamer:jsonassert:jar:1.5.3:test [INFO] | | \- com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1:test [INFO] | +- org.springframework:spring-core:jar:6.1.12:compile [INFO] | | \- org.springframework:spring-jcl:jar:6.1.12:compile [INFO] | +- org.springframework:spring-test:jar:6.1.12:test [INFO] | \- org.xmlunit:xmlunit-core:jar:2.9.1:test [INFO] +- org.springframework.boot:spring-boot-starter-actuator:jar:3.3.3:compile [INFO] | +- org.springframework.boot:spring-boot-actuator-autoconfigure:jar:3.3.3:compile [INFO] | | \- org.springframework.boot:spring-boot-actuator:jar:3.3.3:compile [INFO] | +- io.micrometer:micrometer-observation:jar:1.13.3:compile [INFO] | | \- io.micrometer:micrometer-commons:jar:1.13.3:compile [INFO] | \- io.micrometer:micrometer-jakarta9:jar:1.13.3:compile [INFO] | \- io.micrometer:micrometer-core:jar:1.13.3:compile [INFO] | +- org.hdrhistogram:HdrHistogram:jar:2.2.2:runtime [INFO] | \- org.latencyutils:LatencyUtils:jar:2.0.3:runtime [INFO] \- org.springframework.kafka:spring-kafka:jar:3.2.3:compile [INFO] +- org.springframework:spring-context:jar:6.1.12:compile [INFO] +- org.springframework:spring-messaging:jar:6.1.12:compile [INFO] +- org.springframework:spring-tx:jar:6.1.12:compile [INFO] +- org.springframework.retry:spring-retry:jar:2.0.8:compile [INFO] \- org.apache.kafka:kafka-clients:jar:3.7.1:compile [INFO] +- com.github.luben:zstd-jni:jar:1.5.6-3:runtime [INFO] +- org.lz4:lz4-java:jar:1.8.0:runtime [INFO] \- org.xerial.snappy:snappy-java:jar:1.1.10.5:runtime [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.152 s [INFO] Finished at: 2024-10-25T13:29:21+07:00 [INFO] ------------------------------------------------------------------------ PS D:\analisa\YBoilerplate>
Perintah ini akan menampilkan pohon dependency proyek Anda, dan Anda harus melihat spring-kafka
dalam daftar.
Dengan menambahkan dependency Kafka ke dalam pom.xml
, Anda telah mempersiapkan proyek Spring Boot Anda untuk menggunakan Apache Kafka. Selanjutnya, kita akan melakukan konfigurasi Kafka di application.properties
untuk melanjutkan proses integrasi.
Instalasi dan Setup Kafka di Lokal dengan Docker (Di Host Windows 11)
Berikut adalah docker compose yang saya gunakan untuk menjalankan kafka di local saya.
version: "3"
networks:
LocalKafkaNetwork:
services:
zookeeper:
image: 'bitnami/zookeeper:latest'
ports:
- '2181:2181'
environment:
- ALLOW_ANONYMOUS_LOGIN=yes
networks:
- LocalKafkaNetwork
kafka:
image: 'bitnami/kafka:latest'
user: root
ports:
- '9092:9092'
environment:
- KAFKA_BROKER_ID=1
- KAFKA_LISTENERS=PLAINTEXT://:9092
- KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092
- KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
volumes:
- ./Kafka:/bitnami/kafka
networks:
- LocalKafkaNetwork
depends_on:
- zookeeper
docker-compose.yml
:Jaringan (
LocalKafkaNetwork
): Digunakan untuk menghubungkan Kafka dan Zookeeper agar bisa saling berkomunikasi dalam satu jaringan internal.Zookeeper:
- Menggunakan image
bitnami/zookeeper:latest
. - Port 2181 terbuka untuk komunikasi dengan Kafka.
- Diizinkan login anonim.
- Menggunakan image
Kafka:
- Menggunakan image
bitnami/kafka:latest
. - Port 9092 terbuka agar Kafka bisa diakses di
localhost:9092
. - Terhubung ke Zookeeper melalui
zookeeper:2181
. - Menggunakan penyimpanan volume lokal di
./Kafka
.
- Menggunakan image
Dependency: Kafka dijalankan setelah Zookeeper dimulai (
depends_on
).
File ini menjalankan Kafka dan Zookeeper dengan Docker untuk mempermudah setup lokal.
Menyalakan Kafka Dengan Docker Terminal
Anda bisa jalankan docker-compose.yml diatas dari Terminal, Intellij IDEA Atau Docker GUI lainnya.
![]() |
Menjalankan kafka dengan docker-compose.yml di Terminal |
Dengan InteliJ IDEA (ULTIMATE)
Docker Container di Jalankan dari IntelliJ IDEA |
Selain dari IntelliJ IDEA juga bisa dijalankan dari Docker Desktop Atau Terminal.
Dengan Docker Desktop
Kafka dan Zookeeper di Windows 11 |
Kafka dan Zookeeper di Windows 11 |
Kafka dan Zookeeper di Windows 11 dalam kondisi Menyala |
Cek Sambungan ke Kafka dengan Kafka Magic
Kafka Magic adalah alat berbasis GUI (antarmuka grafis) yang memudahkan pengelolaan topik untuk bekerja dengan kluster Apache Kafka. Alat ini memungkinkan Anda untuk mencari dan menampilkan pesan, memindahkan dan mengubah pesan antar topik, meninjau dan memperbarui skema, mengelola topik, serta mengotomatiskan berbagai tugas yang rumit.
Kafka Magic mempermudah pengelolaan topik, pengujian QA (Quality Assurance), dan Pengujian Integrasi melalui antarmuka pengguna yang intuitif dan mudah digunakan.
Kafka Magic Community Edition dapat digunakan secara GRATIS, baik untuk keperluan pribadi maupun bisnis. Download di sini!
Kafka Magic Exe |
Kafka Magic Exe setelah di klik 1 |
Kafka Magic Exe setelah di klik 2 |
Dengan menyelesaikan instalasi dan setup Apache Kafka di lokal menggunakan Docker di host Windows 11, Anda kini memiliki lingkungan pengembangan yang siap untuk diintegrasikan dengan aplikasi Anda. Kafka berjalan di atas Docker menawarkan fleksibilitas dan kemudahan dalam pengelolaan kluster Kafka, memungkinkan Anda untuk melakukan berbagai eksperimen tanpa khawatir tentang pengaturan server manual.
Selain itu, dengan Kafka Magic, Anda dapat mengelola topik Kafka, meninjau pesan, dan memanipulasi skema dengan mudah melalui antarmuka pengguna yang sederhana dan intuitif. Alat ini sangat berguna untuk pengujian dan debugging selama pengembangan, serta memastikan integrasi yang mulus antara aplikasi dan Kafka.
Dengan dua komponen penting ini, yaitu Kafka dan Kafka Magic, Anda siap untuk mulai memanfaatkan kekuatan Kafka dalam aplikasi Spring Boot Anda, baik untuk membangun sistem berbasis event-driven maupun untuk streaming data secara real-time.
Selanjutnya, kita akan melanjutkan dengan integrasi Kafka ke dalam proyek Spring Boot Anda, menjelaskan langkah-langkah membuat producer dan consumer serta melakukan pengujian dari awal hingga selesai.
Konfigurasi Koneksi Kafka di application.properties
Setelah menambahkan dependency dan segala keperluan diatas, langkah berikutnya adalah mengkonfigurasi bootstrap server dan beberapa parameter penting untuk menghubungkan aplikasi Anda ke broker Kafka.
Contoh konfigurasi Kafka dasar dalam application.properties
:
# Alamat server Kafka (sesuaikan dengan host dan port Kafka Anda)
spring.kafka.bootstrap-servers=localhost:9092
# Konfigurasi Consumer
spring.kafka.consumer.group-id=my-group
spring.kafka.consumer.auto-offset-reset=earliest
# Konfigurasi Producer
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
# Konfigurasi Consumer
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
Penjelasan singkat dari konfigurasi di atas:
spring.kafka.bootstrap-servers
: Menentukan alamat broker Kafka yang akan diakses oleh aplikasi. Dalam kasus ini, Kafka dijalankan secara lokal dilocalhost:9092
.spring.kafka.consumer.group-id
: Menetapkan group ID untuk consumer Kafka. Setiap consumer dalam group yang sama akan berbagi data dari Kafka, dan Kafka memastikan pesan hanya diterima sekali oleh salah satu consumer dalam group tersebut.spring.kafka.consumer.auto-offset-reset
: Mengatur bagaimana Kafka harus menangani offset saat consumer pertama kali dijalankan. Nilaiearliest
memastikan bahwa consumer akan membaca dari pesan paling awal jika belum ada offset yang tersimpan.spring.kafka.producer.key-serializer
&spring.kafka.producer.value-serializer
: Menentukan cara meng-serialize data yang dikirim oleh producer ke Kafka. Dalam contoh ini, digunakan serializer untuk tipeString
.spring.kafka.consumer.key-deserializer
&spring.kafka.consumer.value-deserializer
: Digunakan oleh consumer untuk mendeserialize data yang diterima dari Kafka menjadiString
.
Juga bisa menggunakan application.yml untuk application.properties
, Tapi tidak di jelaskan disini supaya tidak terlalu panjang.
Kesimpulan
Dengan konfigurasi sederhana di application.properties
atau application.yml
, aplikasi Spring Boot Anda siap berkomunikasi dengan Kafka. Pengaturan ini menyediakan kerangka dasar untuk membangun aplikasi berbasis event-driven yang kuat dengan Kafka sebagai platform pemrosesan pesan. Setelah ini, Anda dapat melanjutkan dengan menambahkan Producer dan Consumer yang lebih kompleks, sesuai dengan kebutuhan sistem Anda.
Selanjutnya Part 2: Mengenal Apache Kafka dan Integrasi dengan Spring Boot 2
Comments
Post a Comment