0
0
Lập trình
Thaycacac
Thaycacac thaycacac

Hướng Dẫn Nhanh Về Kafka Với Docker Và Spring Boot

Đăng vào 5 tháng trước

• 8 phút đọc

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

  1. Kafka Là Gì?
  2. Những Gì Kafka Có Thể Làm
  3. Các Khái Niệm Cơ Bản
  4. Cài Đặt Nhanh Với Docker
  5. Sử Dụng Kafka CLI
  6. Tích Hợp Spring Boot
  7. Dự Án Demo
  8. 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 Copy
{
  "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 Copy
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 Copy
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 Copy
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 Copy
/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 Copy
/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 Copy
/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 Copy
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 Copy
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 Copy
<!-- 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 Copy
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 Copy
@Bean
public NewTopic defaultTopic() {
    return new NewTopic("orders", 1, (short) 1);
}

Mô Hình Sự Kiện

java Copy
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 Copy
@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 Copy
@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.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào