Kafka بسته به تنظیمات Producer، دادهها را در یکی از سه الگوی ذخیرهسازی ثبت میکند.
تفاوت اصلی میان این حالتها در وجود یا عدم وجود batching، sequence، producerId و نوع کنترل تحویل (idempotent / transactional) است.
در این حالت هیچ batching، idempotency یا تراکنشی فعال نیست.
هر پیام بهصورت مستقل و بدون متادیتای اضافی در فایل لاگ ذخیره میشود.
📄 نمونه لاگ:
baseOffset: 13 lastOffset: 13 count: 1
producerId: -1 producerEpoch: -1
baseSequence: -1
isTransactional: false
compresscodec: none
📘 ویژگیها:
در این حالت batching فعال است، اما idempotency و تراکنش غیرفعالاند.
Kafka چند پیام را در یک batch ذخیره میکند تا کارایی شبکه و دیسک افزایش یابد.
📄 نمونه لاگ:
baseOffset: 47 lastOffset: 51 count: 5
producerId: -1 producerEpoch: -1
baseSequence: -1 lastSequence: -1
isTransactional: false
compresscodec: lz4
📘 ویژگیها:
linger_ms = 5000 batch_size = 131072 compression_type = 'lz4'🔎 نکته:
Batching کاملاً مستقل از idempotency است و در هر producer میتواند فعال شود.
در محیط واقعی توصیه میشود حتماً batching و فشردهسازی فعال باشند.
enable.idempotence=True)Kafka در این حالت برای هر producer یک producerId و sequence تولید میکند.
هدف این است که در صورت retry، پیام تکراری در لاگ ثبت نشود.
📄 نمونه لاگ:
baseOffset: 20 lastOffset: 25 count: 6
producerId: 0 producerEpoch: 0
baseSequence: 0 lastSequence: 5
isTransactional: false
compresscodec: lz4
📘 ویژگیها:
sequence) هستند.🔎 نکته:
در هر بار اجرای مجدد producer، مقدار producerId جدیدی تخصیص مییابد.
transactional.id)در این حالت پیامها در قالب تراکنش ارسال میشوند تا یا همگی Commit شوند یا هیچکدام.
Kafka در این حالت از Transaction Coordinator استفاده میکند.
📄 نمونه لاگ (حتی بدون idempotency):
baseOffset: 53 lastOffset: 57 count: 5
producerId: 3 producerEpoch: 0
baseSequence: 0 lastSequence: 4
isTransactional: true isControl: false
compresscodec: lz4
---
offset: 58 isControl: true endTxnMarker: COMMIT
📘 ویژگیها:
producerId و sequence حتی بدون idempotency فعالاند.isControl=true) ثبت میکند.endTxnMarker نشاندهندهی وضعیت Commit یا Abort است.producerId ثابت میماند، ولی producerEpoch در اجرای مجدد افزایش مییابد.🔎 نکته مهم:
در حالت تراکنشی، تخصیص sequence و producerId اجباری است،
زیرا Kafka باید بتواند مرز تراکنشها را دقیقاً مشخص کند و از بازپخش ناقص جلوگیری نماید.
| ویژگی | Single Record | Batching | Idempotent | Transactional |
|---|---|---|---|---|
| batching | ❌ ندارد | ✅ دارد | ✅ دارد | ✅ دارد |
| producerId | ❌ ندارد | ❌ ندارد | ✅ دارد | ✅ دارد |
| sequence | -۱ | -۱ | از ۰ به بالا | از ۰ به بالا |
| producerEpoch | ❌ ندارد | ❌ ندارد | ۰ | تغییر میکند |
| isTransactional | false | false | false | true |
| control records | ❌ ندارد | ❌ ندارد | ❌ ندارد | ✅ دارد |
| جلوگیری از تکرار | ❌ ندارد | ❌ ندارد | ✅ دارد | ✅ (با commit/abort) |
| compression | اختیاری | اختیاری | اختیاری | اختیاری |
producerId و sequence تخصیص میدهد.batching + compression + idempotency (+ transaction when needed)