Hướng Dẫn Nhanh Về Kafka Với Docker Và Spring Boot
Apache Kafka là một nền tảng phát trực tuyến sự kiện phân tán, bền vững và thời gian thực. Nó không chỉ đơn thuần là một hàng đợi tin nhắn mà còn cung cấp khả năng mở rộng, bền vững và xử lý luồng dữ liệu.
Mục Lục
- Kafka Là Gì?
- Những Gì Kafka Có Thể Làm
- Các Khái Niệm Cơ Bản
- Cài Đặt Nhanh Với Docker
- Sử Dụng Kafka CLI
- Tích Hợp Spring Boot
- Dự Án Demo
- Kết Luận
1. Kafka Là Gì?
Apache Kafka là một nền tảng phát trực tuyến sự kiện phân tán, bền vững và thời gian thực. Được phát triển ban đầu tại LinkedIn, Kafka hiện là một phần của Quỹ Phần Mềm Apache. Kafka được thiết kế cho các kênh dữ liệu có thông lượng cao và độ trễ thấp, phân tích luồng và các ứng dụng hướng sự kiện.
Sự Kiện Là Gì?
Một sự kiện đơn giản là một bản ghi của một điều gì đó đã xảy ra trong hệ thống. Mỗi sự kiện thường bao gồm:
- Khóa → định danh (ví dụ: ID người dùng, ID đơn hàng).
- Giá trị → nội dung (ví dụ: "đơn hàng đã được tạo với tổng = $50").
- Thời gian → khi sự kiện xảy ra.
Ví dụ về sự kiện:
json
{
"key": "order-123",
"value": { "customer": "Alice", "total": 50 },
"timestamp": "2025-09-19T10:15:00Z"
}
Nền Tảng Phát Trực Tuyến Sự Kiện Là Gì?
Một nền tảng phát trực tuyến sự kiện là một hệ thống được thiết kế để xử lý các luồng dữ liệu liên tục - hay còn gọi là sự kiện - theo thời gian thực. Thay vì làm việc theo lô (xử lý dữ liệu sau sự kiện), nó cho phép các ứng dụng phản ứng ngay khi sự kiện xảy ra.
2. Những Gì Kafka Có Thể Làm
Kafka không chỉ là một hàng đợi tin nhắn - nó là xương sống sự kiện thời gian thực cho các hệ thống hiện đại.
Nhắn Tin Giống Như Một Hàng Đợi Tin Nhắn
Kafka tách rời các nhà sản xuất và người tiêu dùng, cho phép giao tiếp bất đồng bộ giữa các dịch vụ. Ví dụ: Một hệ thống ngân hàng công bố các sự kiện giao dịch lên Kafka. Phát hiện gian lận, cập nhật sổ cái và dịch vụ thông báo tiêu thụ các sự kiện này một cách độc lập.
Phát Trực Tuyến Sự Kiện
Kafka truyền tải dữ liệu theo thời gian thực, cho phép các hệ thống phản ứng ngay lập tức. Ví dụ: Một nền tảng bảo hiểm phát trực tuyến các sự kiện yêu cầu để kích hoạt xác thực tự động, kiểm tra bảo hiểm và cập nhật khách hàng ngay lập tức.
Tích Hợp Dữ Liệu
Kafka Connect liên kết Kafka với cơ sở dữ liệu, lưu trữ đám mây và các nền tảng phân tích. Ví dụ: Một công ty sản xuất chip bán dẫn phát trực tuyến dữ liệu cảm biến từ thiết bị sản xuất vào một hồ dữ liệu để bảo trì dự đoán và tối ưu hóa lợi suất.
Tập Trung Nhật Ký
Kafka tập trung nhật ký từ nhiều dịch vụ để giám sát và phân tích. Ví dụ: Một hệ thống tự động hóa công nghiệp gửi nhật ký từ PLC và bộ điều khiển đến Kafka, nơi chúng được tiêu thụ bởi một bảng điều khiển giám sát để phát hiện bất thường.
Lịch Sử Có Thể Phát Lại
Kafka giữ lại các sự kiện để xử lý lại hoặc bổ sung. Ví dụ: Một công ty bảo hiểm phát lại các sự kiện chính sách trong quá khứ để đào tạo một mô hình dự đoán rủi ro yêu cầu hoặc khách hàng hủy hợp đồng. Điều này tránh việc phụ thuộc vào các bức tranh tĩnh và cung cấp cho mô hình một cái nhìn động, có thời gian về hành vi.
Giao Tiếp Microservices Mở Rộng
Kafka xử lý nhắn tin có thông lượng cao giữa các dịch vụ phân tán. Ví dụ: Một tổ chức tài chính sử dụng Kafka để điều phối việc tiếp nhận khách hàng, kiểm tra KYC và cấp tài khoản giữa nhiều microservices.
3. Các Khái Niệm Cơ Bản
Hãy cùng phân tích các thành phần chính tạo nên kiến trúc hướng sự kiện của Kafka:
| Khái Niệm | Mô Tả |
|---|---|
| Sự kiện | Đơn vị cơ bản trong Kafka, bao gồm khóa, giá trị và thời gian. |
| Chủ đề | Một danh mục cho các sự kiện, giống như một bảng trong cơ sở dữ liệu. |
| Phân vùng | Một Chủ đề có thể được chia thành nhiều phân vùng cho tính song song và khả năng mở rộng. |
| Nhà sản xuất | Ứng dụng gửi các sự kiện đến Kafka. |
| Người tiêu dùng | Ứng dụng đọc các sự kiện từ Kafka. |
| Nhóm người tiêu dùng | Một nhóm các Người tiêu dùng chia sẻ tải trọng xử lý. |
| Máy chủ Kafka | Nút máy chủ Kafka lưu trữ dữ liệu và xử lý yêu cầu. |
| Địa chỉ | ID duy nhất cho mỗi bản ghi trong một Phân vùng. |
4. Cài Đặt Nhanh Với Docker
Cấu hình này thiết lập một máy chủ Kafka đơn lẻ sử dụng KRaft. Nó lý tưởng cho phát triển và thử nghiệm.
yaml
name: kafka
services:
kafka:
image: apache/kafka:4.1.0
container_name: kafka
environment:
KAFKA_NODE_ID: 1
KAFKA_PROCESS_ROLES: broker,controller
KAFKA_LISTENERS: BROKER://:9092,CONTROLLER://:9093
KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9093
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_INTER_BROKER_LISTENER_NAME: BROKER
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: BROKER:PLAINTEXT,CONTROLLER:PLAINTEXT
KAFKA_ADVERTISED_LISTENERS: BROKER://localhost:9092
KAFKA_CLUSTER_ID: "kafka-1"
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
KAFKA_LOG_DIRS: /var/lib/kafka/data
volumes:
- kafka_data:/var/lib/kafka/data
ports:
- "9092:9092"
volumes:
kafka_data:
Cách Chạy
Khởi động container Kafka bằng lệnh:
bash
docker compose up
Kafka sẽ có sẵn tại localhost:9092 cho các nhà sản xuất và người tiêu dùng, và nội bộ tại localhost:9093 cho giao tiếp điều khiển.
5. Sử Dụng Kafka CLI
Trước khi chạy các lệnh Kafka, đăng nhập vào container Kafka:
bash
docker container exec -it kafka bash
Tạo Chủ Đề
Tạo một chủ đề có tên quickstart với một phân vùng và hệ số sao chép là 1:
bash
/opt/kafka/bin/kafka-topics.sh --create \
--bootstrap-server localhost:9092 \
--replication-factor 1 \
--partitions 1 \
--topic quickstart
Liệt Kê Chủ Đề
Kiểm tra tất cả các chủ đề hiện có:
bash
/opt/kafka/bin/kafka-topics.sh --list \
--bootstrap-server localhost:9092
Tiêu Thụ Tin Nhắn
Đọc tin nhắn từ chủ đề quickstart bắt đầu từ đầu:
bash
/opt/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server localhost:9092 \
--topic quickstart \
--from-beginning
Gửi Tin Nhắn
Bạn có thể gửi tin nhắn đến chủ đề quickstart bằng cách nhập trực tiếp hoặc từ một tệp.
Tùy chọn A: Gửi một tin nhắn đơn
bash
echo 'Đây là Sự Kiện 1' | \
/opt/kafka/bin/kafka-console-producer.sh \
--bootstrap-server localhost:9092 \
--topic quickstart
Tùy chọn B: Gửi nhiều tin nhắn từ một tệp
bash
echo 'Đây là Sự Kiện 2' > messages.txt
echo 'Đây là Sự Kiện 3' >> messages.txt
cat messages.txt | \
/opt/kafka/bin/kafka-console-producer.sh \
--bootstrap-server localhost:9092 \
--topic quickstart
6. Tích Hợp Spring Boot
Cấu hình này cho phép tích hợp liền mạch giữa ứng dụng Spring Boot và máy chủ Apache Kafka. Nó định nghĩa cả cài đặt nhà sản xuất và người tiêu dùng cho việc tuần tự hóa, giải mã và hành vi kết nối.
pom.xml
xml
<!-- spring-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.4.9</version>
</dependency>
<!-- kafka -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>3.3.9</version>
</dependency>
<!-- Lombok (tùy chọn) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version>
<optional>true</optional>
</dependency>
application.yml
yaml
spring:
kafka:
bootstrap-servers: localhost:9092
template:
default-topic: orders
consumer:
group-id: quickstart-group
auto-offset-reset: latest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
properties:
spring.json.trusted.packages: "dev.aratax.messaging.kafka.model"
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
Thiết Lập Chủ Đề
java
@Bean
public NewTopic defaultTopic() {
return new NewTopic("orders", 1, (short) 1);
}
Mô Hình Sự Kiện
java
public class OrderEvent {
private String id;
private Status status;
private BigDecimal totalAmount;
private Instant createdAt = Instant.now();
private String createdBy;
public enum Status {
IN_PROGRESS,
COMPLETED,
CANCELLED
}
}
Ví Dụ Nhà Sản Xuất
java
@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class OrderEventController {
private final KafkaTemplate<String, OrderEvent> kafkaTemplate;
@PostMapping("/orders")
public String create(@RequestBody OrderEvent event) {
event.setId(UUID.randomUUID().toString());
event.setCreatedAt(Instant.now());
kafkaTemplate.sendDefault(event.getId(), event);
return "Đơn hàng đã được gửi đến Kafka";
}
}
Ví Dụ Người Tiêu Dùng
java
@Component
public class OrderEventsListener {
@KafkaListener(topics = "orders")
public void handle(OrderEvent event) {
System.out.println("Nhận được đơn hàng: " + event);
}
}
7. Dự Án Demo
Tôi đã xây dựng một dự án demo sử dụng Spring Boot và Kafka để chứng minh chức năng cơ bản của nhà sản xuất/người tiêu dùng. Bạn có thể xem trên GitHub: springboot-kafka-quickstart
8. Kết Luận
Apache Kafka cho phép các nhà phát triển xây dựng các hệ thống phản ứng, hướng sự kiện một cách dễ dàng. Cho dù bạn đang phát trực tuyến các giao dịch tài chính, xử lý yêu cầu bảo hiểm hay giám sát thiết bị nhà máy, Kafka cung cấp nền tảng cho giao tiếp thời gian thực, có khả năng mở rộng.
Với Docker và Spring Boot, bạn có thể bắt đầu chỉ trong vài phút - không cần thiết lập phức tạp. Hướng dẫn nhanh này cung cấp cho bạn mọi thứ bạn cần để khám phá Kafka thực tế và bắt đầu xây dựng các kênh sự kiện đạt tiêu chuẩn sản xuất.
Sẵn sàng đi sâu hơn? Hãy khám phá thiết kế/cài đặt, xử lý luồng hoặc tích hợp Kafka Connect tiếp theo.