مهدی عادلی فر
بنیانگذار توسینسو و برنامه نویس

آشنایی با Exchange ها در RabbitMQ و سیستم تبادل پیام

در قسمت قبل در مورد اینکه سیستم انتقال پیام چیست و چگونه کار می‌کند صحبت کردیم. در این مطلب مطالب در مورد rabbitMQ را ادامه به توضیح Exchange ها می پردازیم.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

Exchangeها

پیام‌ها به صورت مستقیم به صف مورد نظر منتشر نمی‌شوند بلکه producer پیام‌ها را به یک exchange تحویل می دهد. وظیفه  exchange هدایت پیام‌ها به صف ها است.  Exchange این کار را با استفاده از کلید های مسیریابی و لینک هایی که با صف ها دارد انجام می‌دهد.
پروتکل انتقال پیام‌ها در سیستم‌هایی مانند RabbitMQ پروتکل AMQP است که مخفف Advanced Message Queuing Protocol می‌باشد.

جریان پیام‌ها در RabbitMQ

1. producer یک پیام را به یک  exchange می‌فرستد.
۲. exchange پیام را دریافت می‌کند و با توجه به کلید مسیریابی و خصوصیات پیام و binding هایی که دارد تصمیم می‌گیرد که پیام در کدام صف قرار بگیرد. دقت کنید که binding ها همان قوانینی هستند که  exchange از آن‌ها استفاده می‌کند تا به یک صف متصل شود.
3.پیام ها در داخل صف باقی می‌مانند تا وقتی که یک consumer بیاید و آن‌ها را از روی صف بردارد.
4. consume پیام‌ را از روی صف برداشته و شروع به پردازش می کند.
در تصویر زیر این مراحل را مشاهده می کنید.

آشنایی با Exchange ها در RabbitMQ و سیستم تبادل پیام

اینکه یک پیام به کدام صف هدایت شود را نوع exchange و binding مشخص می کند. در نسخه AMQP 0-9-1 انواع exchange ها 4 دسته هستند که عبارتند از

  • Direct exchange
  • Fanout exchange
  • Topic exchange
  • Headers exchange

هرکدام از انواع  exchange ها خصوصیاتی مانند نام و durability(اگر سیستم ریستارت exchange باقی بماند یا خیر) , auto-delete (وقتی که همه صف هایی که exchange استفاده می‌کرد تمام شوند exchange حذف شود یا خیر) نیز دارند. 

Exchange پیش‌فرض

یک  exchange از نوع direct است که هیچ اسمی ندارد و توسط سیستم ساخته شده است. خاصیتی که این  exchange دارد این است که در برنامه‌های ساده هر صفی که ساخته می‌شود به این  exchange اختصاص داده می‌شود و کلید مسیریابی آن نام همان صف است. یعنی اگر ما یک صف بسازیم به نام createPdf این صف به  exchange پیش‌فرض وصل شده و نام کلید مسیریابی آن createPdf خواهد بود. حال هرگاه خواستیم که پیامی به صف تولید pdf برود فقط کافی است که نام کلید آن را createPdf قرار دهیم.

Direct  exchange

یک exchange مسقتیم پیام‌ها را به صف هایی می‌رساند که دقیقاً مطابق با کلید مسیریابی پیام است. یعنی کلید را بررسی می‌کند و پیام را  صفی که آن کلید مربوط به آن است ارسال می کند. این نوع  exchange برای پیام‌های unicast که یک مقصد و صف دارند عالی است. هرچند که می‌توان با کمک آن پیام multicast هم ارسال کرد. از این نوع  exchange بیشتر برای توزیع task ها بین چند سیستم هم انجام می شود. تصویر زیر این exchange را نمایش می دهد.

آشنایی با Exchange ها در RabbitMQ و سیستم تبادل پیام

Fanout exchange

این نوع  exchange کاری به کلید مسیریابی ندارد و پیام‌ها را برای همه صف ها ارسال می کند. اگر تعداد N صف به یک Fanout exchange وصل شده باشند وقتی که یک پیام تولید می‌شود exchange یک کپی از پیام برای همه صف ها می فرستد. به همین خاطر این exchange برای ارسال پیام‌های broadcast بسیار مناسب است. تصویر این exchange در شکل زیر آمده  است.

آشنایی با Exchange ها در RabbitMQ و سیستم تبادل پیام

Topic Exchange

این Exchange پیام‌ها را به یک یا چند صف می‌فرستد. نحوه تصمیم گیری برای اینکه پیام را به کدام صف ارسال کند بستگی به کلید مسیریابی و همچنین الگویی است که صف را به Exchange متصل می کند. این نوع Exchange برای پیاده‌سازی الگوهای publish/subscribe مناسب است. همچنین این نوع Exchange برای مسیریابی های multicast پیام‌ها مناسب است. حالتی را تصور کنید که برای یک پیام چندین مصرف کننده وجود دارد که می‌توان انتخاب کرد که پیام را به کدام داد، برای این کار از این الگو استفاده می شود. 

Headers Exchange

این نوع Exchange با توجه به header پیام تصمیم می‌گیرد که پیام را در کدام صف قرار دهد. این Exchange توجه زیادی به کلید مسیریابی ندارد و بیشتر به اطلاعات header تمرکز دارد. این Exchange شبیه به Direct Exchange است با این تفاوت که به جای توجه کردن به کلید مسیریابی از اطلاعات header پیام استفاده می کند.
با وب سایت Tosinso همراه باشید.

نویسنده: مهدی عادلی فر

منبع: جزیره برنامه نویسی Tosinso.

هرگونه نشر و کپی برداری بدون ذکر منبع و نام نویسنده دارای اشکال اخلاقی می باشد.


مهدی عادلی فر
مهدی عادلی فر

بنیانگذار توسینسو و برنامه نویس

مهدی عادلی، بنیان گذار TOSINSO. کارشناس ارشد نرم افزار کامپیوتر از دانشگاه صنعتی امیرکبیر و #C و جاوا و اندروید کار می کنم. در زمینه های موبایل و وب و ویندوز فعالیت دارم و به طراحی نرم افزار و اصول مهندسی نرم افزار علاقه مندم.

نظرات