Cấu hình Apache Kafka cho các dự án .NET

1. Kafka là gì?

Kafka là hệ thống message Pub/Sub phân tán (Distributed messaging system) có khả năng scale rất tốt. Cũng có thể hiểu Kafka là một hệ thống logging để lưu lại các trạng thái của hệ thống đề phòng tránh mất thông tin.
Kafka là dự án opensoure, đã được đóng gói hoàn chỉnh, khả năng chịu lỗi cao, hiệu năng rất tốt và dễ dàng mở rộng mà không cần dừng hệ thống. Kafka có độ tin cậy cao, có khả năng lưu trữ lượng dữ liệu lớn nên nó đang dần được thay thế cho hệ thống message truyền thống.



Có thể sử dụng Kafka trong các trường hợp sau
- Sử dụng như một hệ thống message queue thay thế cho ActiveMQ hay RabbitMQ
- Website Activity Monitoring: Theo dõi hoạt động của website
- Stream Processing: Kafka là một hệ thống rất thích hợp cho việc xử lý dòng dữ liệu trong thời gian thực. Khi dữ liệu của một topic được thêm mới ngay lập tức được ghi vào hệ thống và truyền đến cho bên nhận. Ngoài ra Kafka  còn là một hệ thống có đặc tính duribility dữ liệu có thể được lưu trữ an toàn cho đến khi bên nhận sẵn sàng nhận nó.
- Log Aggregation: Tổng hợp log
- Metrics Collection: Thu thập dữ liệu, tracking hành động người dùng như các thông số như page view, search action của user sẽ được publish vào một topic và sẽ được xử lý sau
- Event-Sourcing: Lưu lại trạng thái của hệ thống để có thể tái hiện trong trường hợp system bị down.

Cấu trúc cơ bản của Kafka




Kafka bao gồm các thành phần chính sau:
Topic: Dữ liệu truyền trong Kafka được phân chia theo topic, khi cần truyền dữ liệu cho các ứng dụng khác nhau thì sẽ tạo ra cá topic khác nhau.
Partition: Đây là nơi dữ liệu cho một topic được lưu trữ. Một topic có thể có một hay nhiều partition. Trên mỗi partition thì dữ liệu lưu trữ cố định và được gán cho một ID gọi là offset. Trong một Kafka cluster thì một partition có thể replicate (sao chép) ra nhiều bản. Trong đó có một bản leader chịu trách nhiệm đọc ghi dữ liệu và các bản còn lại gọi là follower. Khi bản leader bị lỗi thì sẽ có một bản follower lên làm leader thay thế. Nếu muốn dùng nhiều consumer đọc song song dữ liệu của một topic thì topic đó cần phải có nhiều partition.
Producer: Kafka lưu, phân loại message theo topic, sử dụng producer để publish message vào các topic. Dữ liệu được gửi đển partition của topic lưu trữ trên Broker.
Consumer: Kafka sử dụng consumer để subscribe vào topic, các consumer được định danh bằng các group name. Nhiều consumer có thể cùng đọc một topic.
Broker: Kafka cluster là một set các server, mỗi một set này được gọi là 1 broker
Zookeeper: Được dùng để quản lý và bố trí các broker.

2 Cài đặt và sử dụng Kafka

Tải và cài đặt Docker Desktop
Tạo docker compose file để tiến hành cài đặt Kafka thông qua Docker. Tham khảo file docker compose dưới đây
https://github.com/confluentinc/examples/blob/5.3.1-post/cp-all-in-one/docker-compose.yml
Khởi chạy với lệnh sau
docker-compose up -d --build
Hoặc sử dụng file của mình
Khởi chạy với câu lệnh
docker-compose -f docker-compose-kafka.yml up -d --build
Một hệ thống đầy đủ Kafka trên nền tảng Confluent Platform bao gồm các thành phần sau. Tùy thuộc sự lựa chọn của bạn mà có thể bỏ đi một số thành phần không cần thiết. Ở đây tôi cài đặt tất cả.
Zookeeper.
Kafka broker.
Schema registry.
Kafka connect.
Control center.
KSQL server.
KSQL CLI.
KSQL datagen.
Rest proxy.

Kiểm tra việc cài đặt Kafka bằng cách vào giao diện web của Control Center ở đường dẫn dưới đây
http://localhost:9021

Tiến hành tạo mới một topic (my-topic)



Kiểm tra việc truyền nhận thông qua dòng lệnh
Tiến hành bật 2 cửa sổ dòng lệnh lần lượt cho Consumer và Producer
Consumer
docker exec -it broker bash
cd /usr/bin
./kafka-console-consumer --bootstrap-server broker:29092 --topic my-topic

Producer
docker exec -it broker bash
cd /usr/bin
./kafka-console-producer --broker-list broker:29092 --topic my-topic

Gõ vào message muốn gửi và quan sát kết quả ở 2 cửa sổ dòng lệnh


3. Kết nối tới Kafka từ các ứng dụng .NET

Yêu cầu
Visual Studio or Visual Studio Code
.NET Core SDK

Cài đặt
Các bạn có thể tham khảo và tải về code mẫu ở đây.
Tiến hành tạo mới một Console App project
dotnet new console -o KafkaTest
Cài đặt thư viện Confluent.Kafka để tương tác với Kafka
https://www.nuget.org/packages/Confluent.Kafka

cd KafkaTest
dotnet add package Confluent.Kafka

Tham khảo đoạn code ví dụ dưới đây
Chạy và tiến hành kiểm tra kết quả
dotnet build
dotnet run



Tham khảo thêm
https://nielsberglund.com/2019/06/18/confluent-platform--kafka-for-a-.net-developer-on-windows/
https://github.com/confluentinc/confluent-kafka-dotnet