Apache Kafka در سالهای اخیر به یکی از مهمترین زیرساختهای پردازش دادههای جریانی (Event Streaming) تبدیل شده است. درک معماری داخلی Kafka و نحوه تعامل اجزای آن، اولین گام برای طراحی و پیادهسازی یک سامانه مقیاسپذیر و قابلاعتماد مبتنی بر این فناوری است. در این مطلب، تلاش شده است مفاهیم بنیادین Kafka با زبانی رسمی اما ساده و قابلفهم ارائه شود تا نقطه شروعی مناسب برای ورود به دنیای معماری کافکا باشد.
در Kafka 4، معماری کلاستر بر پایه دو نقش کلیدی بنا شده است:

کنترلرها مسئول مدیریت کامل متادیتای کلاستر هستند. این نقش در نسخههای قدیمی توسط ZooKeeper انجام میشد، اما از Kafka 4 به بعد، مدیریت متادیتا بهطور کامل به درون خود Kafka و از طریق KRaft منتقل شده است. وظایف اصلی کنترلر عبارتاند از:
کنترلر پیامها را ذخیره نمیکند؛ بلکه بهعنوان «مدیر مغز متفکر کلاستر» عمل میکند و وضعیت کلاستر را بهروز و منسجم نگه میدارد.
بروکرها همان نودهایی هستند که پیامها را ذخیره و مدیریت میکنند. هر بروکر ممکن است رهبر (Leader) یا پیرو (Follower) یک یا چند پارتیشن باشد. وظایف اصلی بروکر شامل:
بهطور خلاصه، کنترلر «هماهنگکننده کلاستر» و بروکر «میزبان و پردازشگر پیامها» است.
Topic در Kafka همان «کانال» پیام است. هنگام ارسال پیام، تولیدکننده آن را در یک Topic قرار میدهد و مصرفکنندگان نیز برای دریافت پیام، Topic موردنظر را دنبال میکنند. این مفهوم باعث میشود جریان اطلاعات به صورت ساختیافته سازماندهی شود.
برای مثال، سامانه ثبتنام کاربران ممکن است از Topicهایی مانند user-signup یا user-events استفاده کند.

هر Topic به چند پارتیشن تقسیم میشود. هر پارتیشن یک Log ترتیبی است که پیامها را به ترتیب وقوع ذخیره میکند.
پارتیشنها مهمترین نقش را در مقیاسپذیری Kafka دارند:
در نتیجه، پارتیشنها تعیین میکنند که Kafka تا چه اندازه میتواند موازی و مقیاسپذیر عمل کند.
در معماری جدید Kafka 4.x، قابلیت مهمی با عنوان Share Groups معرفی شده است. این قابلیت امکان استفاده از الگوی پردازش مبتنی بر Message Queue را فراهم میکند:
به این ترتیب، Kafka علاوه بر مدل Pub/Sub کلاسیک، یک مدل Queue کامل نیز ارائه میدهد.
مصرفکننده برنامهای است که پیامها را از یک Topic دریافت میکند. هر Consumer هنگام اتصال باید مشخص کند عضو کدام گروه مصرفکننده است تا Kafka بداند چه پیامهایی به او تخصیص دهد.
گروه مصرفکننده مجموعهای از Consumers است که با همکاری هم، پیامهای یک Topic را پردازش میکنند. هر Group یک نوع پردازش را نمایندگی میکند.
برای مثال، در جریان ثبتنام کاربر جدید، ممکن است چند پردازش متفاوت نیاز باشد:
هر کدام از این وظایف میتواند در قالب یک Consumer Group مستقل پیادهسازی شود. Kafka برای هر گروه، وضعیت خواندن پیامها (Offsets) را بهصورت جداگانه نگهداری میکند. این موضوع باعث میشود هر گروه بتواند مستقل از سایر گروهها پیامها را مصرف کرده، عقب بماند یا حتی دوباره پیامها را بازپخش کند.
Kafka پیامها را حتی پس از مصرف نیز نگه میدارد. سیاست نگهداری معمولاً بر اساس:
retention.ms)retention.bytes)تعریف میشود. این قابلیت امکان بازپخش، بازیابی و بررسی مجدد دادههای گذشته را فراهم میکند.
هر پارتیشن به چند فایل کوچکتر به نام Segment تقسیم میشود. این طراحی:
تولیدکننده میتواند تعیین کند پس از ارسال پیام، چه سطحی از تأیید دریافت کند:
acks=0 → بدون انتظار تأیید؛ سریع اما کماطمینانacks=1 → تأیید تنها از Leader پارتیشنacks=all → تأیید از تمامی Replicaهای هماهنگ (ISR)برای بارهای حساس، معمولاً acks=all توصیه میشود.
در شرایطی مانند قطع شبکه یا Retry، ممکن است تولیدکننده یک پیام را دوباره ارسال کند. با فعالسازی Idempotency:
| اصطلاح | توضیح |
|---|---|
| Controller | نودهای مدیریت متادیتا و هماهنگی کلاستر در KRaft |
| Broker | نودهای ذخیرهسازی پیام و مدیریت پارتیشنها |
| Topic | کانال منطقی پیامها |
| Partition | واحد مقیاسپذیری و پردازش موازی |
| Producer | ارسالکننده پیام |
| Consumer | دریافتکننده پیام |
| Consumer Group | گروهی برای پردازش مشترک یک نوع وظیفه |
| Share Group | مدل Queue جدید برای پردازش صفمانند |
| Offset | نشانگر موقعیت پیام در یک پارتیشن |
| Retention | سیاست نگهداری پیامها در زمان یا حجم |
| Segment | فایلهای کوچکتر تشکیلدهنده Log |
| Acks | تنظیم میزان تأیید موردانتظار از Kafka |
| Idempotency | جلوگیری از درج پیامهای تکراری هنگام Retry |