مدل های Communication در معماری میکروسرویس (قسمت سوم)

در ادامه مباحث می خواهیم انواع Exchange ها را در RabbitMQ بررسی نماییم.یک تولیدکننده پیام پیامی را برای یک Exchange با نام مشخص ارسال می‌کند و مصرف‌کننده مرتبط ،پیام را از صفی که به Exchange متصل است اخذ می کند. در اینجا به این نکته توجه کنید که مصرف کننده باید یک صف ایجاد کند و آن را به Exchange مورد نیاز متصل کند (البته اگر سرور کارگزار اگر در سازمان تولید کننده پیام هاست شده باشد احتمالا اینکار را ادمین آن سازمان برای مصرف کنندگان پیام انجام می دهند) همچنین بدانید که مصرف کننده باید نام Exchange موردنظر (که عموما بصورت توافقی تعیین می شود)را بداند، فقط در این صورت است که مصرف کننده می تواند صف خود را با Exchange نامگذاری شده پیوند دهد.اینجا سناریو های مختلفی مثل ارتباط چندین Exchange با یک صف، یا ارتباط چندین صف با یک Exchange یا ارتباط یک به یک بین هر صف و هر Exchange ،بسته به نوع مسئله امکان ایجاد دارد.

حال یک سوال پیش می آید توزیع پیام چگونه اتفاق می افتد؟ پاسخ : این با توجه به نوع Exchange است. با توجه به نوع Exchange ، Exchange پیام را به صف مربوطه هدایت می کند. با توجه به نحوه اتصال صف ها به Exchange ، نحوه binding یک Exchange و ویژگی های پیام مانند routing key و مقادیر header انواع مختلفی از Exchange وجود دارد که عبارتند از :

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

یکم : مستقیم (Direct exchange)

تبادل مستقیم (Direct exchange) پیام را با تطبیق کلید مسیریابی با نام صف هدایت می کند. همانطور که در شکل ذیل مشخص شده کلید مسیریابی که مقدار 'Queue-1' را نگه می دارد با نام صف ('Queue-1') مطابقت داده می شود و پیام به صف مورد نظر منتقل می شود. این نوع exchange پیام را با مکانیزم ارتباطی نقطه به نقطه (point-to-point) هدایت می کند. نکته در این نوع مبادله، کاراکترهای wildcard مانند '*' یا '#' در مقدار کلید و نام صف پشتیبانی نمی شوند.

Direct exchange
Direct exchange


دوم : Fan out exchange

در تبادل fan out، پیام کپی شده و به تمام صف های متصل به این exchange ارسال می شود. در این تبادل، کلید مسیریابی نادیده گرفته می شود. هنگامی که یک پیام جدید در یک fan out exchange منتشر می شود، پیام به تمام صف هایی که با exchange مرتبط (bound) شده اند ارسال می شود. این exchange برای پخش پیام به همه مصرف کنندگان مرتبط و یا به عبارت دیگر برای broadcasting مناسب است

Fan out exchange
Fan out exchange


سوم : Topic exchange

در این نوع مبادله ، با تطبیق کلید مسیریابی با binding key ها (که مبتنی بر الگوهای ارائه شده با استفاده از کاراکترهای wildcard ایجاد شده اند)، صف های مورد نظر شناسایی شده و پیام به این صف ها هدایت می شود. این تبادل اساساً الگوی پیام انتشار-اشتراک (publish-subscribe) ارائه می دهد . دراین الگو ناشران (تولیدکنندگان پیام) پیام های خود را در کلاس های مختلف کانال های منطقی (موجودیت فیزیکی نیست وصرفا دسته بندی منطقی است ) به نام topics دسته بندی می کنند .نکته اینکه برای این دسته بندی نیازی به اطلاع مشترکین (مصرف کنندگان پیام) نیست . برای واضح تر شدن موضوع یک سناریو منطبق بر شکل زیر را بررسی می کنیم .ابتدا پیامی با یک کلید مسیریابی منتشر می‌شود که حاوی مجموعه‌ای از کلمات است که با یک نقطه از هم جدا شده‌اند، مثلاً فرض کنید کلید مسیریابی «word1.word2.word3» است. صف‌هایی که به exchange از نوع Topic متصل می‌شوند، الگویی را به سرور ارائه می‌کنند تا در هنگام مسیریابی پیام از آن استفاده شود. الگوها ممکن است دارای یک ستاره '*' برای مطابقت با یک کلمه در موقعیت خاص کلید مسیریابی، یا یک هش '#' برای مطابقت با صفر یا چند کلمه باشند.(مانند تفسیر الگوهایی که در regular expression استفاده می شود) . از آنجایی که کلیدهای binding در Queue-1، Queue-2، Queue-3 و Queue-5 با کلید مسیریابی مطابقت پیدا کردند، پیام به این صف ها ارسال می شود، این در حالی است که هیچ انطباقی بین کلید مسیریابی و الگوی کلید binding در Queue4 و Queue6وجود ندارد. . بنابراین، پیام به Queue-4 و Queue-6 ارسال نمی شود.

Topic  exchange
Topic exchange


چهارم : Headers exchange

در تبادل Headers، به جای تطبیق یک کلید مسیریابی با یک کلید binding، یک یا چند Header پیام با Header های مشخص شده توسط صف ها مطابقت داده می شود.در topic exchange، تنها یک معیار برای ارتباط وجود دارد و آن تطابق کلید مسیریابی با کلید binding است اما در تبادل Header ، بیش از یک معیار دخیل هست که بصورت جفت های کلید-مقدار ( key-value pairs ) در Header پیام مشخص می شود و با جفت های کلید-مقدار متناظر در صف تطبیق داده می شود.

در این نوع exchange، هر صف متصل شده به exchange مشخص می کند که آیا همه جفت های کلید-مقدار تنظیم شده در صف باید با جفت های کلید-مقدار Header پیام مطابقت داشته باشند (از طریق تنظیم گزینه تطبیق 'همه') یا اینکه هر یک از جفت های کلید-مقدار که مطابقت داشت پیام دریافت شود. (از طریق تنظیم با گزینه 'هر'). مشخا توضیح این مفهوم گیج کننده است پس بیایید با یک مثال سناریو توزیع پیام در این نوع exchange را بررسی کنیم. همانطور که در شکل ذیل آمده است فرض کنید Header پیام از سه جفت کلید-مقدار تشکیل شده است که شامل این مقادیر می باشد {“key1=”value1”، “key2”=value2”، “key3”=”value3”} ، همچنین سه صف به نام های Queue-1، Queue-2 و Queue-3 وجود دارد.Queue-1 مشخص می کند که پیام دریافتی از exchange باید با تمام مقادیر جفت های کلید-مقدار مشخص شده مطابقت داشته باشد. دو جفت کلید-مقدار در این صف وجود دارد که عبارتند از {'Key1'='value1,' 'Key3'='value3'} ، از آنجایی که این دو جفت در Header پیام هستند، exchange پیام را به Queue-1 ارسال می کند. برای Queue-2 نیز همه جفت های کلید-مقدار باید با Header پیام مطابقت داشته باشند، اما چون Header پیام حاوی جفت کلید-مقدار 'Key5'=value5' نیست، پیام به Queue-2 ارسال نمی شود. در مورد Queue-3، صف یک تطابق را برای هر یک از جفت‌های کلید-مقدار با جفت‌های کلید-مقدار موجود در Header پیام را کافی می داند (با تنظیم "any"-"match") از آنجایی که دو تطبیق به ازای 'Key1' و 'Key2' وجود دارد، پیام به Queue-3 ارسال می شود.

Headers exchange
Headers exchange