Windowing — cắt dòng vô tận thành cửa sổ hữu hạn để tổng hợp
Cắt dòng vô tận thành cửa sổ để tổng hợp: tumbling, hopping, sliding, session. Event-time vs processing-time, và watermark để xử lý event trễ.
TL;DR: Stream processing xử lý dòng sự kiện vô tận — nhưng muốn tổng hợp (đếm, tính trung bình, phát hiện bất thường), ta cần cắt dòng vô tận thành cửa sổ hữu hạn gọi là window. Có bốn loại cơ bản: tumbling (không chồng), hopping (chồng cố định), sliding (cập nhật liên tục), session (tự co giãn theo hành vi). Điểm khoá là phân biệt event-time (timestamp do producer gắn, thời điểm sự kiện thật xảy ra) và processing-time (thời điểm server nhận được) — chỉ event-time mới cho phép reprocess lịch sử ra cùng kết quả. Watermark(t) khai báo "sự kiện với timestamp nhỏ hơn hoặc bằng t coi như đã đến đủ" để window có thể đóng lại — cân bằng giữa latency và completeness.
Hệ thống giám sát gian lận của một ngân hàng phải phát hiện nếu một thẻ quẹt hơn 5 lần trong vòng 5 giây — không phải "5 giây kể từ khi server nhận được tin", mà là "5 giây theo đồng hồ thật của thiết bị quẹt". Khi mạng chập chờn, sự kiện tới trễ 30 giây; khi reprocess log lịch sử, sự kiện "tới" theo thời gian thực của cả năm trước chỉ trong vài phút. Nếu dùng thời gian server (processing-time), reprocess cho ra kết quả sai hoàn toàn. Nếu dùng event-time mà không có watermark, window không biết bao giờ đã đủ sự kiện để đóng lại — state tích luỹ vô hạn.
Bài này giải thích cách window cắt dòng vô tận thành tính toán hữu hạn, vì sao event-time là lựa chọn mặc định khi cần tính lại được, và watermark hoạt động ra sao để giải quyết bài toán "chờ bao lâu là đủ".
1. Analogy — trạm đếm xe qua cầu mỗi 5 phút
Tưởng tượng bạn đứng ở trạm kiểm soát đầu cầu, đếm số xe qua trong mỗi khoảng 5 phút để báo cáo lưu lượng. Xe đến liên tục — không bao giờ có lúc "hết xe". Bạn không thể chờ đến khi "tất cả xe đã qua" mới đếm, vì điều đó là mãi mãi.
Thay vào đó, bạn bấm đồng hồ: mỗi 5 phút, đọc số đếm hiện tại, ghi xuống, reset về 0, đếm tiếp. Đây chính là tumbling window: cắt dòng vô tận thành những ô 5 phút không chồng nhau.
Nhưng có một chi tiết tinh tế: bạn đếm theo đồng hồ của xe (thời điểm xe thực sự qua cầu) hay đồng hồ của trạm (thời điểm trạm camera ghi nhận)? Nếu sương mù làm camera delay 30 giây, hai đồng hồ lệch nhau — và nếu sau đó bạn xem lại băng để kiểm tra, kết quả sẽ rất khác.
| Trạm đếm xe | Stream processing |
|---|---|
| Xe đến liên tục, không bao giờ dứt | Dòng sự kiện unbounded |
| Khoảng 5 phút | Window (cửa sổ thời gian) |
| Đọc số đếm, reset, đếm tiếp | Đóng window, tổng hợp, mở window mới |
| Đồng hồ của xe | Event-time (timestamp producer) |
| Đồng hồ của trạm | Processing-time (đồng hồ server) |
| Sương mù làm camera delay | Network delay, mobile offline |
| Xem lại băng ghi hình | Reprocess lịch sử |
Window = ô thời gian để đếm. Dòng xe vô tận = stream. Đồng hồ xe = event-time. Đồng hồ trạm = processing-time. Sương mù = network delay làm event đến trễ.
2. Vì sao dòng vô tận không có 'kết quả cuối'?
Gọi count() trên một list hữu hạn — có kết quả. Gọi count() trên một stream vô tận — không bao giờ trả về, vì stream không bao giờ kết thúc.
# Bounded input:
count([e1, e2, e3, e4, e5]) --> 5 (biet diem cuoi)
# Unbounded stream:
count(stream) --> ??? (khong bao gio xong)
Giải pháp là scope phép tính vào window: thay vì "tổng hợp toàn bộ stream", ta tổng hợp "trong mỗi window 5 phút". Window biến bài toán vô tận thành loạt bài toán hữu hạn nối tiếp nhau.
flowchart LR STREAM["Stream vo tan<br/>(e1 e2 e3 ...)"] --> W1["Window 0-5 phut<br/>ket qua: 120"] STREAM --> W2["Window 5-10 phut<br/>ket qua: 98"] STREAM --> W3["Window 10-15 phut<br/>ket qua: 135"] W1 & W2 & W3 --> OUT["Chuoi ket qua<br/>tiep tuc xu ly"]
Điểm quan trọng: window không làm dừng stream. Stream vẫn chảy liên tục; window chỉ xác định phạm vi của từng phép tính. Khi window 0–5 phút đóng và cho ra kết quả, sự kiện trong khoảng 5–10 phút đã tích luỹ trong window tiếp theo.
3. Bốn loại window
Bốn loại window phân biệt nhau ở cách phân bổ sự kiện và cách các window chồng lên nhau.
Nếu bạn đã học bài sliding window trong track Thuật toán, các khái niệm dưới đây sẽ quen thuộc — đây là biến thể event-time của cùng ý tưởng, áp dụng cho stream vô tận thay vì mảng cố định.
3.1 Tumbling window — không chồng, mỗi sự kiện thuộc đúng 1 window
Chia timeline thành các khoảng đều nhau, không chồng nhau. Mỗi sự kiện thuộc đúng 1 window.
|--- W1 (0-5 phut) ---||--- W2 (5-10 phut) ---||--- W3 (10-15 phut) ---|
e1 e2 e3 e4 e5 e6 e7 e8
Dùng khi: tính tổng hoặc trung bình theo chu kỳ cố định (doanh thu theo giờ, số request theo phút).
3.2 Hopping window — chồng cố định, mỗi sự kiện có thể ở nhiều window
Kích thước window cố định nhưng hop nhỏ hơn kích thước — window chồng nhau. Tham số: size và hop.
size=10 phut, hop=5 phut:
|------ W1 (0-10) ------|
|------ W2 (5-15) ------|
|------ W3 (10-20) ------|
Dùng khi: "cứ 5 phút báo cáo số request trong 10 phút gần nhất".
3.3 Sliding window — cập nhật liên tục
Về bản chất là hopping với hop rất nhỏ: mỗi sự kiện mới vào kích hoạt tính lại toàn bộ window. Lưu ý thuật ngữ theo framework: Flink gọi window (size, slide) là "sliding" — đúng bằng cái bài này gọi hopping; còn "sliding window" của Kafka Streams (KIP-450) không có tham số slide mà chỉ có timeDifference (độ rộng), tính lại mỗi khi có event mới. Ý tưởng chung: window trượt liên tục theo thời gian.
Dùng khi: phát hiện bất thường liên tục (rate limit: "5 request trong bất kỳ khoảng 10 giây nào").
3.4 Session window — tự co giãn theo hành vi người dùng
Không có kích thước cố định — window kéo dài khi sự kiện đến liên tiếp, đóng lại khi im lặng quá session_gap. Mỗi người dùng có session window riêng.
session_gap = 30 phut:
User A: |-- session 1 --| (im lang > 30 phut) |-- session 2 --|
e1 e2 e3 e4 e5
User B: |--- session (dai hon) ---|
e1 e2 e3 e4
Dùng khi: phân tích phiên làm việc ("mỗi lần user dùng app, tổng thời gian là bao nhiêu?").
Một hệ thống giám sát server muốn cảnh báo khi CPU load trung bình vượt 80% trong bất kỳ khoảng 5 phút liên tiếp nào. Đây là tumbling, hopping, sliding, hay session window? Vì sao? Tự trả lời trước khi đọc tiếp.
Đáp án: Sliding window (hoặc hopping với hop nhỏ). Tumbling 5 phút bỏ lỡ trường hợp load cao bắt đầu ở phút 4 và kéo đến phút 7 — nằm ở hai window khác nhau, trung bình mỗi window thấp dù thực tế có 3 phút liên tiếp vượt 80%. Session window không phù hợp vì không dựa trên khoảng im lặng. Sliding window kiểm tra liên tục "bất kỳ 5 phút nào".
| Loại window | Chồng nhau? | Kích thước | Dùng khi |
|---|---|---|---|
| Tumbling | Không | Cố định | Tổng hợp chu kỳ (theo giờ, phút) |
| Hopping | Có, cố định | Cố định, hop riêng | Báo cáo trượt với bước nhảy cố định |
| Sliding | Có, liên tục | Cố định | Phát hiện bất thường liên tục |
| Session | Co giãn | Tự động | Phân tích phiên hành vi |
4. Event-time hay processing-time — khi nào dùng cái nào?
Processing-time là thời điểm hệ thống xử lý nhận được sự kiện — đơn giản nhất để implement vì không cần timestamp từ producer.
Event-time là thời điểm sự kiện thực sự xảy ra ở nguồn — producer gắn timestamp này vào sự kiện trước khi gửi đi.
Người dùng click "mua hàng" lúc 14:02 trên điện thoại, nhưng điện thoại đang offline. Kết nối trở lại lúc 14:05, sự kiện được gửi đến server lúc 14:05:03.
- Event-time của sự kiện này là bao nhiêu?
- Processing-time là bao nhiêu?
- Nếu window "14:00–14:05" dùng processing-time, sự kiện này rơi vào window nào?
- Nếu dùng event-time, nó thuộc window nào?
Tự trả lời trước khi đọc đáp án bên dưới.
Đáp án:
- Event-time: 14:02 (khi người dùng thực sự click)
- Processing-time: 14:05:03 (khi server nhận được)
- Processing-time window: rơi vào window 14:05–14:10 (đến sau khi window 14:00–14:05 đã đóng)
- Event-time window: thuộc window 14:00–14:05 (đúng ý nghĩa nghiệp vụ — click xảy ra trong khoảng đó)
Sự lệch nhau giữa event-time và processing-time gọi là event-time skew. Theo số liệu thực tế: mobile offline flush về trễ 2–5 phút là bình thường; IoT sensor batch gửi có thể trễ hàng giờ. Fraud detection watermark 5 giây (ưu tiên latency); financial reconciliation allowed lateness 1 giờ (ưu tiên completeness) — watermark định nghĩa ở mục 5, allowed lateness ở mục 6.
4.1 Tại sao event-time cho phép reprocess mà processing-time không?
PROCESSING-TIME (sai khi reprocess):
Reprocess luc 3:00 AM ngay hom sau
-> "processing-time" cua moi su kien = 3:00 AM hom sau
-> tat ca su kien roi vao window 3:00-3:05 AM -> vo nghia nghiep vu
EVENT-TIME (dung khi reprocess):
Reprocess luc 3:00 AM ngay hom sau
-> "event-time" van giu nguyen timestamp goc (9:02, 9:03, 14:02...)
-> window 9:00-9:05, 14:00-14:05... van dung nhu khi chay live
Xử lý theo event-time có nghĩa là "window phân loại sự kiện theo khi nào nó xảy ra, không phải khi nào ta biết đến nó". Đây là lý do Dataflow Model (VLDB 2015) coi event-time là nền tảng của stream processing đúng đắn — processing-time window và batch reprocessing về cơ bản không tương thích nhau.
5. Watermark — lower-bound trên event-time
Nếu window theo event-time, hệ thống cần biết khi nào window có thể đóng lại. Không thể chờ mãi mãi (state vô hạn), nhưng đóng quá sớm thì bỏ sự kiện trễ.
Watermark là câu trả lời: một tín hiệu đặc biệt trong stream, khai báo rằng event-time đã đạt đến một mốc nhất định. Định nghĩa chính thức từ Apache Flink docs:
"Watermark(t) declares event time has reached t — no more elements with timestamp t' ≤ t."
Khi watermark vượt qua điểm cuối của một window, operator biết window đó đã "đóng" và có thể tổng hợp kết quả.
flowchart LR STREAM["e(9:01) e(9:03) WM(9:04) e(9:02-late) WM(9:07)"] --> PROC["Window operator"] PROC -->|"nhan WM(9:04): chua du, window 9:00-9:05 con mo"| OPEN["Window 9:00-9:05<br/>(dang tich luy)"] PROC -->|"nhan WM(9:07): watermark vuot 9:05 -> dong"| RESULT["Ket qua window 9:00-9:05"]
5.1 Trade-off latency vs completeness
Watermark được tính theo heuristic thường dùng: max_event_time_seen - expected_max_delay. Nó là ước tính, không phải đảm bảo tuyệt đối.
Bạn thiết kế hệ thống phân tích IoT cho nhà máy. Sensor thường gửi data mỗi 1 giây; đôi khi mạng yếu làm delay 30 giây; hiếm khi (dưới 1% lần) delay đến 5 phút.
Bạn sẽ đặt watermark delay 30 giây hay 5 phút? Hệ quả của mỗi lựa chọn là gì? Tự trả lời trước khi đọc tiếp.
Hai thái cực:
- Watermark delay 30 giây: window đóng sớm, latency thấp, kết quả nhanh. Nhưng dưới 1% event trễ hơn 30 giây sẽ bị coi là late event (đến sau window đóng).
- Watermark delay 5 phút: chờ đủ lâu để bắt hầu hết event trễ, completeness cao. Nhưng mọi window phải chờ thêm 5 phút sau khi "đáng ra" đóng — latency toàn hệ thống tăng 5 phút.
Theo số liệu thực tế từ brief: Azure Stream Analytics khuyến nghị IoT bắt đầu với watermark 5 phút; fraud detection có thể dùng 5 giây (ưu tiên latency). Không có con số đúng tuyệt đối — phụ thuộc vào SLA của nguồn và yêu cầu nghiệp vụ.
6. Late event — allowed lateness và side output
Watermark delay không bao giờ "bắt được hết" — một số sự kiện vẫn đến sau khi window đã đóng (late event). Có ba cách xử lý:
Option 1 — Loại bỏ (discard): đơn giản nhất, nhưng mất dữ liệu.
Option 2 — Allowed lateness: cho phép window ở lại trạng thái "mở thêm" một khoảng thời gian sau khi watermark qua điểm cuối. Event trễ trong khoảng này vẫn được tính vào window, và window phát lại kết quả cập nhật (late firing). Ví dụ financial reconciliation: allowed lateness 1 giờ — mọi giao dịch đến trong vòng 1 giờ sau khi window đóng vẫn được cộng vào.
Option 3 — Side output: event đến quá muộn (vượt allowed lateness) được route sang một stream riêng để xử lý thủ công hoặc theo logic đặc biệt — không bị mất hoàn toàn, nhưng không lẫn vào kết quả chính.
Timeline:
Window [9:00, 9:05) WM(9:09) WM(9:14)
|<-- dong khi WM(9:09) den -->|<-- allowed_lateness 5 phut -->|
e(9:03) den luc 9:04 -> TRONG window, tinh binh thuong
e(9:02) den luc 9:10 -> LATE nhung trong allowed_lateness -> cap nhat ket qua window
e(9:01) den luc 9:16 -> VUOT allowed_lateness -> side output stream
Trong Apache Flink, cả ba cơ chế đều có API: .allowedLateness(Duration) và .sideOutputLateData(tag).
7. Pitfall tổng hợp
❌ Nhầm 1 — Dùng processing-time thay event-time:
❌ SAI:
window = tumbling(5 phut, PROCESSING-TIME)
reprocess log thang truoc luc 3 AM
-> tat ca su kien "xay ra" luc 3 AM theo processing-time
-> window 3:00-3:05 AM co 50 trieu event -> vo nghia nghiep vu
✅ DUNG:
window = tumbling(5 phut, EVENT-TIME)
reprocess log thang truoc -> event-time giu nguyen timestamp goc
-> window 9:00-9:05 thang truoc van dung su kien dung khoang do
Mọi hệ thống stream production-grade (Flink, Kafka Streams, Google Dataflow) mặc định dùng event-time.
❌ Nhầm 2 — Watermark delay = 0:
❌ SAI: watermark delay = 0
-> window dong ngay khi max event-time seen = diem cuoi window
-> bat ky event nao den sau 1ms la "late" -> mat
-> IoT sensor delay 30s binh thuong: mat 100% event tu sensor do
✅ DUNG: watermark delay >= P99 latency cua nguon
IoT delay 30s binh thuong -> dat delay >= 30s
+ allowed_lateness cho long duoi it gap
❌ Nhầm 3 — Không watermark → window không đóng:
❌ SAI: event-time window nhung KHONG co watermark strategy
-> operator khong biet "event nao la cuoi" cho moi window
-> window khong dong, state tich luy vo han
-> OutOfMemoryError hoac pipeline khong cho ra ket qua
✅ DUNG: luon khai bao watermark strategy
- Event-time monotonic (sen sor thu tu dam bao) -> bounded disorder = 0
- Event-time khong thu tu -> dat delay theo P99 latency cua nguon
8. 📚 Deep Dive
Paper nền tảng:
- The Dataflow Model — Akidau et al. (Google, VLDB 2015) — DOI 10.14778/2824032.2824076. Paper đặt nền móng lý thuyết cho mọi hệ stream hiện đại: mô hình what/where/when/how (tổng hợp gì / trong window nào / trigger khi nào / kết quả cũ xử lý thế nào). Tumbling/sliding/session window và event-time watermark được định nghĩa chính thức lần đầu ở đây. Đọc Section 2 (Motivation) để thấy tại sao processing-time không đủ, và Section 3 (The Dataflow Model) cho định nghĩa watermark.
Apache Flink Docs (implementation chuẩn):
- Flink — Timely Stream Processing — định nghĩa chính thức watermark, event-time vs processing-time, ingestion-time. Đây là nguồn của định nghĩa "Watermark(t) declares event time has reached t" trong bài này.
- Flink — Windows — API tumbling/sliding/session,
.allowedLateness(),.sideOutputLateData(), trigger.
Ghi chú: Streaming 101/102 của Akidau (O'Reilly blog) là bản đọc phổ thông của paper VLDB 2015 — nên đọc trước paper gốc để có trực giác. MillWheel (VLDB 2013) là tiền thân của Dataflow Model, nơi watermark ra đời tại Google.
9. Liên hệ các bài khác
- Bài 02 — Log-based broker: Kafka giữ log với offset là nền tảng mà windowing xây trên đó; Kafka Streams triển khai tumbling/hopping/session window với event-time trực tiếp trên Kafka topic.
- Bài 04 — Stream join và exactly-once: stream-stream join bắt buộc có window — nếu không, state của hai stream tích luỹ vô hạn; bốn loại window ở bài này áp dụng trực tiếp khi thiết kế join.
- Bài 05 — Thiết kế stream pipeline: lab tổng hợp nơi bạn phải chọn loại window và watermark delay phù hợp với yêu cầu bài toán cụ thể.
- Bài 01 (Module 1) — Tư duy batch: mặt đối lập — batch xử lý input bounded không cần window vì có điểm kết thúc rõ ràng; so sánh giúp thấy rõ vì sao unbounded input làm nảy sinh nhu cầu windowing.
10. Tóm tắt
- Window cắt stream unbounded thành từng đoạn hữu hạn để tổng hợp — vì stream không có "điểm kết thúc" để tính kết quả cuối.
- Bốn loại: tumbling (không chồng, 1 sự kiện vào đúng 1 window), hopping (chồng cố định), sliding (cập nhật liên tục), session (tự co giãn theo
session_gap). - Event-time (timestamp producer) vs processing-time (đồng hồ server): event-time mới cho phép reprocess lịch sử ra cùng kết quả; processing-time không thể reprocess đúng.
- Watermark(t): lower-bound trên event-time — khai báo "event với timestamp ≤ t đã đến đủ". Window đóng khi watermark vượt điểm cuối. Watermark delay = trade-off latency vs completeness.
- Late event: sự kiện đến sau khi window đóng. Xử lý bằng: discard / allowed lateness (cập nhật kết quả trong grace period) / side output (route sang stream riêng).
- Pitfall lớn nhất: processing-time thay event-time → reprocess sai; watermark delay = 0 → mất event trễ; không watermark → window không đóng, state vô hạn.
11. Tự kiểm tra
Q1Vì sao stream processing cần window để tổng hợp, trong khi batch processing thì không? Điều gì khác nhau về input làm nảy sinh nhu cầu này?▸
Batch có input bounded — biết điểm cuối, nên count() hay sum() có thể chờ hết input rồi trả kết quả. Stream có input unbounded — không bao giờ kết thúc, nên không thể chờ "hết" mới tính.
Window giải quyết bằng cách scope phép tính vào một đoạn thời gian hữu hạn: thay vì "tổng toàn stream", ta tính "tổng trong 5 phút". Khi window đóng, ta có đủ dữ liệu để tổng hợp. Stream tiếp tục chảy vào window tiếp theo mà không bị chặn.
Q2Giải thích sự khác nhau giữa tumbling window và hopping window. Cho một ví dụ bài toán phù hợp với mỗi loại.▸
- Tumbling window: không chồng nhau, mỗi sự kiện thuộc đúng 1 window. Ví dụ: "tổng doanh thu theo từng giờ" — mỗi đơn hàng thuộc đúng 1 giờ, không đếm hai lần.
- Hopping window: chồng nhau với bước nhảy (hop) nhỏ hơn kích thước window — mỗi sự kiện có thể thuộc nhiều window. Ví dụ: "mỗi 1 phút, báo cáo số request trong 5 phút gần nhất" — window 5 phút, hop 1 phút; một request có thể được đếm trong 5 báo cáo liên tiếp.
Điểm nhớ: nếu hop = size thì hopping = tumbling; nếu hop tiệm cận 0 thì hopping trở thành sliding.
Q3Một engineer đề xuất dùng processing-time cho đơn giản. Khi nào đề xuất đó chấp nhận được, và khi nào sẽ gây ra lỗi nghiêm trọng?▸
Chấp nhận được khi: nguồn dữ liệu có độ trễ rất thấp và ổn định (producer gần như real-time, không offline, không buffer); nghiệp vụ không cần reprocess lịch sử; ý nghĩa của window thực sự là "thời gian server xử lý" — ví dụ đo latency của chính server đó.
Gây lỗi nghiêm trọng khi: nguồn có thể offline và flush muộn (mobile app, IoT sensor) — processing-time window gắn sự kiện vào window sai; cần reprocess log lịch sử — toàn bộ sự kiện sẽ rơi vào window thời điểm reprocess; nghiệp vụ tài chính hoặc pháp lý cần kết quả đúng theo thời điểm thực tế.
Q4Watermark(t) là gì và nó giải quyết vấn đề gì trong event-time processing? Vì sao watermark không phải đảm bảo tuyệt đối?▸
Watermark(t) là tín hiệu trong stream khai báo: "event với event-time nhỏ hơn hoặc bằng t đã đến đủ — các event tiếp theo sẽ có event-time lớn hơn t" (định nghĩa từ Apache Flink docs). Khi watermark vượt điểm cuối của một window, operator biết window đó đủ để tổng hợp và đóng lại.
Vấn đề giải quyết: với event-time, operator không biết khi nào "đã nhận đủ" sự kiện cho một window — vì sự kiện có thể đến trễ tùy ý. Chờ mãi = state tích luỹ vô hạn, window không bao giờ cho kết quả.
Watermark là ước tính có căn cứ (heuristic, thường là max_event_time_seen - expected_delay), không phải đảm bảo tuyệt đối — nên vẫn có late event. Đó là lý do cần thêm allowed lateness và side output.
Q5Bạn cần thiết kế watermark cho hai hệ thống: (A) phát hiện gian lận thẻ tín dụng, cảnh báo trong vòng 5 giây; (B) đối soát giao dịch tài chính cuối ngày. Watermark delay và allowed lateness nên là bao nhiêu? Lập luận trade-off.▸
Hệ thống A — Fraud detection (latency-first):
- Watermark delay: 5 giây hoặc nhỏ hơn
- Allowed lateness: thấp hoặc 0
- Lý do: nếu cảnh báo đến sau 30 giây thì giao dịch gian lận đã hoàn tất. Chấp nhận bỏ qua một số event trễ để đổi lấy phản hồi nhanh.
Hệ thống B — Financial reconciliation (completeness-first):
- Watermark delay: lớn (vài phút)
- Allowed lateness: 1 giờ (giao dịch đến trong vòng 1 giờ sau khi window đóng vẫn cập nhật kết quả; vượt 1 giờ thì route sang side output để xử lý thủ công)
- Lý do: đối soát sai là lỗi nghiêm trọng về tài chính. Latency cao không vấn đề vì kết quả cần vào cuối ngày.
Điểm chung: watermark delay = ước tính P99 latency của nguồn, điều chỉnh theo SLA nghiệp vụ.
Q6Session window khác tumbling/hopping/sliding ở điểm gì căn bản nhất? Vì sao session window không cần tham số 'size' cố định?▸
Điểm khác biệt căn bản: tumbling/hopping/sliding đều có kích thước window cố định theo thời gian, định nghĩa trước khi nhìn vào dữ liệu. Session window có kích thước co giãn theo hành vi dữ liệu — không cần biết trước "session sẽ dài bao lâu".
Session window dùng tham số session_gap (khoảng im lặng): nếu không có sự kiện mới trong khoảng session_gap, session đóng lại; nếu có sự kiện mới, session tự kéo dài. Một user active liên tục có session dài; user click thưa thớt có nhiều session ngắn — cùng một logic, tự co giãn theo dữ liệu.
Đây là kiểu window phù hợp nhất khi "một đơn vị logic" (session, cuộc trò chuyện) không có độ dài cố định mà định nghĩa bằng "khi nào không hoạt động nữa".
Q7Một pipeline stream dùng event-time window nhưng không cấu hình watermark strategy. Điều gì xảy ra sau vài giờ chạy? Vì sao?▸
Window sẽ không bao giờ đóng vì không có tín hiệu nào khai báo "event với event-time ≤ t đã đến đủ". Operator phải giữ nguyên toàn bộ state của tất cả window đang mở, tích luỹ theo thời gian.
Sau vài giờ: state tích luỹ vô hạn dẫn đến OutOfMemoryError hoặc disk tràn nếu state spill to disk. Pipeline crash hoặc degraded nghiêm trọng. Và vì window chưa đóng, cũng chưa có kết quả nào được emit ra.
Fix: luôn khai báo watermark strategy khi dùng event-time. Nếu nguồn đảm bảo sự kiện đến theo thứ tự event-time tăng dần (bounded disorder = 0), dùng monotonically increasing watermark. Nếu không chắc thứ tự, dùng bounded out-of-orderness với delay bằng P99 latency của nguồn.
Bài tiếp theo: Stream join và exactly-once
Bài này có giúp bạn hiểu bản chất không?
Hỏi đáp về bài này
Chưa có câu hỏi
Có gì chưa rõ trong bài? Đặt câu hỏi đầu tiên — câu trả lời từ cộng đồng giúp bạn (và người sau).
Đặt câu hỏi đầu tiên