چندوقتی هست که درگیر یادگیری RabbitMQ هستم که از پروتکل های مختلفی پشتیبانی میکنه و خب یکی از اونا MQTT هست.
شاید سوال این باشه که RabbitMQ چیه؟
یک مسیج بروکر به حساب میاد! ایده ی مسیج بروکر ها اینه که به عنوان یک واسطه بین سرویس های مختلف
پیام هارو بین سرویس ها منتقل کنن. با این وجود سرویس A که با پایتون نوشته شده میتونه با سرویس B که با Nodejs نوشته شده بدون مشکل حرف بزنه.
فرض کن یک سنسور دماسنج هر چندوقت یکبار باید دمای محیط رو بفرسته به یک یا چند سرویس. شاید تو نگاه اول پروتکل هایی مثل HTTP یا WebSocket بیاد تو ذهنت که واقعیت امر اینه خیلی بکار نمیان! چون سربار زیادی دارن و خب برای یک سنسور که از نظر سخت افزاری محدوده خیلی بهینه نیست. یا حتی موبایل ها رو درنظر بگیر که بحث مصرف باتری توشون هم مهمه. ایده ساخت پروتکل MQTT ازجایی شروع شد که میخواستن دیتای سنسورِ لوله های نفت رو مانیتور کنن و مشکل این بود که سنسور ها هم از نظر سخت افزاری محدود بودن و هم از نظر پهنای باند و مصرف باتری.
پروتکل MQTT از پترن publish/subscribe پیروی میکنه. مسیج بروکر این وسط نقش یک واسطه رو بین فرستنده و گیرنده داره. مفهوم تاپیک (topic) تو این پروتکل باعث میشه فرستنده ها به پیام هایی که میفرستن مسیر بدن. با این وجود وقتی یک فرستنده تو یک تاپیک خاص یک پیام ارسال میکنه بروکر اونو به گیرنده های مربوط به اون تاپیک میرسونه. بریم سراغ تخته سیاهمون :)
البته این پروتکل یک ارتباط bi-directional رو فراهم میکنه که این یعنی گیرنده ها هم میتونن فرستنده باشن و به تاپیک های مختلف پیام منتشر کنن. همچنین این معماری باعث شده فرستنده ها و گیرنده ها از هم مستقل باشن و بدون اینکه از هم چیزی بدونن با هم در ارتباط باشن که به لطف بروکر عزیزمونه :)
حالا اگه به یک تاپیک که هیچ گیرنده ای نداره یک پیام ارسال کنیم چه اتفاقی میوفته؟ درحالت عادی از بین میره ولی راه هایی هم هست که بشه پیام رو حفظ کرد. در نتیجه تا زمانی که گیرنده ای نیست پیام ها میرن تو یک صف و به محض اینکه یکی اون تاپیک رو دونبال کنه بروکر پیام هارو بهش میفرسته.
بیاین یکم درباره ی QoS یا Quality of Service حرف بزنیم. در واقع سه لول اصلی داریم که مشخص میکنه پیام چطوری به سابسکرایبر ها برسه.
توی لول ۰ فرستنده ها انتظار تایید ندارن و این یعنی مهم نیست پیام به گیرنده رسیده باشه یا نه! پیام یکبار فرستاده میشه و از بین میره.
تو این لول تمرکز اصلی اینه که پیام حداقل یکبار تحویل داده شده باشه. وقتی فرستنده پیامی رو ارسال میکنه یک کپی رو پیش خودش نگه میداره و منتظر میمونه یک پَکِت PUBACK دریافت کنه درغیر این صورت پیام دوباره فرستاده میشه.
حالا چرا حداقل یکبار؟ فرض کن فرستنده وقتی پیام رو ارسال میکنه از دسترس خارج میشه! در نتیجه با اینکه گیرنده پیام رو گرفته، فرستنده پکت PUBACK رو دریافت نکرده و وقتی دوباره میاد تو شبکه سعی میکنه دوباره پیامش رو بفرسته.
لول ۲ بالاترین لول به حساب میاد و تضمین میکنه هر پیام از فرستنده دقیقا یکبار به گیرنده رسیده باشه. تو قدم اول فرستنده یک پیام ارسال میکنه و صبر میکنه یک پکت PUBREC از گیرنده دریافت کنه. وقتی گیرنده پکت PUBREC رو میفرسته منتظر میمونه فرستنده یک پکت PUBREL برگردونه. وقتی فرستنده پکت PUBREL رو به گیرنده ارسال کرد دیگه پیام مطمعنن ارسال شده و درنهایت گیرنده یک پکت PUBCOMP میفرسته و تموم!
شاید تصور خیلی ها از RabbitMQ صرفا یک صف باشه ولی خب همونطور که دیدیم یک مسیج بروکر هست و از پروتکل های مختلفی پشتیبانی میکنه. میتونین از این لینک درباره ی بقیه ی پروتکل ها مطالعه کنین.
موفق باشین!