امروز درگیر یادگیری کافکا شدم و قصد داشتم یه پروژه تستی رو باهاش بیارم بالا. طبق عادت، زوکیپر و کافکا رو با داکر آوردم بالا و شروع کردم به کد زدن با kafkajs. ولی هرکاری میکردم وصل نمیشد!
ظاهرا کار خیلی ساده باید پیش میرفت. هرچیم سرچ میکردم یسری خط کد نوشته بودن که اینارو کپی پیست کن درست میشه و فلان! منم تا نفهمم مشکل کار از کجاست راه حل رو اجرا نمیکنم?
ارور این بود:
{"level":"ERROR","timestamp":"2020-09-13T12:46:25.123Z","logger":"kafkajs","message":"[Connection] Connection error: getaddrinfo EAI_AGAIN 3f8ce0d39217 3f8ce0d39217:9092","broker":"3f8ce0d39217:9092","clientId":"my-app","stack":"Error: getaddrinfo EAI_AGAIN 3f8ce0d39217 3f8ce0d39217:9092\n at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:56:26)"}
اما مشکل از کجاست؟ مشکل خیلیا اینه که نمیدونیم که برای اتصال به کافکا، تماس اولیه زیاد مهم نیست! تماس دوم که بر اساس متادیتای دریافتی برقرار میشه مهمه!
یعنی چی؟ یعنی اینکه در اول کار:
const { Kafka } = require('kafkajs') const kafka = new Kafka({ clientId: 'my-app', brokers: ['localhost:9092'] });
یه اتصال با بروکر برقرار میشه و لیستی از بروکرهای اون کلاستر تحویل میگیره و از اون به بعد با اونا صحبت میکنه! برای دولوپ هم که نمیشه ما پروژمونو توی داکر دولوپ کنیم! پس باید چیکار کنیم؟ باید به کافکا بگیم که advertised.listeners رو آیپی ماشین لوکال ما معرفی کن بهجای آدرس لوکال خودت که توی نتورک داکر در دسترسه!
خوب برای اینکار باید این تنظیمات رو توی کافکا انجام بدین:
advertised.listeners=PLAINTEXT://${HOST_IP}:9092 listeners=PLAINTEXT://0.0.0.0:9092
داخل پرانتز:
(میتونین دستی آیپیتونو بزنین که کثیف کاریه یا میتونین آیپی رو به صورت environment بدین بهش.)
یا مثل من توی داکر کامپوز این Environment رو وارد کنین:
environment: ... - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.133:9092 ...
همین! تموم شد! به همین سادگی! امیدوارم شما مثل من گیر نکنین اینجا!
نمونه کد اتصال رو هم میتونین از اینجا ببینین. کافکای داکرایز شدهی منم نسخهی بیتنامی بود که میتونین از اینجا دریافت کنین.