در کافکا، Offset نشاندهنده موقعیت آخرین پیام مصرفشده در یک پارتیشن است. مدیریت صحیح Offsetها، کلید اطمینان از پردازش دقیق و قابلاعتماد پیامها است. بهخصوص در سناریوهای Production، نیاز داریم کنترل کامل روی Commit و Ack داشته باشیم.
بهصورت پیشفرض، Kafka Consumer در پایتون دارای Auto Commit است:
consumer = KafkaConsumer(
'demo-topic',
bootstrap_servers='localhost:9092',
group_id='example-group',
auto_offset_reset='earliest',
enable_auto_commit=True, # فعال بودن Auto Commit
auto_commit_interval_ms=5000
)
enable_auto_commit=True → Kafka هر چند ثانیه (پیشفرض ۵ ثانیه) آخرین Offset مصرفشده را ذخیره میکند.برای پردازشهای حساس، بهتر است Commit دستی انجام دهیم:
from kafka import KafkaConsumer
import json
consumer = KafkaConsumer(
'demo-topic',
bootstrap_servers='localhost:9092',
group_id='manual-commit-group',
auto_offset_reset='earliest',
enable_auto_commit=False
)
for msg in consumer:
print(f"Processing: {msg.value} (Partition={msg.partition}, Offset={msg.offset})")
# فرض کنید پردازش پیام زمانبر است
success = True # نتیجه پردازش
if success:
consumer.commit()
enable_auto_commit=False → Kafka خودکار Commit نمیکند.consumer.commit()، آخرین Offset ذخیره میشود.گاهی میخواهیم Commit را برای هر پارتیشن جداگانه انجام دهیم:
from kafka import TopicPartition
tp = TopicPartition('demo-topic', 0)
consumer.commit(offsets={tp: 10})
acks مشخص میکند پیام با چه سطحی تایید شود:
acks=0 → بدون انتظار برای تاییدacks=1 → رهبر یا لیدر پارتیشن تأیید میکندacks=all → تمام ISRها تأیید میکنندconsumer = KafkaConsumer(
'demo-topic',
bootstrap_servers='localhost:9092',
group_id='ack-demo-group',
auto_offset_reset='earliest',
enable_auto_commit=False
)
for msg in consumer:
print(f"Received: {msg.value}")
# شبیهسازی پردازش طولانی
import time
time.sleep(1)
consumer.commit()
| مفهوم | توضیح |
|---|---|
| Offset | شماره ترتیبی پیام در یک پارتیشن |
| Auto Commit | Kafka خودکار Offset را ذخیره میکند (ساده اما کمقابلکنترل) |
| Manual Commit | کنترل کامل روی پردازش پیام و ذخیره Offset |
| Partition Commit | ذخیره Offset برای پارتیشن خاص، مناسب پردازش موازی |
| Ack (Producer) | میزان تأیید پیام هنگام ارسال به کلاستر |
با فهم دقیق Offset و Commit، میتوان سیستمهای Exactly-Once Processing یا At-Least-Once Processing طراحی کرد و از از دست رفتن یا دوبارهخواندن پیامها جلوگیری کرد.