0
0
Lập trình
Admin Team
Admin Teamtechmely

Khám Phá Apache Kafka: Khái Niệm, Ứng Dụng và Sản Xuất

Đăng vào 3 ngày trước

• 4 phút đọc

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:

  1. 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.
  2. 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.
  3. 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

  1. Kafka & Zookeeper > Ví dụ đoạn mã Docker Compose:
yaml Copy
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:

Copy
docker-compose up -d
  1. Cài đặt các phụ thuộc
Copy
pip install kafka-python

Mã Nguồn

1. Nhà sản xuất: Truyền giá BTC từ Binance đến Kafka

python Copy
# 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 Copy
# 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

  1. Bắt đầu Kafka + Zookeeper trên Docker
Copy
docker-compose up -d
  1. Chạy Nhà sản xuất: python producer.py
  2. 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.

Tài Nguyên Đọc Thêm:

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