11 - Spring Boot Kafka
03/03/2025 - 3 phút
Trong bài viết này, chúng ta sẽ tìm hiểu về Spring Boot Kafka, cách tích hợp Kafka trong ứng dụng Spring Boot!
1. Giới Thiệu
Trong hệ thống microservices và xử lý dữ liệu lớn (big data), Kafka là một giải pháp message queue phân tán mạnh mẽ, giúp:
- Xử lý dữ liệu real-time với throughput cao.
- Hỗ trợ mở rộng linh hoạt, đảm bảo tính chịu lỗi.
- Tích hợp dễ dàng với hệ thống microservices, logging, và streaming.
Spring Boot hỗ trợ Kafka thông qua thư viện Spring Kafka, giúp bạn dễ dàng triển khai producer (gửi tin nhắn) và consumer (nhận tin nhắn).
Trong bài viết này, chúng ta sẽ tìm hiểu về Spring Boot Kafka, cách cấu hình, gửi và nhận tin nhắn, cũng như tối ưu hệ thống Kafka cho môi trường production.
2. Cài Đặt Apache Kafka
2.1. Chạy Kafka Bằng Docker (Khuyến Nghị)
Nếu bạn chưa có Kafka, cách nhanh nhất để chạy Kafka là sử dụng Docker:
docker-compose up -d
Tạo file docker-compose.yml
:
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
container_name: zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
container_name: kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
2.2. Cài Đặt Kafka Bằng Homebrew (MacOS/Linux)
Nếu bạn không dùng Docker, có thể cài đặt Kafka bằng Homebrew:
brew install kafka
brew services start kafka
Sau khi cài đặt, bạn có thể kiểm tra Kafka bằng lệnh:
kafka-topics.sh --list --bootstrap-server localhost:9092
3. Cài Đặt Spring Boot Kafka
3.1. Thêm Dependency
Trong pom.xml
, thêm:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-kafka</artifactId>
</dependency>
3.2. Cấu Hình Kafka Trong application.properties
spring.kafka.bootstrap-servers=localhost:9092
spring.kafka.consumer.group-id=my-group
spring.kafka.consumer.auto-offset-reset=earliest
- bootstrap-servers: Địa chỉ Kafka server.
- group-id: Mỗi consumer phải thuộc về một group để đảm bảo load balancing.
- auto-offset-reset:
earliest
giúp consumer đọc từ đầu nếu chưa có offset nào.
4. Xây Dựng Producer Và Consumer Trong Spring Boot
4.1. Tạo Kafka Producer
Producer là thành phần chịu trách nhiệm gửi tin nhắn vào Kafka.
Tạo KafkaProducerService.java
:
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
@Service
public class KafkaProducerService {
private final KafkaTemplate<String, String> kafkaTemplate;
private static final String TOPIC = "test-topic";
public KafkaProducerService(KafkaTemplate<String, String> kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
public void sendMessage(String message) {
kafkaTemplate.send(TOPIC, message);
System.out.println("Đã gửi tin nhắn: " + message);
}
}
- KafkaTemplate giúp gửi tin nhắn đến Kafka.
- send() gửi tin nhắn vào topic
test-topic
.
4.2. Tạo Kafka Consumer
Consumer sẽ lắng nghe và nhận tin nhắn từ Kafka topic.
Tạo KafkaConsumerService.java
:
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;
@Service
public class KafkaConsumerService {
@KafkaListener(topics = "test-topic", groupId = "my-group")
public void consumeMessage(String message) {
System.out.println("Nhận tin nhắn: " + message);
}
}
@KafkaListener
giúp consumer tự động lắng nghe topic.- groupId giúp Kafka quản lý nhiều consumer cùng một nhóm.
4.3. Tạo Controller Để Gửi Tin Nhắn
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/kafka")
public class KafkaController {
private final KafkaProducerService producerService;
public KafkaController(KafkaProducerService producerService) {
this.producerService = producerService;
}
@GetMapping("/send/{message}")
public String sendMessage(@PathVariable String message) {
producerService.sendMessage(message);
return "Tin nhắn đã được gửi: " + message;
}
}
4.4. Kiểm Tra Kafka
Chạy ứng dụng Spring Boot:
mvn spring-boot:run
Gửi tin nhắn bằng API:
http://localhost:8080/kafka/send/HelloKafka
Kiểm tra console:
Đã gửi tin nhắn: HelloKafka Nhận tin nhắn: HelloKafka
🎉 Kafka đã hoạt động thành công!
5. Tối Ưu Kafka Trong Spring Boot
5.1. Cấu Hình Multi-Partition Để Load Balancing
Khi có nhiều consumer cùng group-id, Kafka sẽ tự động chia đều tin nhắn giữa chúng.
Tạo topic với nhiều partition:
kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1
5.2. Bật Kafka Retention Policy
Mặc định, Kafka giữ tin nhắn trong 7 ngày. Bạn có thể thay đổi bằng cách:
log.retention.hours=168 # Giữ dữ liệu trong 7 ngày
log.segment.bytes=1073741824 # Mỗi segment file tối đa 1GB
5.3. Đảm Bảo Kafka Được Tự Động Restart Khi Lỗi
docker update --restart always kafka
6. Kết Luận
Spring Boot Kafka giúp xây dựng hệ thống message queue phân tán lớn với nhiều ưu điểm:
- Tốc độ cao, chịu tải tốt.
- Hỗ trợ real-time streaming.
- Mở rộng dễ dàng với multi-partition.
👉 Trong bài viết tiếp theo, chúng ta sẽ tìm hiểu về Spring Boot GraphQL, giúp xây dựng API linh hoạt hơn REST!