Skip to main content

Command Palette

Search for a command to run...

Bài 26: Microservices với Kafka

Published
5 min read

Mục tiêu

Bài viết này nhằm mục tiêu giúp bạn hiểu rõ hơn về khái niệm Microservices và vai trò của Kafka trong việc tích hợp các dịch vụ microservices. Đồng thời, bạn sẽ học cách triển khai ứng dụng Microservices sử dụng Kafka và kiểm tra sự tích hợp của chúng.

Nội dung chính

1. Khái niệm về Microservices và vai trò của Kafka

Microservices: Microservices là một kiến trúc phần mềm trong đó ứng dụng được cấu thành từ nhiều dịch vụ nhỏ, mỗi dịch vụ đảm nhiệm một chức năng cụ thể và hoạt động độc lập. Những dịch vụ này có thể được phát triển, triển khai, và mở rộng một cách riêng biệt.

Vai trò của Kafka trong Microservices: Apache Kafka là một nền tảng stream-processing phân tán, được sử dụng phổ biến trong các kiến trúc Microservices để làm middleware truyền tải và xử lý dữ liệu giữa các dịch vụ. Kafka cung cấp khả năng xử lý luồng dữ liệu theo thời gian thực, đảm bảo độ tin cậy và khả năng mở rộng cao. Dưới đây là vài vai trò chính của Kafka trong kiến trúc Microservices:

  • Kết nối các dịch vụ: Kafka giúp các dịch vụ microservices giao tiếp với nhau một cách không đồng bộ thông qua các topic (chủ đề), giúp giảm tải và tăng khả năng chịu lỗi.

  • Xử lý dữ liệu theo luồng: Kafka có thể xử lý một lượng lớn dữ liệu theo thời gian thực, giúp các dịch vụ microservices có thể phản ứng kịp thời với các sự kiện xảy ra.

  • Lưu trữ tạm thời: Kafka lưu trữ dữ liệu sự kiện trong một khoảng thời gian nhất định, cho phép các dịch vụ có thể truy xuất và xử lý lại các sự kiện cũ khi cần thiết.

2. Các mẫu thiết kế Microservices sử dụng Kafka

Choreography-based Saga: Trong mẫu thiết kế này, các dịch vụ microservices tương tác với nhau thông qua các sự kiện được xuất ra và tiêu thụ từ Kafka. Mỗi dịch vụ sẽ xuất ra một sự kiện sau khi hoàn thành một tác vụ và các dịch vụ khác sẽ lắng nghe sự kiện này để thực hiện các tác vụ tiếp theo.

Event Sourcing: Trong mô hình Event Sourcing, tất cả các thay đổi trạng thái của ứng dụng được lưu lại dưới dạng các sự kiện trong Kafka. Các dịch vụ microservices có thể lắng nghe các sự kiện này để cập nhật trạng thái của mình, giúp duy trì tính nhất quán dữ liệu giữa các dịch vụ.

Command Query Responsibility Segregation (CQRS): CQRS chia ứng dụng thành hai phần: phần xử lý các lệnh (commands) và phần xử lý các truy vấn (queries). Kafka có thể được sử dụng để truyền tải các lệnh từ các dịch vụ khác nhau và cập nhật trạng thái dữ liệu, đồng thời cung cấp các dữ liệu cần thiết cho các truy vấn.

Thực hành

Viết ứng dụng Microservices sử dụng Kafka

Bước 1: Cài đặt Kafka Đầu tiên, bạn cần cài đặt Kafka trên máy tính của mình. Bạn có thể tải Kafka từ trang chủ của Apache Kafka và làm theo hướng dẫn cài đặt.

Bước 2: Tạo một dịch vụ Producer Tạo một dịch vụ Producer để xuất ra các sự kiện vào một topic trong Kafka. Dưới đây là một ví dụ đơn giản bằng Java sử dụng thư viện Kafka:

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;

import java.util.Properties;

public class ProducerService {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        KafkaProducer<String, String> producer = new KafkaProducer<>(props);

        for (int i = 0; i < 10; i++) {
            producer.send(new ProducerRecord<>("my-topic", Integer.toString(i), "message " + i));
        }

        producer.close();
    }
}

Bước 3: Tạo một dịch vụ Consumer Tạo một dịch vụ Consumer để lắng nghe và xử lý các sự kiện từ một topic trong Kafka. Dưới đây là một ví dụ đơn giản bằng Java:

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;

import java.time.Duration;
import java.util.Collections;
import java.util.Properties;

public class ConsumerService {
    public static void main(String[] args) {
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("group.id", "test-group");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props);
        consumer.subscribe(Collections.singletonList("my-topic"));

        while (true) {
            ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
            for (ConsumerRecord<String, String> record : records) {
                System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
            }
        }
    }
}

Tích hợp và kiểm tra các Microservices

Bước 4: Tích hợp các dịch vụ Triển khai các dịch vụ Producer và Consumer trên các máy chủ hoặc container khác nhau. Đảm bảo rằng các dịch vụ này có thể truy cập được Kafka.

Bước 5: Kiểm tra sự tích hợp Chạy dịch vụ Producer để xuất ra các sự kiện vào Kafka và kiểm tra xem dịch vụ Consumer có lắng nghe và xử lý các sự kiện này đúng cách hay không.

Câu hỏi củng cố kiến thức

Câu 1: Microservices là gì và nó khác gì so với kiến trúc monolithic truyền thống?

  • Trả lời: Microservices là một kiến trúc phần mềm trong đó ứng dụng được cấu thành từ nhiều dịch vụ nhỏ, mỗi dịch vụ đảm nhiệm một chức năng cụ thể và hoạt động độc lập. Nó khác với kiến trúc monolithic truyền thống ở chỗ các dịch vụ có thể được phát triển, triển khai, và mở rộng một cách riêng biệt, giúp tăng tính linh hoạt và khả năng chịu lỗi của hệ thống.

Câu 2: Vai trò của Kafka trong kiến trúc Microservices là gì?

  • Trả lời: Kafka đóng vai trò như một nền tảng stream-processing phân tán, giúp các dịch vụ microservices giao tiếp với nhau một cách không đồng bộ thông qua các topic. Kafka cung cấp khả năng xử lý luồng dữ liệu theo thời gian thực, lưu trữ tạm thời và đảm bảo độ tin cậy cao.

Câu 3: Mẫu thiết kế Choreography-based Saga trong Microservices sử dụng Kafka hoạt động như thế nào?

  • Trả lời: Trong mẫu thiết kế Choreography-based Saga, các dịch vụ microservices tương tác với nhau thông qua các sự kiện được xuất ra và tiêu thụ từ Kafka. Mỗi dịch vụ sẽ xuất ra một sự kiện sau khi hoàn thành một tác vụ và các dịch vụ khác sẽ lắng nghe sự kiện này để thực hiện các tác vụ tiếp theo.

Hy vọng bài viết này giúp bạn hiểu rõ hơn về cách tích hợp Kafka trong kiến trúc Microservices và cung cấp cho bạn các bước thực hành cụ thể.

More from this blog

hoangkim

366 posts