Hiểu về auto.offset.reset trong Kafka và cách cấu hình để đọc message từ đầu trong PHP
Khi làm việc với Apache Kafka trong các ứng dụng PHP (đặc biệt là hệ sinh thái Laravel), một trong những bài toán phổ biến nhất là làm sao để consumer đọc được các message cũ đã tồn tại trên topic thay vì chỉ nhận message mới. Chìa khóa nằm ở tham số auto.offset.reset.
1. Ý nghĩa của auto.offset.reset
Trong Kafka, Offset là một định danh dạng số nguyên tuần tự được gán cho từng message trong một partition của topic. Nó giống như con trỏ vị trí giúp consumer biết nó đã đọc đến đâu.
Tham số auto.offset.reset quyết định hành vi của Consumer khi chưa có offset nào được lưu (ví dụ: Consumer Group mới tinh lần đầu kết nối) hoặc khi offset hiện tại không còn hợp lệ (bị xóa do vượt quá thời gian retention).
-
latest(Mặc định): Consumer chỉ nhận những message mới được gửi đến kể từ thời điểm consumer bắt đầu chạy. Toàn bộ message cũ trước đó sẽ bị bỏ qua. -
earliest: Consumer sẽ quay lại đọc từ message đầu tiên hiện có trong partition (trong phạm vi retention period mà broker cho phép).
2. Hướng dẫn cấu hình chi tiết trong Laravel / PHP
Đoạn code bạn cung cấp thường nằm trong file cấu hình Kafka của Laravel (ví dụ: config/kafka.php):
PHP
'consumer' => [
'auto.offset.reset' => env('OFFSET_RESET', 'latest'),
// Các cấu hình khác...
],
Để đổi sang chế độ đọc từ đầu, bạn có thể áp dụng một trong hai cách sau:
Cách A: Cấu hình trực tiếp qua file .env (Khuyên dùng)
Cách này giúp bạn dễ dàng thay đổi môi trường (Local, Staging, Production) mà không cần sửa code gốc. Mở file .env trong dự án Laravel của bạn và thêm hoặc sửa dòng sau:
Đoạn mã
OFFSET_RESET=earliest
Cách B: Sửa trực tiếp trong file cấu hình
Nếu bạn muốn cố định luôn trong source code mà không qua file .env, hãy sửa trực tiếp file cấu hình Kafka:
PHP
'consumer' => [
'auto.offset.reset' => 'earliest', // Đổi 'latest' thành 'earliest'
// Các cấu hình khác...
],
3. Những lưu ý quan trọng khi dùng earliest
Khi chuyển sang chế độ đọc từ đầu, bạn cần lưu ý một số điểm kỹ thuật sau để tránh phát sinh lỗi:
-
Consumer Group ID: Kafka chỉ áp dụng cơ chế
auto.offset.resetkhi Consumer Group chưa từng lưu offset trước đó. Nếu bạn dùng mộtgroup_idcũ (đã từng chạy trước đó và đã lưu offset ở đâu đó giữa chừng), Kafka sẽ không đọc từ đầu nữa mà tiếp tục đọc từ vị trí offset đã lưu cũ. Muốn đọc lại từ đầu với group cũ, bạn phải đổigroup_idthành một tên mới hoàn toàn hoặc dùng công cụ reset offset của Kafka. -
Retention Period (Thời gian lưu trữ của Topic): Kafka không giữ message vĩnh viễn (trừ khi được cấu hình log compaction hoặc retention vô hạn). Message cũ chỉ đọc được nếu chúng vẫn nằm trong thời gian lưu trữ cấu hình trên Kafka Broker (ví dụ: 7 ngày gần nhất).
💡 Tóm lại: Chỉ cần chuyển
auto.offset.resetthànhearliest(thông qua.envhoặc file config) kết hợp với mộtgroup_idmới là consumer của bạn sẽ đọc toàn bộ message từ đầu.
All rights reserved