Streaming Databases

📚 Giới Thiệu

Cơ sở dữ liệu luồng (streaming database) là một loại cơ sở dữ liệu được thiết kế để nhập, xử lý và phân tích các luồng dữ liệu liên tục trong thời gian thực. Không giống như các cơ sở dữ liệu truyền thống hoạt động trên dữ liệu ở trạng thái nghỉ (data at rest), cơ sở dữ liệu luồng hoạt động trên dữ liệu đang chuyển động (data in motion).


❓ Tại sao cần cơ sở dữ liệu luồng?

Trong nhiều trường hợp sử dụng hiện đại, giá trị của dữ liệu giảm dần theo thời gian. Các quyết định cần được đưa ra trong vài giây hoặc mili giây sau khi một sự kiện xảy ra. Các hệ thống xử lý hàng loạt truyền thống, chạy các công việc trên dữ liệu được thu thập trong nhiều giờ hoặc nhiều ngày, quá chậm cho các yêu cầu này.

Ví dụ về các trường hợp sử dụng thời gian thực: - Phát hiện gian lận: Xác định một giao dịch thẻ tín dụng gian lận ngay khi nó xảy ra. - Phân tích nhật ký: Phát hiện các mối đe dọa bảo mật hoặc các lỗi nghiêm trọng từ các luồng nhật ký ứng dụng. - Giám sát IoT: Theo dõi dữ liệu cảm biến từ các thiết bị IoT để phát hiện các điểm bất thường hoặc kích hoạt các cảnh báo. - Cá nhân hóa thời gian thực: Cập nhật các đề xuất sản phẩm cho người dùng khi họ duyệt một trang web thương mại điện tử.


🚀 Các khái niệm chính

1. Continuous Queries (Truy vấn liên tục)

  • Thay vì chạy một truy vấn một lần trên một tập dữ liệu tĩnh, bạn đăng ký một truy vấn liên tục trên một luồng dữ liệu.
  • Truy vấn liên tục chạy và phát ra các kết quả mới khi dữ liệu mới đến. Các kết quả này được cập nhật liên tục.
  • Thường được thể hiện bằng SQL với các phần mở rộng cho các hoạt động dựa trên thời gian.

2. Windows (Cửa sổ)

  • Vì các luồng dữ liệu là vô hạn, các phép tổng hợp (như COUNT, SUM, AVG) phải được thực hiện trên một cửa sổ dữ liệu hữu hạn.
  • Tumbling Window: Một cửa sổ có kích thước cố định, không chồng chéo (ví dụ: số lượng nhấp chuột mỗi 10 giây).
  • Hopping Window: Một cửa sổ có kích thước cố định, trượt theo một khoảng thời gian đã đặt (ví dụ: tính toán số lượng nhấp chuột trong 10 giây qua, cập nhật mỗi 5 giây).
  • Sliding Window: Một cửa sổ chỉ được cập nhật khi một sự kiện mới đến (ví dụ: tính toán mức trung bình của 5 sự kiện gần nhất).
  • Session Window: Một cửa sổ nhóm các sự kiện theo các khoảng thời gian không hoạt động (ví dụ: nhóm tất cả các nhấp chuột của người dùng cho đến khi họ không hoạt động trong 30 phút).

3. Materialized Views (Khung nhìn cụ thể hóa)

  • Kết quả của một truy vấn liên tục thường được lưu trữ trong một khung nhìn cụ thể hóa.
  • Khung nhìn này được cập nhật liên tục khi dữ liệu mới được xử lý, cung cấp một cái nhìn thời gian thực, cập nhật về trạng thái của luồng.

Ví dụ về SQL luồng

-- Tạo một khung nhìn cụ thể hóa để đếm số lần nhấp chuột
-- cho mỗi URL trong một cửa sổ lật 10 giây.

CREATE MATERIALIZED VIEW clicks_per_url_10s AS
SELECT
    url,
    COUNT(*) as click_count
FROM clicks
GROUP BY url, TUMBLE(INTERVAL '10' SECOND);

-- Truy vấn khung nhìn cụ thể hóa để có được kết quả mới nhất
SELECT * FROM clicks_per_url_10s;

🛠️ Các nền tảng và cơ sở dữ liệu luồng phổ biến

  • ksqlDB: Một cơ sở dữ liệu luồng sự kiện cho Apache Kafka. Nó cung cấp một giao diện SQL đơn giản để xử lý dữ liệu Kafka trong thời gian thực.
  • Apache Flink: Một khung xử lý luồng mã nguồn mở mạnh mẽ với API SQL. Nó thường được coi là một trong những công cụ xử lý luồng tiên tiến nhất.
  • Materialize: Một cơ sở dữ liệu luồng tương thích với PostgreSQL, được thiết kế để duy trì các khung nhìn cụ thể hóa được cập nhật liên tục từ các luồng dữ liệu.
  • RisingWave: Một cơ sở dữ liệu luồng mã nguồn mở, phân tán, tương thích với PostgreSQL.
  • Tinybird: Một nền tảng phân tích thời gian thực cho phép nhập dữ liệu thông lượng cao và các điểm cuối API SQL có độ trễ thấp.

🆚 Xử lý luồng so với Xử lý hàng loạt

Tính năng Xử lý luồng (Streaming) Xử lý hàng loạt (Batch)
Mô hình dữ liệu Dữ liệu đang chuyển động (vô hạn) Dữ liệu ở trạng thái nghỉ (hữu hạn)
Độ trễ Mili giây đến giây Phút đến giờ
Thông lượng Cao Rất cao
Phân tích Dựa trên cửa sổ thời gian Trên toàn bộ tập dữ liệu
Trường hợp sử dụng Cảnh báo, giám sát, cá nhân hóa Báo cáo, phân tích lịch sử