Bắt đầu bằng hỏi yêu cầu: ai dùng dữ liệu, cần độ trễ bao nhiêu (dashboard vài giây hay báo cáo sáng hôm sau), giữ bao lâu, có PII không.
Sau đó ước lượng: 10TB/ngày tương đương khoảng 115MB/giây trung bình, giờ cao điểm có thể gấp vài lần.
Web/App SDK -> Collector API (stateless, sau load balancer)
-> Kafka (topic theo loại sự kiện, key = user_id)
-> Streaming job (Flink/Spark): metric realtime -> ClickHouse/Redis -> dashboard
-> Sink vào lake: bronze (dữ liệu thô, partition theo ngày/giờ)
-> Batch (Spark/dbt): silver = dedup, lọc bot, gắn session, chuẩn hoá schema
-> gold = fact_pageview, fact_session, funnel, DAU -> warehouse/BICác quyết định cần nói rõ:
- Collector chỉ nhận, kiểm tra schema tối thiểu rồi đẩy vào Kafka, không chứa logic nghiệp vụ, để mở rộng ngang dễ và không mất sự kiện khi phía sau chậm.
- Schema sự kiện: có event_id (UUID do client sinh), event_time (thời điểm xảy ra), user_id hoặc anonymous_id, tên và thuộc tính sự kiện. Quản lý bằng schema registry để team frontend không đổi field tuỳ ý.
- Key Kafka là user_id giữ thứ tự sự kiện của một user trong cùng partition, thuận cho sessionization khi xử lý stream.
- Bronze giữ nguyên bản thô để xử lý lại được khi logic silver thay đổi; silver dedup theo event_id, lọc bot theo user agent và tần suất, chia session theo khoảng nghỉ 30 phút.
- Thời gian: tính theo event_time kèm watermark cho dữ liệu trễ (app mobile offline gửi bù sau nhiều giờ); partition theo ngày của event_time và cho phép tính lại vài ngày gần nhất.
- Hai đường realtime và batch là kiến trúc Lambda. Nếu chỉ cần trễ vài phút, một đường streaming vào lakehouse (Kappa) đỡ phải viết cùng logic hai lần.
Lưu trữ và chi phí: bronze lưu Parquet/Delta, nén theo cột nên chỉ bằng một phần nhỏ dung lượng JSON; bronze giữ 30–90 ngày, gold giữ lâu dài; compaction file nhỏ hằng ngày.
Lưu ý: phần nhà tuyển dụng hay đào sâu là trùng lặp, dữ liệu trễ và backfill. Nói được sự kiện được dedup ở tầng nào, dữ liệu trễ 2 ngày xử lý ra sao, và làm sao tính lại một tháng khi phát hiện lỗi logic thì giá trị hơn việc chọn Flink hay Spark.