Bỏ qua nội dung

Streaming Data Engineer (Kỹ sư dữ liệu thời gian thực)

Streaming Data Engineering xử lý dữ liệu khi sự kiện đang xảy ra, không đợi đến batch cuối ngày. Công việc này phù hợp với fraud detection, realtime dashboard, IoT, personalization, operational monitoring và các luồng cần phản ứng nhanh.

Điểm khó của streaming không chỉ là Kafka hay Flink. Điểm khó là thời gian, trạng thái, thứ tự sự kiện, retry, duplicate và late data.

Ai nên học hướng này?

  • Data Engineer đã vững batch processing và muốn làm realtime.
  • Backend Engineer đang xây hệ thống event-driven.
  • Data Architect cần chọn giữa batch, micro-batch và streaming.
  • Team có use case cần latency tính bằng giây hoặc phút, không phải giờ.

Checkpoint cần đạt

Năng lựcCần hiểu
Kafka fundamentalsTopic, partition, consumer group, offset, retention.
Event-timePhân biệt event-time, ingestion-time, processing-time.
WatermarkChấp nhận dữ liệu trễ có kiểm soát.
StateWindow, aggregation, join, TTL, checkpoint.
Delivery semanticsAt-most-once, at-least-once, exactly-once theo ngữ cảnh.
OperationsLag, backpressure, rebalancing, schema evolution, replay.

1. Kafka là log phân tán, không chỉ là queue

Kafka lưu sự kiện theo topic và partition. Consumer đọc bằng offset, vì vậy nhiều consumer group có thể đọc cùng một topic cho các mục đích khác nhau. Các khái niệm topic, partition, consumer group, configuration và operations đều nằm trong tài liệu Kafka chính thức: Apache Kafka Documentation.

Điều cần học:

  • Chọn key để giữ thứ tự theo entity như user_id hoặc account_id.
  • Partition nhiều quá hay ít quá đều có chi phí.
  • Consumer lag là tín hiệu quan trọng nhưng không nói hết nguyên nhân.
  • Retention quyết định bạn replay được bao lâu.
  • Schema Registry hoặc quy ước schema giúp tránh phá consumer khi event đổi.

Đọc trong site: Apache Kafka, Kafka Topics Partitions, Consumer Groups, Kafka Consumer Lag Rebalance.

2. Tư duy thời gian

Trong batch, dữ liệu thường đã “nằm yên”. Trong streaming, dữ liệu đến muộn là chuyện bình thường.

Loại thời gianÝ nghĩa
Event-timeThời điểm sự kiện thật sự xảy ra.
Ingestion-timeThời điểm event vào hệ thống như Kafka.
Processing-timeThời điểm job xử lý event.

Nếu dùng processing-time cho mọi thứ, báo cáo realtime có thể sai khi mobile app offline gửi event muộn. Watermark giúp hệ thống nói rõ: “tôi chờ dữ liệu trễ tối đa bao lâu trước khi đóng window”.

Toàn bộ tư duy đó gói trong vài dòng Flink SQL — đáng thuộc lòng vì nó xuất hiện trong hầu hết bài toán realtime aggregation:

CREATE TABLE transactions (
account_id STRING,
amount DECIMAL(18,2),
event_time TIMESTAMP(3),
-- Watermark: chấp nhận trễ tối đa 30 giây theo event-time
WATERMARK FOR event_time AS event_time - INTERVAL '30' SECOND
) WITH ('connector' = 'kafka', ...);
SELECT account_id,
TUMBLE_START(event_time, INTERVAL '5' MINUTE) AS window_start,
SUM(amount) AS total_5m
FROM transactions
GROUP BY account_id, TUMBLE(event_time, INTERVAL '5' MINUTE);

Trade-off nằm trọn ở con số 30 giây: tăng lên thì kết quả đúng hơn (bắt được nhiều event trễ hơn) nhưng cửa sổ đóng muộn hơn → alert fraud chậm hơn; giảm xuống thì nhanh nhưng event trễ bị rơi (hoặc phải xử lý qua side-output). Không có giá trị đúng tuyệt đối — chỉ có giá trị phù hợp với SLA nghiệp vụ.

Đọc trong site: Event-time vs Processing-time, Watermark, Flink Watermarks Late Data, Windowing.

3. Stateful processing

Streaming mạnh khi xử lý trạng thái: đếm sự kiện theo cửa sổ, join stream, phát hiện pattern, tính session.

Nhưng state cần vận hành cẩn thận:

  • State lớn làm checkpoint chậm.
  • TTL quá ngắn làm mất ngữ cảnh.
  • TTL quá dài làm tăng chi phí.
  • Key skew làm một task nóng hơn phần còn lại.
  • Schema đổi có thể làm state không đọc lại được.

Đọc trong site: Streaming Processing, Windowing, Flink RocksDB State Backend, Flink Backpressure.

4. Exactly-once: hiểu đúng trước khi hứa

“Exactly-once” không phải phép màu. Nó phụ thuộc vào source, processing engine, sink và cách transaction/idempotency được thiết kế. Nhiều hệ thống thực tế dùng at-least-once processing kết hợp idempotent sink để đạt kết quả cuối không trùng.

Khi phỏng vấn hoặc thiết kế, hãy nói rõ phạm vi: exactly-once trong engine, khi ghi vào warehouse, hay ở mức business outcome.

Đọc trong site: Exactly-once Semantics, Kafka Exactly-once Semantics, Idempotency.

flowchart LR
    A["Producers"] --> B["Kafka topics"]
    B --> C["Flink / Spark Streaming"]
    C --> D["State + checkpoint"]
    C --> E["Lakehouse / OLAP sink"]
    E --> F["Realtime dashboard / alert"]

Không có câu trả lời cố định:

  • Spark Structured Streaming phù hợp nếu team đã dùng Spark, workload micro-batch ổn, tích hợp lakehouse mạnh: Spark Structured Streaming.
  • Flink phù hợp hơn cho event-time phức tạp, stateful streaming dài hạn, latency thấp và continuous processing: Apache Flink Documentation.
  • Kafka Streams phù hợp khi logic gần service, team JVM mạnh và use case gọn trong Kafka ecosystem.

Chọn engine theo độ trễ, state, kỹ năng team, vận hành và hệ sinh thái sink/source.

Checklist đọc concept

Mốc họcConcept nội bộ cần đọc
Kafka foundationApache Kafka, Kafka Topics Partitions, Consumer Groups
Time semanticsEvent-time vs Processing-time, Watermark, Windowing
ReliabilityExactly-once Semantics, Backpressure Handling, Kafka Consumer Lag Rebalance

Dự án thực hành

Dự án: Realtime fraud signal

  1. Sinh event giao dịch vào Kafka.
  2. Key theo account_id.
  3. Tính tổng giao dịch 5 phút theo event-time.
  4. Dùng watermark để xử lý event trễ.
  5. Ghi cảnh báo vào topic hoặc OLAP table.
  6. Theo dõi consumer lag, throughput và checkpoint duration.
  7. Replay dữ liệu một khoảng thời gian để kiểm tra idempotency.

Góc phỏng vấn

  • Kafka partition quyết định thứ tự như thế nào?
  • Consumer lag tăng thì có thể do những nguyên nhân nào?
  • Watermark là gì và trade-off của nó?
  • Exactly-once khác idempotent sink ra sao?
  • Khi nào không nên dùng streaming?

References

Bình luận & Thảo luận