Lambda vs Kappa — hai cách kết hợp batch và stream
Lambda chạy song song lớp batch (chính xác, chậm) và lớp stream (nhanh); Kappa bỏ lớp batch, chỉ dùng stream reprocess. Chọn kiến trúc nào và vì sao.
TL;DR: Lambda Architecture (Nathan Marz, 2011) kết hợp batch và stream bằng ba lớp: batch layer tính kết quả chính xác từ toàn bộ lịch sử, speed layer bù real-time, serving layer gộp lại để trả query. Cái giá là hai codebase cho cùng một logic — logic drift giữa hai lớp là rủi ro hàng đầu. Kappa Architecture (Jay Kreps, 2014) bỏ batch layer: chỉ stream xử lý event, Kafka long-retention cho phép replay reprocess lịch sử. Đơn giản hơn nhưng tốn storage: 50.000 events/s × 200 bytes ≈ 864 GB/ngày; giữ 90 ngày ≈ 78 TB Kafka hot storage, đắt hơn cold storage khoảng 10 lần. Ở quy mô cực lớn (Uber — hàng triệu trips/ngày, retention dài đạt hàng Petabyte), chi phí này buộc họ giới hạn retention vài ngày, không adopt Kappa đầy đủ.
Hệ thống thống kê của một nền tảng streaming video cần hiển thị hai con số cùng lúc: tổng lượt xem mọi thời đại của mỗi video (độ chính xác tuyệt đối, tính từ log lịch sử hàng TB) và số người đang xem ngay lúc này (cập nhật trong vài giây). Hai yêu cầu đối lập: một cần throughput batch lịch sử, một cần độ trễ stream real-time.
Bạn đã học batch ở Module 1 — input bất biến, idempotent, throughput khổng lồ — và stream ở Module 2 — event, producer/consumer, phản hồi mili giây. Hai thế giới đó giỏi những thứ khác nhau. Câu hỏi kiến trúc tự nhiên khi cần cả hai: kết hợp thế nào? Nathan Marz và Jay Kreps đưa ra hai câu trả lời khác nhau. Bài này so sánh, phân tích cái giá, và giúp bạn lập luận khi nào chọn cái nào.
1. Analogy — phòng mổ, phòng cấp cứu, và bộ hồ sơ số
Hệ thống y tế lớn có hai bộ phận phục vụ cùng một mục tiêu: thông tin về bệnh nhân. Phòng mổ (mổ phiên, đặt lịch) tập hợp đầy đủ bệnh án, chạy phân tích chi tiết, cho kết quả chính xác tuyệt đối — nhưng mất vài giờ. Phòng cấp cứu cần thông tin ngay, chấp nhận xấp xỉ từ vài số đo gần nhất, phản hồi trong vài phút. Bảng điều phối ở đầu dãy nhà gộp kết quả của cả hai: khi phòng mổ trả về kết quả đầy đủ, nó thay thế xấp xỉ của cấp cứu.
Lambda là hệ thống y tế đó. Kappa là quyết định táo bạo hơn: đặt cả phòng mổ vào trong phòng cấp cứu — dùng một quy trình duy nhất cho mọi ca, và giữ toàn bộ bộ hồ sơ số (Kafka log) đủ lâu để khi cần phân tích kỹ, chạy lại từ đầu.
| Bệnh viện | Lambda / Kappa |
|---|---|
| Phòng mổ — kết quả chính xác, chậm | Batch layer |
| Phòng cấp cứu — xấp xỉ nhanh | Speed layer |
| Bảng điều phối gộp kết quả | Serving layer |
| Hồ sơ bệnh án số hoá lưu lâu | Kafka long-retention log |
| Kappa: một quy trình, replay hồ sơ cũ khi cần | Reprocess từ Kafka offset 0 |
Lambda = hai phòng chạy song song + bảng gộp. Kappa = một phòng, bộ hồ sơ giữ đủ lâu để chạy lại khi cần.
2. Lambda Architecture — ba lớp song song
2.1 Cấu trúc ba lớp
Nathan Marz đề xuất Lambda Architecture năm 2011 trong bài "How to beat the CAP theorem", xây trên nền immutable master dataset — log sự kiện chỉ append, không bao giờ bị sửa (bạn đã thấy tư duy này ở Tư duy batch — Module 1).
flowchart TB
SRC["Raw events<br/>(immutable log)"]
subgraph BATCH["Batch Layer (Spark / Hadoop)"]
BL["Recompute tat ca tu dau<br/>moi N gio den ngay"]
BV["Batch views<br/>(chinh xac, day du lich su)"]
BL --> BV
end
subgraph SPEED["Speed Layer (Flink / Storm)"]
SL["Process event real-time<br/>chi tinh du lieu moi"]
SV["Speed views<br/>(xap xi, chi window gan nhat)"]
SL --> SV
end
subgraph SERVING["Serving Layer"]
MV["Merge: batch view + speed view<br/>-> tra loi query"]
end
SRC --> BL
SRC --> SL
BV --> MV
SV --> MV
MV --> QUERY["Query / API"]Ba lớp phân vai rõ:
- Batch layer: đọc toàn bộ log lịch sử từ đầu, tính lại kết quả hoàn chỉnh định kỳ — mỗi vài giờ hoặc mỗi ngày. Kết quả là batch view — chính xác tuyệt đối nhưng cũ theo chu kỳ recompute.
- Speed layer: xử lý event real-time chỉ cho khoảng thời gian chưa có trong batch view mới nhất. Kết quả là speed view — có thể xấp xỉ, nhưng nhanh (giây đến phút).
- Serving layer: khi nhận query, gộp batch view + speed view. Khi batch view mới được tính xong, speed view của window đó trở nên thừa và bị loại bỏ — batch đã phủ đầy đủ.
2.2 Ví dụ worked — đếm lượt xem video
Hệ thống video muốn trả "tổng lượt xem của video X tính đến thời điểm này". Lambda triển khai như sau:
-- Batch layer (chay moi 1 gio, doc tu dau den 1h truoc)
batch_view["video_total_views"] =
read_all_events("view_events/")
.filter(e -> e.type = "view")
.group_by(e -> e.video_id)
.count()
-- Speed layer (chay lien tuc, chi doc event tu 1h truoc den hien tai)
speed_view["video_recent_views"] =
stream("view_events")
.filter(e -> e.type = "view")
.group_by(e -> e.video_id)
.count_in_window("1h")
-- Serving layer (khi co query cho video X)
total_views(video_id) =
batch_view[video_id] -- chinh xac den 1h truoc
+ speed_view[video_id] -- gan dung 1h vua qua
Mỗi giờ, khi batch job hoàn thành, speed view cho giờ đó trở nên thừa — batch đã tính chính xác rồi, speed view bị gỡ bỏ.
3. Cái giá của Lambda — hai codebase, một kết quả
Điểm đau thực tế nhất của Lambda: tính "lượt xem video X" phải được implement hai lần:
- Batch layer: Spark/Python, đọc file Parquet, tính offline.
- Speed layer: Flink/Java, đọc Kafka stream, tính real-time.
Cùng một kết quả logic, hai codebase, hai ngôn ngữ, hai framework, hai đội on-call.
Theo thời gian, hai codebase diverge. Bug fix ở Flink chưa port sang Spark. Logic normalize timestamp thay đổi ở batch nhưng quên speed layer. Kết quả: cùng một query cho cùng một window, batch view và speed view trả hai con số khác nhau — và không ai biết cái nào đúng. Đây là fail-mode đặc trưng của Lambda: 2 codebase cho cùng kết quả → logic drift âm thầm, hạ tầng và on-call nhân đôi.
Faded step — thực hành phân tích logic drift:
Một team dùng Lambda tính "tổng doanh thu theo quốc gia". Sau 6 tháng, họ phát hiện batch view và speed view lệch nhau khoảng 3% cho cùng ngày.
Liệt kê 3 nguyên nhân có thể khiến batch view và speed view lệch 3% cho cùng khoảng thời gian. Gợi ý: nghĩ về (a) cách xử lý currency conversion, (b) event late arrival, (c) timezone handling.
Ba nguyên nhân team đó tìm ra: (a) batch dùng tỷ giá snapshot 00:00 UTC, speed dùng tỷ giá real-time khi event tới → lệch khi tỷ giá biến động trong ngày; (b) batch đọc toàn bộ event kể cả late-arrival lên tới 30 phút, speed bỏ event tới sau 5 phút → lệch ở những ngày nhiều event trễ; (c) batch tính theo ngày UTC, speed tính theo ngày local của user → lệch ở timezone xa UTC. Cả ba lỗi đều thuần logic — đúng loại lỗi không xuất hiện nếu chỉ có một codebase.
4. Kappa Architecture — bỏ batch, chỉ stream và replay
Jay Kreps đặt câu hỏi trực tiếp trong "Questioning the Lambda Architecture" (O'Reilly, 2014): nếu stream engine đủ mạnh để tính kết quả real-time, tại sao không dùng stream để tính cả kết quả lịch sử bằng cách replay log từ đầu?
Ý tưởng cốt lõi của Kappa: không cần batch layer riêng. Khi cần "recompute từ đầu", bạn chạy consumer stream version mới trên Kafka log từ offset 0 — đó chính là batch job, chỉ dùng đúng engine stream, một codebase.
flowchart TB
SRC["Raw events<br/>(append-only)"]
subgraph KAFKA["Kafka (long-retention log)"]
LOG["Log luu tru du lau<br/>(30-90 ngay) de reprocess"]
end
subgraph STREAM["Stream Processing (Flink / Kafka Streams)"]
V1["Consumer v1 (hien tai)<br/>dang serving"]
V2["Consumer v2 (version moi)<br/>replay tu offset 0"]
end
subgraph SERVING["Serving Layer"]
VIEW["Materialized view<br/>(tu stream v1)"]
VIEW2["View moi (dang build)<br/>chay song song"]
end
SRC --> LOG
LOG --> V1
LOG -->|"replay tu dau"| V2
V1 --> VIEW
V2 --> VIEW2
VIEW2 -.->|"cutover khi v2 bat kip"| VIEWLuồng reprocess trong Kappa:
- Phát hiện bug trong logic tính (vd fix currency conversion): viết consumer version 2.
- Chạy consumer v2 song song v1, replay từ offset 0 của Kafka log — v2 "đuổi" v1 theo thời gian vì đọc từ log đã có sẵn.
- Khi v2 đã xử lý hết log cũ và bắt kịp real-time, cutover: chuyển query sang view của v2, dừng v1.
- Chỉ có một codebase — v2 thay v1 hoàn toàn, không song song vĩnh viễn. Logic drift biến mất vì không còn hai codebase.
4.1 Kafka retention — nút thắt cổ chai của Kappa
Kafka phải giữ log đủ lâu để reprocess lại lịch sử xa. Chi phí thực tế:
Giả sử hệ thống nhận 50.000 events/giây, mỗi event 200 bytes (JSON nhỏ sau nén):
- Lưu lượng/ngày: 50.000 × 200 bytes × 86.400 giây ≈ 864 GB/ngày
- Giữ 30 ngày (phổ biến trong tài liệu Kappa): 864 × 30 ≈ 26 TB
- Giữ 90 ngày (để reprocess xa): 864 × 90 ≈ 78 TB
Kafka hot storage (SSD trên broker cluster) đắt hơn cold storage (S3, GCS) khoảng 10 lần. 78 TB Kafka hot tương đương chi phí của khoảng 780 TB S3.
Faded step — tính toán retention cost:
Một hệ thống khác có 20.000 events/giây, mỗi event 500 bytes. Tính lưu lượng/ngày và storage nếu giữ 60 ngày. So với ví dụ 50.000 events/s ở trên: hệ nào tốn storage hơn ở cùng số ngày retention?
Kết quả: 20.000 × 500 × 86.400 ≈ 864 GB/ngày — đúng bằng ví dụ 50k×200B vì tích events×bytes/event bằng nhau (20.000×500 = 50.000×200 = 10 MB/s). Giữ 60 ngày: 864 × 60 ≈ 52 TB. Hệ này ít hơn ví dụ 90 ngày (78 TB) nhưng nhiều hơn 30 ngày (26 TB). Bài học: retention days quan trọng hơn sự chênh lệch events/s khi tích events×bytes bằng nhau.
Đây là lý do Uber — một trong những tổ chức dùng Kafka quy mô lớn nhất — giới hạn Kafka retention chỉ vài ngày và không adopt Kappa đầy đủ. Ở quy mô hàng triệu trips/ngày với metadata phong phú, hot storage 30–90 ngày sẽ đạt hàng Petabyte.
5. Lambda vs Kappa — khi nào chọn cái nào?
Batch mạnh khi input bounded: sort toàn bộ, gom theo key, throughput khổng lồ — nhưng trả kết quả sau phút đến giờ. Stream mạnh khi input unbounded: phản hồi mili giây, state liên tục. Lambda/Kappa là câu trả lời cho "cần cả hai" — nhưng với hai đánh đổi rất khác nhau. Đọc lại Tư duy batch và Tư duy stream để thấy tại sao hai engine không đơn giản thay nhau.
| Tiêu chí | Lambda | Kappa |
|---|---|---|
| Số codebase | 2 — batch + stream | 1 — stream only |
| Complexity vận hành | Cao — 2 pipeline, 2 đội | Thấp — 1 pipeline |
| Reprocess lịch sử | Chạy lại batch job (đọc từ cold storage được) | Replay Kafka từ offset 0 (cần retention đủ dài) |
| Hot storage Kafka | Ít — speed layer chỉ cần window ngắn | Nhiều — cần retention 30-90 ngày |
| Kết quả lịch sử | Chính xác hoàn toàn (batch tính đầy đủ) | Chính xác nếu Kafka giữ đủ lâu |
| Rủi ro logic drift | Cao (2 codebase diverge theo thời gian) | Không có (1 codebase) |
Hai câu hỏi để chọn:
Câu 1 — Reprocess cần xa bao nhiêu ngày? Nếu cần recompute lại 5 năm log → Kafka retention 5 năm là bất khả thi về chi phí → Lambda (batch layer đọc từ cold storage S3). Nếu 30–90 ngày đủ → Kappa khả thi. Kết hợp Kafka tiered storage (hot 30 ngày + cold S3 tự động) giảm chi phí Kappa đáng kể.
Câu 2 — Batch logic có thể express bằng stream không? Nếu batch dùng full global sort, iterative ML training, hoặc join phức tạp trên toàn bộ lịch sử → khó stream hoá → Lambda. Nếu mọi tính toán express được bằng windowed stream ops và stateful aggregation → Kappa.
6. Pitfall — hai lỗi ngược chiều
6.1 Lambda: codebase drift âm thầm
❌ SAI — 2 codebase, logic diverge theo thoi gian
Batch (Spark/Python): sum(revenue * exchange_rate_00h_utc)
Speed (Flink/Java): sum(revenue * exchange_rate_realtime)
=> Cung mot ngay, 2 con so lech 2-5%.
=> Ai dung? Khong ai biet. Debug mat nhieu gio.
=> On-call nhan doi: phai hieu ca Spark va Flink de trace.
✅ DUNG — hoac Kappa (1 codebase), hoac Lambda voi Apache Beam
Apache Beam: viet pipeline logic 1 lan,
Beam runner tu sinh batch job (Spark) va stream job (Flink)
tu cung mot pipeline definition.
=> 1 logic, 2 mode, khong drift.
Hướng đúng: nếu phải giữ Lambda, dùng engine thống nhất (Apache Beam, Flink unified batch/stream API) để cùng một pipeline definition chạy được cả batch và stream. Không viết hai logic riêng biệt.
6.2 Kappa: retention cạn khi cần reprocess xa
❌ SAI — retention 7 ngay, phat hien bug tu 25 ngay truoc
Kafka retention chi giu 7 ngay -> mat log co.
Khong the reprocess chinh xac 25 ngay truoc.
Phai doc tu cold storage (S3) -> bat buoc viet batch job
-> quay lai Lambda-like, mat loi the Kappa.
✅ DUNG — dimensioning retention theo reprocess window thuc te
1. Xac dinh: reprocess xa nhat bao nhieu ngay? (30-90 la pho bien)
2. Dat retention >= window do.
3. Cost qua cao? Dung Kafka tiered storage (hot 30 ngay + cold S3 tu dong).
4. Reprocess window > 6 thang? Cân nhac Lambda thay Kappa.
7. 📚 Deep Dive
Lambda gốc:
- How to beat the CAP theorem — Nathan Marz (2011) — VERIFIED — đề xuất Lambda: immutable master dataset + batch layer (Hadoop) + speed layer (Storm) + serving layer (merge). Luận điểm cốt lõi: thay vì cố update mutable state và vướng CAP, tính lại toàn bộ từ immutable data để đạt eventual accuracy. Đọc mục "The Lambda Architecture" để thấy design rationale gốc.
Phản biện và Kappa:
- Questioning the Lambda Architecture — Jay Kreps (O'Reilly, 2014) — bài gốc giới thiệu tên "Kappa Architecture". Kreps (đồng tác giả Kafka) lập luận: Kafka long-retention đủ để làm batch layer qua replay; 2 codebase là cái giá quá cao; stream engine đã đủ mạnh. Đọc mục "The Log is the Database" để thấy vì sao log append-only là nền tảng của cả hai kiến trúc.
Bối cảnh DDIA:
- Designing Data-Intensive Applications (Kleppmann, 2017) — Ch12 "The Future of Data Systems", mục "Lambda Architecture and Its Problems" + "Unifying Batch and Stream Processing" — phân tích cả hai kiến trúc với góc nhìn độc lập.
Ghi chú: Lambda đúng nghĩa dùng Hadoop + Storm (2011); ngày nay team thường dùng Spark + Flink hoặc Apache Beam. Kappa đúng nghĩa dùng Kafka long-retention; tiered storage (Kafka + S3) giảm chi phí hot storage đáng kể và là hướng phổ biến hơn trong triển khai thực tế.
8. Liên hệ các bài khác
- Tư duy batch — Module 1: nền của Lambda batch layer — input bất biến, idempotent, reprocess từ nguồn. Batch layer trong Lambda là một batch job đúng nghĩa này, chỉ chạy định kỳ thay vì một lần.
- Tư duy stream — Module 2: nền của speed layer (Lambda) và toàn bộ Kappa. Producer/consumer model, unbounded input, state liên tục — đặc biệt phần "Kết quả luôn là bản tạm thời" giải thích tại sao speed view trong Lambda cần được thay bởi batch view khi batch chạy xong.
- Bài 01 — CDC: trong thực tế Lambda/Kappa, CDC thường là nguồn event vào Kafka. Debezium đọc WAL → Kafka topic → Lambda/Kappa pipeline tiêu thụ. Hiểu CDC giúp thiết kế nguồn dữ liệu cho cả hai kiến trúc.
- Bài 05 — Capstone đồ án: lab tổng hợp toàn module. Chọn Lambda hay Kappa và justify tại sao là một phần của đồ án — nơi bạn áp dụng bộ câu hỏi hai trục ở bài này vào bài toán cụ thể.
9. Tóm tắt
- Lambda Architecture (Marz, 2011): batch layer (chính xác, chậm) + speed layer (nhanh, xấp xỉ) + serving layer gộp. Giải quyết "cần cả hai", nhưng phải duy trì 2 codebase cho cùng một logic.
- Logic drift là rủi ro hàng đầu Lambda: hai framework khác nhau diverge theo thời gian → batch view và speed view lệch nhau cho cùng window. Fix: Apache Beam (một pipeline, hai mode).
- Kappa Architecture (Kreps, 2014): bỏ batch layer, chỉ stream + Kafka long-retention. Reprocess = consumer version mới replay từ offset 0, chạy song song v1, cutover khi bắt kịp. Một codebase, đơn giản hơn.
- Chi phí Kappa: 50.000 events/s × 200 B ≈ 864 GB/ngày; giữ 90 ngày ≈ 78 TB Kafka hot storage (đắt hơn cold ~10 lần). Uber (quy mô hàng triệu trips/ngày → hàng Petabyte) giới hạn retention vài ngày vì cost — không adopt Kappa đầy đủ.
- Chọn Lambda khi reprocess cần xa hơn retention khả thi, hoặc batch logic phức tạp không thể express bằng stream.
- Chọn Kappa khi retention 30–90 ngày đủ cho reprocess window, stream engine đủ mạnh, và muốn giảm complexity vận hành.
10. Tự kiểm tra
Q1Lambda Architecture giải quyết bài toán gì mà batch thuần hoặc stream thuần không đáp ứng được? Vì sao cần cả hai lớp chạy song song?▸
Lambda giải quyết bài toán cần cả hai cùng lúc: kết quả chính xác từ toàn bộ lịch sử (batch) và kết quả gần đây với độ trễ thấp (stream). Batch thuần trả kết quả sau giờ đến ngày — không đáp ứng real-time. Stream thuần phản hồi nhanh nhưng khó recompute chính xác toàn bộ lịch sử hàng TB.
Cần hai lớp song song vì hai yêu cầu đối lập về thời gian: batch layer xử lý offline toàn bộ log (chậm nhưng chính xác), speed layer bù khoảng thời gian từ batch cuối đến hiện tại (nhanh, xấp xỉ). Serving layer gộp lại để query nhận được cả hai phần. Khi batch view mới xong, nó thay thế speed view của window đó — batch đã phủ chính xác rồi.
Q2Vì sao 'logic drift' là rủi ro hàng đầu của Lambda? Cho ví dụ cụ thể một trường hợp nó xảy ra và hậu quả.▸
Logic drift xảy ra vì batch layer và speed layer là hai codebase riêng, thường bằng hai ngôn ngữ/framework khác nhau. Theo thời gian chúng diverge: bug fix ở một bên chưa port sang bên kia, người khác nhau maintain, release cycle không đồng bộ.
Ví dụ: batch dùng tỷ giá currency snapshot 00:00 UTC, speed dùng tỷ giá real-time khi event tới. Cùng ngày, hai lớp cho doanh thu theo quốc gia lệch 3–5%. Không ai biết cái nào đúng vì logic tính khác nhau từ thiết kế. Debug mất nhiều giờ phải trace cả hai pipeline, với kỹ năng cả Spark lẫn Flink. Hậu quả: dashboard kinh doanh hiển thị số sai, on-call nhân đôi.
Q3Kappa Architecture reprocess dữ liệu lịch sử như thế nào mà không cần batch layer riêng? Mô tả từng bước.▸
Kappa dựa vào Kafka long-retention: log event được giữ lâu (30–90 ngày). Khi cần reprocess (fix bug, đổi logic):
- Bước 1: viết consumer version 2 với logic mới.
- Bước 2: chạy v2 song song v1, replay từ offset 0 của Kafka log — v2 đọc toàn bộ lịch sử và "đuổi kịp" v1 theo thời gian vì log đã có sẵn.
- Bước 3: khi v2 đã xử lý hết log cũ và bắt kịp real-time, cutover: chuyển query sang view của v2, dừng v1.
Chìa khoá: Kafka log là "batch input" ẩn — đọc từ offset 0 đến hiện tại là đọc toàn bộ lịch sử, đúng như batch job. Chỉ có một codebase stream, không cần viết batch logic riêng, không logic drift.
Q4Tại sao Uber không adopt Kappa đầy đủ dù Kappa đơn giản hơn Lambda? Yếu tố nào quyết định lựa chọn đó?▸
Yếu tố quyết định là chi phí Kafka retention hot storage. Ở quy mô Uber (hàng triệu trips/ngày với metadata phong phú), giữ Kafka retention 30–90 ngày đẩy storage hot Kafka lên hàng Petabyte. Hot storage (SSD trên broker cluster) đắt hơn cold storage (S3) khoảng 10 lần — chi phí quá lớn.
Uber giới hạn Kafka retention chỉ vài ngày — đủ cho late arrival và minor reprocess, nhưng không đủ để reprocess lịch sử xa. Khi retention quá ngắn, Kappa mất lợi thế chính (replay từ đầu): bị buộc quay về đọc cold storage để reprocess xa, gần giống Lambda. Ở quy mô cực lớn, chi phí storage là yếu tố kiến trúc quan trọng hơn độ đơn giản về codebase.
Q5Bạn đang thiết kế hệ thống analytics cho fintech: 5.000 events/giây, mỗi event 300 bytes, cần báo cáo chính xác tối thiểu 6 tháng lịch sử và cảnh báo gian lận trong 5 giây. Lambda hay Kappa? Justify.▸
Câu hỏi quyết định: reprocess window 6 tháng có khả thi với Kappa không?
Tính toán: 5.000 × 300 × 86.400 ≈ 130 GB/ngày. Giữ 6 tháng (180 ngày): 130 × 180 ≈ 23 TB Kafka hot. Không quá lớn, Kappa khả thi nếu budget cho phép. Nếu audit yêu cầu reprocess 2 năm (730 ngày): 130 × 730 ≈ 95 TB hot — bắt đầu tốn kém, cân nhắc Kafka tiered storage (hot 60 ngày + cold S3 tự động) để giảm chi phí.
Gợi ý: Kappa với tiered storage là lựa chọn tốt ở quy mô này — giữ lợi thế một codebase, kiểm soát chi phí. Lambda hợp lý hơn nếu team nhỏ, muốn đơn giản, và chấp nhận dùng Apache Beam để tránh logic drift. Không có đáp án duy nhất — justify bằng hai trục: retention window và khả năng express batch logic bằng stream.
Q6Một đồng nghiệp đề xuất: 'Lambda hay Kappa đều phức tạp — dùng batch job chạy mỗi 5 phút là đủ, không cần kiến trúc đặc biệt'. Đánh giá đề xuất này.▸
Đúng một phần: nếu bài toán chấp nhận độ trễ 5 phút thì batch mini là đủ và đơn giản hơn nhiều. Lambda/Kappa chỉ cần thiết khi yêu cầu thật sự cần cả kết quả lịch sử chính xác lẫn độ trễ dưới vài giây — ví dụ fraud detection (cần giây) + báo cáo thuế hàng năm (cần chính xác tuyệt đối).
Sai khi áp dụng mù quáng: batch mỗi 5 phút có độ trễ tối thiểu 5 phút (event xảy ra ngay sau batch vừa chạy xong phải chờ lần sau). Không đáp ứng bài toán "phát hiện gian lận trong 3 giây". Ngoài ra, batch mini vẫn là Lambda không đầy đủ: không có speed view, serving layer phải chờ batch xong mới cập nhật. Trước khi chọn kiến trúc, xác định rõ SLA độ trễ thực sự: nếu 5 phút đủ, batch mini là đúng — đừng over-engineer Lambda/Kappa khi chưa cần.
Q7So sánh cách serving layer hoạt động trong Lambda với Kappa. Vì sao Lambda cần gộp hai view còn Kappa chỉ có một?▸
Trong Lambda, tại bất kỳ thời điểm nào cũng tồn tại hai nguồn kết quả song song: batch view (chính xác đến lần recompute cuối, vd 1 giờ trước) và speed view (xấp xỉ từ lần recompute đó đến hiện tại). Serving layer phải gộp hai phần vì chúng cover hai khoảng thời gian không chồng lấp: tổng = lịch sử từ batch + delta gần đây từ speed. Khi batch view mới ra, speed view của window đó bị loại bỏ.
Kappa chỉ có một view từ stream processing: consumer xử lý tất cả event từ offset 0 đến hiện tại bằng một pipeline duy nhất. Không có gộp, không có delta riêng. Kết quả luôn là state mới nhất của toàn bộ log đã xử lý. Serving layer đơn giản hơn — chỉ đọc từ materialized view của stream. Nhưng đòi hỏi stream engine xử lý được cả lịch sử lẫn real-time qua replay.
Bài tiếp theo: Capstone đồ án — thiết kế hệ dữ liệu phái sinh đầu-cuối
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