در جلسهی قبل، هنگام تنظیم فایل Docker Compose دیدیم که چند پارامتر با نامهایKAFKA_LISTENERS و KAFKA_ADVERTISED_LISTENERS وجود داشتند.
در ظاهر شبیه هماند، اما در عمل نقشهای متفاوتی دارند.
در این بخش میخواهیم دقیقتر ببینیم Listener در کافکا چیست، چرا چند نوع Listener داریم، و این برچسبهایی مثل EXTERNAL یا INTERNAL چه مفهومی دارند.
هر Listener در Kafka از سه بخش اصلی تشکیل شده است:
| مؤلفه | مثال | نقش |
|---|---|---|
| ۱️⃣ برچسب (Listener Name / Tag) | BROKER, INTERNAL, EXTERNAL, CONTROLLER | برای شناسایی و تمایز نوع listener (مثلاً برای ارتباط داخلی، بیرونی، یا کنترلر) |
| ۲️⃣ آدرس (Host/IP) | kafka, localhost, broker-3, ۰.۰.۰.۰ | مشخص میکند Kafka روی چه آدرسی در شبکه گوش بدهد یا خودش را به دیگران معرفی کند |
| ۳️⃣ پورت (Port) | ۹۰۹۲, ۱۹۰۹۲, ۴۹۰۹۲ | پورتی که ارتباطها روی آن برقرار میشود |
Kafka تمام تنظیمات Listener را بر اساس این سه مؤلفه میسازد.
مثلاً در مقدار زیر:
KAFKA_CFG_ADVERTISED_LISTENERS: 'INTERNAL://broker-3:19092,EXTERNAL://localhost:49092'
هر قسمت از این رشته شامل همین سه مؤلفه است:
| برچسب | آدرس (host) | پورت | توضیح |
|---|---|---|---|
| INTERNAL | broker-3 | ۱۹۰۹۲ | برای ارتباط داخلی بین بروکرها در شبکه Docker |
| EXTERNAL | localhost | ۴۹۰۹۲ | برای ارتباط از بیرون (مثلاً برنامهای که روی سیستم شما اجرا میشود) |
برچسبها کلید اصلی درک Listenerها هستند.
Kafka از این نامها برای ارجاع به listenerهای خاص در تنظیمات مختلف استفاده میکند.
مثلاً:
KAFKA_CFG_INTER_BROKER_LISTENER_NAME: INTERNAL
یعنی Kafka برای ارتباط بین بروکرها باید از listener با برچسب INTERNAL استفاده کند.
یا:
KAFKA_CFG_CONTROLLER_LISTENER_NAMES: CONTROLLER
یعنی در نقش کنترلر، ارتباطات KRaft از لیستنری با برچسب CONTROLLER برقرار شود.
بنابراین برچسبها فقط برای خوانایی نیستند؛ بلکه Kafka با آنها میفهمد کدام Listener برای کدام هدف استفاده شود.
این همان بخشی است که گاهی باعث گیج شدن در Docker یا محیطهای چندنودی میشود.
| نوع آدرس | مثال | توضیح |
|---|---|---|
| نام هاست داخلی | kafka, broker-3 | معمولاً برای ارتباطات درون شبکه Docker یا کلاستر استفاده میشود. |
| آدرس عمومی یا لوکالهاست | localhost | برای ارتباط از سیستم توسعهدهنده به Kafka داخل Docker. |
| آدرس عمومی شبکه | ۱۹۲.۱۶۸.x.x یا DNS واقعی | وقتی Kafka در یک سرور واقعی یا Kubernetes اجرا میشود و باید برای دنیای بیرون قابل دسترس باشد. |
🔸 نکته:
در Docker، معمولاً Kafka خودش را با نام سرویس Docker Compose (مثلاً kafka) تبلیغ میکند، چون دیگر سرویسها (مثل Kafka UI یا Schema Registry) با همان نام در شبکه Docker آن را پیدا میکنند.
هر listener معمولاً پورت جداگانهای دارد تا ارتباطات از هم تفکیک شوند:
| برچسب | پورت پیشنهادی | نقش |
|---|---|---|
| CONTROLLER | ۹۰۹۳ | ارتباط KRaft Controller |
| BROKER / INTERNAL | ۹۰۹۲ یا ۱۹۰۹۲ | ارتباط بین بروکرها یا ابزارهای داخلی |
| EXTERNAL | ۹۰۹۴ یا ۴۹۰۹۲ | دسترسی از خارج (IDE، اپلیکیشن، یا کلاینت) |
Kafka از این پورتها برای تنظیم دقیق مسیر ارتباطات استفاده میکند.
مثلاً اگر UI و producer هر دو داخل Docker باشند، بهتر است از INTERNAL://broker-3:19092 استفاده کنند تا از مسیر داخلی شبکه Docker عبور کنند — نه از پورت خارجی که برای اتصال از لپتاپ باز شده است.
بیایید همین تنظیم زیر را خطبهخط تجزیه کنیم:
KAFKA_LISTENERS: 'INTERNAL://:19092,EXTERNAL://:9092'
KAFKA_ADVERTISED_LISTENERS: 'INTERNAL://broker-3:19092,EXTERNAL://localhost:49092'
KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT,CONTROLLER:PLAINTEXT
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
KAFKA_LISTENERSKafka روی چه پورتهایی گوش میدهد:
INTERNAL://:19092 → داخل container روی پورت ۱۹۰۹۲EXTERNAL://:9092 → داخل container روی پورت ۹۰۹۲KAFKA_ADVERTISED_LISTENERSKafka به کلاینتها اعلام میکند از چه آدرسی به او وصل شوند:
INTERNAL://broker-3:19092 → برای ارتباطات داخلی درون شبکه DockerEXTERNAL://localhost:49092 → برای برنامههای خارج از Docker (روی سیستم توسعهدهنده)KAFKA_INTER_BROKER_LISTENER_NAME: INTERNALKafka برای ارتباط بین بروکرها از Listener با برچسب INTERNAL استفاده کند.
KAFKA_LISTENER_SECURITY_PROTOCOL_MAPهر listener با چه پروتکلی کار میکند:
INTERNAL:PLAINTEXT, EXTERNAL:PLAINTEXT, CONTROLLER:PLAINTEXT
(میتوان در محیط واقعی بعضی از آنها را با SSL یا SASL امن کرد)
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLERیعنی listener با برچسب CONTROLLER برای ارتباطات مدیریتی KRaft استفاده شود.
Kafka فقط با Producer و Consumer حرف نمیزند.
در واقع چند نوع ارتباط همزمان درون سیستم اتفاق میافتد:
| نوع ارتباط | توضیح |
|---|---|
| Client ↔ Broker | وقتی برنامهها پیام میفرستند یا میخوانند. |
| Broker ↔ Broker | برای هماهنگی بین نودها و Replication دادهها. |
| Controller ↔ Broker | برای هماهنگی متادیتا در حالت KRaft. |
| Host ↔ Broker | زمانی که برنامهها روی سیستم شما هستند و Kafka در Docker است. |
| مفهوم | توضیح |
|---|---|
| Listener | پورتی که Kafka واقعاً روی آن گوش میدهد و به درخواستها پاسخ می دهد. |
| Advertised Listener | آدرسی که Kafka به کلاینتها اعلام میکند تا به آن وصل شوند. |
| Label (برچسب) | نامی برای شناسایی نوع ارتباط (داخلی، بیرونی، کنترلر و غیره). |
| Host | IP یا نام میزبان که در شبکه استفاده میشود (مثلاً localhost یا broker-1). |
| Port | شماره پورتی که هر listener روی آن در دسترس است. |