Phát triển dựa trên mã nguồn Flink Stream API - Yêu cầu hệ thống động

Tổng quan

Bài viết này trình bày cách thực hiện phát triển nâng cao dựa trên mã nguồn của Flink để xây dựng một hệ thống động quản lý quy tắc. Thông qua việc tạo các toán tử tùy chỉnh và bộ phối hợp toán tử, hệ thống có thể xử lý tính toán quy tắc theo thời gian thực và quản lý đồng bộ giữa các tác vụ. Mục tiêu là giúp người đọc hiểu rõ hơn về các khái niệm và cơ chế đã được giới thiệu trong các bài viết trước.

Yêu cầu dự án

Tính năng cốt lõi

Xây dựng một công cụ động quy tắc với các chức năng sau:

  • Nguồn dữ liệu tạo ra hai loại thông tin: dữ liệu gốcbiểu thức tính toán
  • Áp dụng biểu thức tính toán lên dữ liệu và trả về kết quả
  • Biểu thức tính toán có thể cập nhật linh hoạt
  • Hỗ trợ chạy song song với nhiều luồng xử lý

Kiến trúc hệ thống

Ví dụ cụ thể

Trường hợp: Hệ thống giám sát nhiệt độ thời gian thực

Giả sử chúng ta có hệ thống giám sát nhiệt độ thời gian thực, cần tính toán dữ liệu từ cảm biến:

Dữ liệu đầu vào mẫu:
Dòng thời gian:
T1: {"type": "rule", "expression": "temperature * 1.8 + 32"}  // Chuyển từ độ C sang độ F
T2: {"type": "data", "sensorId": "001", "temperature": 25.0}
T3: {"type": "data", "sensorId": "002", "temperature": 30.0}
T4: {"type": "data", "sensorId": "003", "temperature": 20.0}
T5: {"type": "rule", "expression": "temperature + 273.15"}   // Chuyển từ độ C sang Kelvin
T6: {"type": "data", "sensorId": "004", "temperature": 35.0}
T7: {"type": "data", "sensorId": "005", "temperature": 28.0}

Kết quả mong đợi:
Dữ liệu T2: 25.0 * 1.8 + 32 = 77.0°F    (Áp dụng quy tắc đầu tiên)
Dữ liệu T3: 30.0 * 1.8 + 32 = 86.0°F    (Áp dụng quy tắc đầu tiên)
Dữ liệu T4: 20.0 * 1.8 + 32 = 68.0°F    (Áp dụng quy tắc đầu tiên)
--- Điểm chuyển quy tắc ---
Dữ liệu T6: 35.0 + 273.15 = 308.15K      (Áp dụng quy tắc thứ hai)
Dữ liệu T7: 28.0 + 273.15 = 301.15K      (Áp dụng quy tắc thứ hai)

Thách thức chính:
  1. Độ nhất quán dữ liệu: Dữ liệu T4 phải hoàn thành tính toán theo quy tắc đầu tiên trước khi dữ liệu T6 bắt đầu dùng quy tắc mới
  2. Xử lý song song: Nếu có nhiều toán tử tính toán chạy song song, cần đảm bảo tất cả đều hoàn thành tính toán theo quy tắc cũ
  3. Không mất dữ liệu: Không có dữ liệu nào bị bỏ sót trong quá trình chuyển đổi quy tắc

Quy trình xử lý chi tiết:

Khi T5 nhận được quy tắc mới:
1. Toán tử biểu thức nhận quy tắc mới
   ↓
2. Gửi tín hiệu cho Coordinator cập nhật quy tắc: "temperature + 273.15"
   ↓
3. Phát lệnh cho tất cả toán tử tính toán: "Hoàn thành đợt tính toán hiện tại"
   ↓
4. Dừng luồng dữ liệu: Dữ liệu T6, T7 tạm thời không gửi xuống tầng dưới
   ↓
5. Đợi tất cả toán tử báo cáo: "Tôi đã hoàn thành tính toán đến T4"
   ↓
6. Coordinator xác nhận tất cả tác vụ xong, thông báo lại cho toán tử biểu thức: "Tiếp tục"
   ↓
7. Khôi phục luồng dữ liệu: Dữ liệu T6, T7 tiếp tục xử lý theo quy tắc mới

Tình huống nhiều luồng xử lý:

Giả sử có 3 toán tử tính toán chạy song song:

Calc-1: đang xử lý dữ liệu T2 (25.0°C)
Calc-2: đang xử lý dữ liệu T3 (30.0°C)
Calc-3: đang xử lý dữ liệu T4 (20.0°C)

Khi nhận quy tắc mới ở T5:
- Tất cả các toán tử phải hoàn thành tính toán hiện tại và báo cáo
- Chỉ sau khi nhận đủ 3 báo cáo thì mới xử lý dữ liệu T6, T7

Tại sao cần Operator Coordinator?

Vấn đề: Các Task trong Flink chỉ có thể truyền dữ liệu, không thể truyền tín hiệu điều khiển
Giải pháp: Sử dụng Coordinator trong Job Master để:
- Toán tử biểu thức → Coordinator: "Có quy tắc mới"
- Coordinator → Toán tử tính toán: "Hoàn thành đợt hiện tại"
- Toán tử tính toán → Coordinator: "Đã hoàn thành"
- Coordinator → Toán tử biểu thức: "Tiếp tục"

Minh họa chuỗi thời gian:

Thẻ: Apache Flink Stream Processing Operator Coordination Dynamic Rule Engine Dataflow Programming

Đăng vào ngày 2 tháng 7 lúc 09:07