Giới Thiệu
Apache Kafka là một hệ thống xử lý sự kiện theo thời gian thực, được phát triển bởi LinkedIn vào năm 2010. Nó dành cho việc xử lý các luồng dữ liệu lớn và giúp các ứng dụng hoạt động một cách liên kết lỏng lẻo. Trong bài viết này, chúng ta sẽ tìm hiểu sâu về Kafka, các khái niệm cốt lõi, ứng dụng thực tế, và cách triển khai nó trong môi trường sản xuất.
Apache Kafka Là Gì?
Apache Kafka là một hệ thống mã nguồn mở, phân tán, chuyên xử lý dữ liệu theo thời gian thực. Kafka có ba chức năng chính:
- Xuất bản hoặc đăng ký: Các ứng dụng có thể xuất bản hoặc đăng ký dữ liệu hoặc luồng sự kiện.
- Xử lý dữ liệu theo thời gian thực: Kafka cho phép xử lý dữ liệu ngay khi nó được tạo ra.
- Lưu trữ dữ liệu: Dữ liệu được lưu trữ dưới dạng các bản ghi khi chúng xảy ra.
Khái Niệm Về Sự Kiện (Event-Streaming)
Sự kiện là việc ghi lại dữ liệu ngay khi nó được tạo ra từ các nguồn sự kiện như cơ sở dữ liệu, API, thiết bị IoT, dịch vụ đám mây và các ứng dụng phần mềm khác.
Cách Hoạt Động Của Kafka
Kafka hỗ trợ hai mô hình nhắn tin: xếp hàng (queuing) và xuất bản-đăng ký (publish-subscribe). Mô hình xếp hàng phân phối việc xử lý dữ liệu qua nhiều người tiêu dùng, cho phép mở rộng quy mô, trong khi mô hình xuất bản-đăng ký gửi mọi tin nhắn đến tất cả các người tiêu dùng, hạn chế phân phối khối lượng công việc. Để khắc phục điều này, Kafka sử dụng mô hình nhật ký phân vùng (partitioned log).
Tóm Tắt Các Khái Niệm Trong Kafka
- Sự kiện (Event): Một bản ghi về một điều gì đó đã xảy ra (khóa, giá trị, thời gian, tiêu đề).
- Nhà sản xuất (Producer): Ghi các sự kiện vào các chủ đề (topics).
- Người tiêu dùng (Consumer): Đọc các sự kiện từ các chủ đề.
- Chủ đề (Topic): Lưu trữ các sự kiện (giống như một thư mục).
- Phân vùng (Partition): Tập con của một chủ đề; bảo toàn thứ tự cho các sự kiện có cùng khóa.
- Sao chép (Replication): Nhiều bản sao của các phân vùng để đảm bảo khả năng chịu lỗi (thường là 3).
- Bảo trì (Retention): Các sự kiện được giữ trong một khoảng thời gian có thể cấu hình, không bị xóa khi đọc.
Dự Án Khởi Đầu Nhanh (Quickstart) Với Docker
Dưới đây là một dự án đơn giản sử dụng Python để truyền dữ liệu giá BTC/USDT từ API Binance vào Kafka, và sau đó tiêu thụ lại.
Yêu Cầu
- Kafka & Zookeeper > Ví dụ đoạn mã Docker Compose:
yaml
services:
zookeeper:
image: confluentinc/cp-zookeeper:7.4.0
environment:
ZOOKEEPER_CLIENT_PORT: 2181
kafka:
image: confluentinc/cp-kafka:7.4.0
ports:
- "9092:9092"
environment:
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
Chạy:
docker-compose up -d
- Cài đặt các phụ thuộc
pip install kafka-python
Mã Nguồn
1. Nhà sản xuất: Truyền giá BTC từ Binance đến Kafka
python
# producer.py
import time
import requests
from kafka import KafkaProducer
import json
KAFKA_TOPIC = "btc_prices"
KAFKA_BROKER = "localhost:9092"
def get_btc_price():
url = "https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT"
response = requests.get(url).json()
return response
if __name__ == "__main__":
producer = KafkaProducer(
bootstrap_servers=KAFKA_BROKER,
value_serializer=lambda v: json.dumps(v).encode("utf-8")
)
while True:
price_data = get_btc_price()
producer.send(KAFKA_TOPIC, price_data)
print(f"Sent: {price_data}")
time.sleep(2) # lấy giá mỗi 2 giây
2. Người tiêu dùng: Đọc giá BTC từ Kafka
python
# consumer.py
from kafka import KafkaConsumer
import json
KAFKA_TOPIC = "btc_prices"
KAFKA_BROKER = "localhost:9092"
if __name__ == "__main__":
consumer = KafkaConsumer(
KAFKA_TOPIC,
bootstrap_servers=KAFKA_BROKER,
value_deserializer=lambda m: json.loads(m.decode("utf-8")),
auto_offset_reset="earliest",
enable_auto_commit=True
)
for message in consumer:
print(f"Received: {message.value}")
Chạy Dự Án
- Bắt đầu Kafka + Zookeeper trên Docker
docker-compose up -d
- Chạy Nhà sản xuất:
python producer.py
- Chạy Người tiêu dùng:
python consumer.py
Bạn sẽ thấy giá BTC/USDT được truyền trực tiếp từ Binance --> Kafka --> Người tiêu dùng.
Kết Luận
Tóm lại, Kafka là cầu nối giữa các hệ thống hàng đợi truyền thống và các hệ thống xuất bản-đăng ký, cung cấp giải pháp mở rộng, chịu lỗi và hiệu suất cao cho việc truyền dữ liệu theo thời gian thực. Kiến trúc nhật ký phân vùng của nó cho phép xử lý song song trong khi đảm bảo tính nhất quán và khả năng phát lại dữ liệu, khiến nó trở thành công cụ thiết yếu cho các ứng dụng dựa trên dữ liệu hiện đại. Từ việc cung cấp phân tích chuyến đi của Uber đến các nguồn cấp dữ liệu hoạt động của LinkedIn, Kafka đã chứng minh sự tin cậy của nó trong các môi trường sản xuất quy mô lớn. Khi các tổ chức tiếp tục áp dụng kiến trúc dựa trên sự kiện, việc thành thạo Kafka sẽ là một kỹ năng quý giá cho các kỹ sư muốn xây dựng các đường ống dữ liệu bền vững và sẵn sàng cho tương lai.