می دانیم که به ازای هر گروه مصرف کننده باید اطلاعات اینکه این گروه، از هر پارتیشن تا کدام آفست را مصرف کرده است ذخیره کنیم که اگر به هر دلیلی گروه ریاستارت شد و یا عضو جدیدی به آن اضافه شد، کافکا دقیقا بداند از کدام آفست باید به این گروه یا مصرف کننده جدید، سرویسدهی کند.
قبلاً Kafka از ZooKeeper برای ذخیره مقادیر آفستهای کامیتشده استفاده میکرد، به ازای هر Consumer Group و هر پارتیشن. اما از نسخه ۲.۸ به بعد، با غیر فعال کردن ZooKeeper، مدیریت ذخیره آفستها توسط خود Kafka انجام میشود. این موضوع باعث شد که Kafka بتواند پیامها و وضعیت مصرفکنندهها را بهصورت داخلی و مطمئن مدیریت کند.
در کارگاه عملی، ما دو Consumer Group داشتیم و مشاهده کردیم که دادههای آنها در پارتیشنهای ۱۵ و ۳۹ از تاپیک __consumer_offsets ذخیره میشود:
Partition=39 Offset=4732 Key=metadata_groupusers Value=...
Reached end of topic __consumer_offsets [15] at offset 4516
Reached end of topic __consumer_offsets [39] at offset 4733
Partition=15 Offset=4516 Key=metadata_group2users Value=...
Partition=15 Offset=4517 Key=metadata_group2users Value=...
...
Kafka آفست مصرفکنندهها را در یک تاپیک داخلی و کامپکتشده به نام __consumer_offsets نگهداری میکند.
kafka-topics.sh --bootstrap-server localhost:9092 --list --include-internal
خروجی نمونه:
__consumer_offsets
users
users-stage-2
...
پیامهای تاپیک __consumer_offsets به صورت کامپکتشده و باینری هستند:
kcat -b localhost:9092 -t __consumer_offsets -C -o beginning -c 10 -f 'Partition=%p Offset=%o Key=%k Value=%s\n'
kafka-consumer-groups.shkafka-consumer-groups.sh --bootstrap-server localhost:9092 \
--describe --group metadata_group
__consumer_offsets تطابق دارندauto.offset.resetتنظیم auto.offset.reset مشخص میکند که اگر هیچ آفست معتبری برای گروه مصرفکننده وجود نداشته باشد، مصرفکننده از کجا شروع به خواندن کند.
⚠️ نکات مهم:
earliest فقط زمانی اعمال میشود که هیچ آفست معتبری موجود نباشد. اگر آفست قبلاً ثبت شده باشد، Kafka از همان آفست شروع به خواندن میکند.earliest میتواند باعث خواندن مجدد دادههای قدیمی شود، که در سناریوهای بازسازی وضعیت مفید است ولی در سیستمهای حجیم ممکن است بار اضافی ایجاد کند.در کارگاه عملی مشاهده شد که دو Consumer Group ما دادههای خود را در پارتیشنهای ۱۵ و ۳۹ ذخیره کردند:
Partition=15 Offset=4516 Key=metadata_group2users Value=...
Partition=39 Offset=4733 Key=metadata_groupusers Value=...
__consumer_offsets `ذخیره میکند. ✅ جمعبندی
__consumer_offsets برای نگهداری آفستها استفاده میکند.auto.offset.reset=earliest تعیین میکند که در صورت عدم وجود آفست معتبر، مصرف از اولین پیام موجود آغاز شود.