MAX.IN.FLIGHT.REQUESTS.PER.CONNECTION: GIỮ VỮNG THỨ TỰ GỬI TIN NHẮN TRONG KAFKA
Trong cấu hình Kafka Producer, nếu như các tham số về timeout hay buffer giúp tối ưu tốc độ, thì dòng cấu hình:
'max.in.flight.requests.per.connection' => (string) 1,
Lại là một "chốt kiểm soát" mang tính sống còn đối với thứ tự tuần tự của dữ liệu. Đằng sau con số 1 tưởng chừng như đơn giản này là một cuộc đánh đổi kinh điển giữa Hiệu năng (Throughput) và Tính nhất quán (Order Consistency).
Dưới đây là bài viết mổ xẻ chi tiết bản chất của tham số này.
1. "In-Flight Requests" Là Gì Và Vấn Đề Xảy Ra Khi Nào?
Trong mạng máy tính, In-flight requests là số lượng các yêu cầu (request) mà Producer đã gửi đi cho Kafka Broker nhưng vẫn chưa nhận được phản hồi (ACK) xác nhận thành công.
- Mặc định của Kafka: Thông thường, tham số này được mặc định là 5. Nghĩa là Producer có thể bắn liên tiếp 5 lô (batches) tin nhắn sang Broker mà không cần đợi lô đầu tiên được ký nhận. Điều này giúp tối ưu hóa băng thông và đẩy tốc độ gửi lên mức tối đa.
- 💥 Thảm họa lệch thứ tự (Out-of-order): Giả sử bạn gửi lô số 1 và lô số 2. Lô 1 gặp sự cố mạng tạm thời và bị lỗi (failed), trong khi lô số 2 lại đi trót lọt. Nếu Producer được phép retry (thử lại) lô số 1, lô số 1 sẽ được đẩy lên sau lô số 2. Kết quả: Toàn bộ thứ tự tin nhắn trong Partition bị đảo lộn hoàn toàn!
2. Ý Nghĩa Của Việc Ép Giá Trị Về 1
Khi bạn cấu hình max.in.flight.requests.per.connection thành 1, bạn đang ra lệnh cho Producer một kỷ luật thép:
"Tuyệt đối không được gửi lô tin nhắn tiếp theo nếu lô hiện tại chưa nhận được tín hiệu ACK thành công từ Broker."
- Đảm bảo thứ tự tuyệt đối (Strict Ordering): Tin nhắn số 1 phải được xác nhận thành công thì tin nhắn số 2 mới được phép xuất phát. Không bao giờ có chuyện tin nhắn bị đảo ngôi.
- Kết hợp hoàn hảo với
retriesvàenable.idempotence: Đây là mảnh ghép bắt buộc trong các hệ thống yêu cầu tính chính xác tuyệt đối (như tài chính, ngân hàng, số dư tài khoản) để vừa chống trùng lặp vừa chống sai thứ tự.
3. Sự Đánh Đổi: An Toàn Đổi Lấy Tốc Độ
Không có bữa trưa nào miễn phí trong kỹ thuật phần mềm. Việc siết giá trị này về 1 kéo theo một hệ quả:
- Giảm Throughput (Băng thông/Tốc độ): Vì Producer phải "đứng chờ" Broker gật đầu xác nhận từng lô một rồi mới được gửi tiếp, độ trễ mạng (latency) sẽ tăng lên, làm giảm đáng kể số lượng message gửi đi mỗi giây.
4. Bảng So Sánh Nhanh
| Tiêu chí | Giá trị mặc định (>= 2) | Ép về 1 ('max.in.flight' => 1) |
|---|---|---|
| Tốc độ gửi (Throughput) | Cực kỳ cao, tận dụng tối đa đường truyền. | Thấp hơn do phải chờ đợi tín hiệu ACK từng bước. |
| Thứ tự tin nhắn | Có nguy cơ bị đảo lộn nếu có request retry lỗi. | Tuyệt đối chính xác 100%. |
| Khuyên dùng cho | Log hệ thống, Analytics, Notification (Thứ tự không quan trọng). | Hệ thống tài chính, Đơn hàng, Kho vận, Trạng thái thanh toán. |
💡 Lời Kết
Việc cấu hình 'max.in.flight.requests.per.connection' => 1 là minh chứng cho thấy trong thiết kế hệ thống phân tán, sự chính xác luôn phải đặt lên trên tốc độ thô. Nếu dự án của bạn đang xử lý các nghiệp vụ mà sai lệch một bước là hỏng toàn bộ luồng dữ liệu, thì việc đánh đổi một chút hiệu năng để lấy sự an toàn tuyệt đối này là hoàn toàn xứng đáng.
All rights reserved