Kafka hỗ trợ các đảm bảo phân phối khác nhau — at-most-once, at-least-once và exactly-once — quyết định liệu tin nhắn có thể bị mất hoặc trùng lặp hay không. Hiểu chúng và cách đạt được chúng là quan trọng để xây dựng hệ thống tin cậy.
Ba ngữ nghĩa phân phối
AT-MOST-ONCE → tin nhắn có thể BỊ MẤT nhưng không bao giờ trùng lặp:
→ commit offset TRƯỚC khi xử lý → nếu xử lý thất bại, tin nhắn bị bỏ qua (mất)
→ dành cho: khi mất mát thỉnh thoảng là chấp nhận được còn trùng lặp thì không (hiếm)
AT-LEAST-ONCE → tin nhắn không bao giờ bị mất nhưng có thể TRÙNG LẶP:
→ commit offset SAU khi xử lý → nếu crash trước khi commit, tin nhắn được
xử lý lại (trùng lặp) → đòi hỏi xử lý IDEMPOTENT
→ mặc định phổ biến; an toàn (không mất) nhưng phải xử lý trùng lặp
EXACTLY-ONCE → mỗi tin nhắn được xử lý đúng một lần (không mất, không trùng lặp):
→ mạnh nhất, nhưng khó nhất; đòi hỏi transaction Kafka + producer idempotent
