Kafka chỉ đảm bảo thứ tự trong một partition, không đảm bảo giữa các partition.
Muốn các sự kiện liên quan nhau giữ đúng trình tự thì phải đưa chúng về cùng một partition bằng cách dùng chung key.
java
// same key -> same partition -> ordered for that entity
producer.send(new ProducerRecord<>("orders", order.getId(), event));Chọn key theo đơn vị cần đảm bảo thứ tự, thường là id thực thể: order_id cho vòng đời đơn hàng, user_id cho luồng sự kiện của một người dùng, account_id cho biến động số dư. Không dùng key ngẫu nhiên hay null nếu cần thứ tự — Kafka sẽ rải đều và mất trình tự.
Các đánh đổi phải nêu được:
- Song song bị giới hạn bởi số partition. Một partition chỉ do một consumer trong group đọc, nên thứ tự càng chặt thì mức song song càng thấp.
- Key lệch (hot partition). Chọn key phân bố xấu — ví dụ
tenant_idmà một tenant chiếm 80% lưu lượng — sẽ dồn tải vào một partition trong khi các partition khác rỗi. - Tăng số partition làm hỏng ánh xạ key → partition với message tương lai, nên phải chọn số partition dư từ đầu.
- Retry phá thứ tự nếu producer cho phép nhiều request in-flight và không bật idempotence: message lỗi được gửi lại sau message kế tiếp. Bật
enable.idempotence=trueđể Kafka giữ trật tự khi retry.
Một lối thoát thực dụng: thay vì ép thứ tự tuyệt đối, cho consumer tự bỏ qua sự kiện cũ bằng version/timestamp trong payload.