Lập trình 22/09/2026 7 phút

Consumer lag: tín hiệu cảnh báo số một của hệ message queue, đo thật qua offset

Hệ message queue có khoẻ không? Đừng nhìn CPU hay throughput — nhìn consumer lag. Bài này đo thật trên Kafka: backlog 200.000 message, consumer chậm, producer thêm 100.000 — lag vọt từ 150.000 lên 250.000 dù consumer vẫn chạy, rồi về 0 khi bắt kịp. LAG = LOG-END-OFFSET trừ CURRENT-OFFSET, và nó là chỉ báo sớm nhất rằng hệ sắp không theo kịp.

Lập trình 22/09/2026 7 phút

Thứ tự message trong Kafka: vì sao scale ra nhiều partition làm lộn thứ tự, và key cứu thế nào

Kafka đảm bảo thứ tự — nhưng chỉ trong một partition, không phải toàn topic. Bài này chạy thật: một partition giữ đúng thứ tự ev-1..10; ba partition không key làm thứ tự toàn topic lộn tung (ev-3, ev-8, ev-7...); nhưng dùng key theo user thì mọi event của cùng một user vào cùng partition và giữ nguyên thứ tự. Đây là đánh đổi cốt lõi giữa song song và thứ tự.

Lập trình 22/09/2026 8 phút

Event sourcing: lưu chuỗi sự kiện thay vì trạng thái, và dựng lại mọi thứ bằng replay

Thay vì lưu 'số dư = 200' rồi ghi đè mỗi lần đổi, event sourcing lưu từng sự kiện (nạp 100, rút 30, nạp 50...) và tính trạng thái bằng cách replay chúng. Bài này chạy thật trên Kafka: replay toàn bộ event log dựng lại balance 200, time-travel về quá khứ cho balance 100 tại thời điểm cũ, thêm event rồi replay vẫn đúng 700, và toàn bộ 7 sự kiện còn nguyên làm audit. Đổi lại là chi phí replay.

Lập trình 22/09/2026 8 phút

Saga pattern: giao dịch phân tán khi không có transaction chung, demo rollback bằng bù trừ

Đặt một đơn hàng cần trừ kho, trừ tiền, tạo đơn — ở ba service khác nhau, không có transaction chung để 'commit cả ba hoặc không gì'. Saga giải quyết bằng chuỗi bước cục bộ, mỗi bước có bước bù trừ. Bài này chạy thật trên PostgreSQL: saga thành công trừ kho/tiền và tạo đơn khớp; saga lỗi ở bước tiền tự hoàn kho đã trừ và không tạo đơn, đưa hệ về đúng trạng thái ban đầu.

Lập trình 22/09/2026 8 phút

Schema evolution: tiến hoá message mà không làm vỡ consumer đang chạy

Producer và consumer deploy không đồng bộ — producer gửi message phiên bản mới trong khi consumer cũ còn chạy, và ngược lại. Bài này chạy thật bằng Go: thêm field optional thì consumer mới đọc message cũ vẫn ổn (currency mặc định VND), consumer cũ đọc message mới thì bỏ qua field lạ; nhưng đổi kiểu field cho lỗi parse to, còn đổi tên field gây mất dữ liệu âm thầm (amount=0 mà không báo lỗi). Quy tắc: chỉ thêm field optional.

Lập trình 22/09/2026 6 phút

Tổng kết Message Queue & Event-Driven: khung quyết định và checklist từ 12 bài đo thật

Mười một phần qua ta dựng từng mảnh của hệ message queue bằng demo đo thật. Bài cuối ghép chúng lại: một pipeline hoàn chỉnh produce 500 order qua Kafka, giao trùng 1000 lượt theo at-least-once, rồi consumer idempotent xử lý đúng 500 — tất cả patterns làm việc cùng nhau. Kèm bảng tổng hợp mọi con số đo thật xuyên 12 bài và một khung quyết định chọn dùng pattern nào khi nào.