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

به طور معمول، queue ها از پروتکل های اختصاصی خود استفاده می کنند که پشتیبانی بین پلتفرمی و بین زبانی (cross-language) را ارائه نمی دهند. با گسترش روزافزون معماری های توزیع شده ونیاز به ارتباطات بین پلتفرمی و بین زبانی ، امروزه queue ها پروتکل‌های استاندارد میان پلتفرمی و زبانی را نیز پیاده‌سازی کرده اند. پروتکل‌های استانداردی که معمولاً برای این منظور استفاده می‌شوند عبارتند از پروتکل Advanced Message Queuing Protocol (AMQP) یک پروتکل متن‌باز پیام‌گرا است که از پیام‌های ناهمزمان پشتیبانی می کند علاوه براین صف‌بندی با قابلیت اطمینان بالا ، الگو publish-subscribe مبتنی بر موضوع، مسیریابی انعطاف‌پذیر، پیاده سازی تراکنش‌ها و امنیت ارتباط را فراهم می‌کند. AMQP قابلیت اطمینان، مقیاس پذیری و قابلیت همکاری را بین پلتفرم ها و ابزار های مختلف رافراهم می کند.پروتکل Simple/Streaming Text Oriented Messaging Protocol (STOMP) یک پروتکل ساده مبتنی بر متن است که برای انتقال داده ها بین برنامه های کاربردی توسعه یافته در زبان ها و پلتفرم های مختلف استفاده می شود. این پروتکل از مفهوم صف و موضوع (topic) استفاده نمی کند و پیام ها را با یک رشته متنی به مقصد ارسال می کند. این پروتکل زمانی قابل استفاده است که نیاز به یک برنامه ساده صف بندی پیام بدون نیاز به صف باشد.پروتکل Message Queuing Telemetry Transport (MQTT) این پروتکل الگو publish-subscribe را بدون استفاده از صف ارائه می‌کند. پیاده سازی جمع و جور و کم حجم آن را برای سیستم‌های تعبیه‌شده، برنامه‌های مبتنی بر اینترنت اشیا (IoT) مناسب می‌کند. به عنوان مثال، Broker های مبتنی بر MQTT می‌توانند هزاران اتصال همزمان از دستگاه های گوناگون را پشتیبانی کنند. MQTT برای ارسال پیام ها از یک بسته باینری فشرده (compact binary packet) استفاده می نماید که آن را برای برنامه‌هایی مانند به‌روزرسانی حسگرها، به‌روزرسانی‌های قیمت سهام، اعلان‌های موبایل و غیره مناسب می‌کند.ابزارهای message queuing زیادی توسط کمپانی ها و انجمن های متن باز ارائه شده اند که برخی از آنها عبارتند از :IBM MQ Java Message Service (JMS)، Apache ActiveMQ، Rabbit MQApache Kafka، Apache RocketMQ، Amazon Simple Queue Service، JBoss messagingمتداول ترین Broker هایی که امروزه برای ارتباطات ناهمزمان در معماری میکروسرویس استفاده می شوند Apache Kafka و Rabbit MQ می باشند .درادامه می خواهیم ارتباط ناهمزمان با استفاده از Rabbit MQ را بررسی نماییمارتباط ناهمزمان با Rabbit MQ Message Brokerواسطه‌های پیام به‌عنوان میان‌افزار بین میکروسرویس‌ها استفاده می‌شوند که در آن یک میکروسرویس می‌تواند پیام‌های خود را به یک کارگزار ارسال/تحویل (انتشار) کند، و سایر خدمات خرد که می‌توانند به کارگزار متصل شوند و پیام‌ها را دریافت یا مشترک شوند. هدف اصلی کارگزار پیام، ایجاد جدایی بین تولیدکننده پیام و مصرف کننده پیام است. بنابراین، با یک کارگزار، تولید کننده پیام از جنبه های مرتبط با ارتباطات رها می شود و روی کار اصلی تمرکز می کند.کارگزار مسئول انتقال مطمئن پیام به گیرنده است. سرویس پیام جاوا محبوب ترین API ناهمزمان جاوا است. اما محدودیت JMS این است که فقط از زبان جاوا پشتیبانی می کند و بنابراین برای برقراری ارتباط با برنامه های غیر جاوا ناکافی می شود. یکی دیگر از کارگزاران پیام محبوب و سنتی RabbitMQ است. RabbitMQ توسط Rabbit Technologies Ltd توسعه یافته است که توسط SpringSource، بخشی از VMware خریداری شده است.پروژه RabbitMQ به بخشی از نرم افزار Pivotal تبدیل شد و در سال 2013 منتشر شد. هدف اولیه RabbitMQ ارائه یک واسطه پیام قابل همکاری بود. پشتیبانی از سیستم های چند زبانه و متقابل را فراهم می کند. برخلاف صف‌های پیام قبلی، مانند صف IBM یا JMS یا صف پیام مایکروسافت، RabbitMQ یک واسطه پیام متن‌باز، بی‌طرف و بی‌طرف به زبان است. RabbitMQ در Erlang توسعه یافته است. RabbitMQ روی بسیاری از سیستم عامل ها و در محیط های ابری اجرا می شود. طیف گسترده ای از ابزارهای توسعه دهنده را برای اکثر زبان های محبوب فراهم می کندکارگزار RabbitMQ اولین کارگزاری بود که پروتکل AMQP را پیاده سازی کرد.پروتکل AMQP شامل دو جنبه هست :مجموعه ای از قابلیت های پیام رسانی (درسطح برنامه و در سطح سرویس سرور) که به نام مدل AMQ شناخته می شوند. مدل AMQ شامل مجموعه‌ای از مؤلفه‌ها است که پیام‌ها را در یک سرور هدایت و ذخیره می‌کند و همچنین مجموعه‌ای از قوانینی که ارتباط معنا دار این مؤلفه‌ها با یکدیگر را فراهم می کند. دقیقاً، این بخش از پروتکل، معماری سطح بالاتری را برای کارگزاران پیام ارائه می دهد. یک پروتکل در سطح شبکه به نام AMQP که کلاینت با استفاده از آن می تواند با کارگزار پیام تعامل داشته باشدمدل AMQاجزای اصلی مدل AMQ عبارتند از پیام ها (Messages)پیام یک بسته اطلاعاتی است که از دو بخش، هدر (header) و بدنه تشکیل شده است. تولیدکنندگان پیام (Message producers)تولیدکنندگان پیام برنامه‌هایی هستند که پیام‌ها را ایجاد کرده و به کارگزار ارسال می‌کنند. یک تولیدکننده پیام پیام‌های خود را همراه با کلید مسیریابی (routing key) منتشر می‌کند، که این کلید جهت مسیریابی مصرف کننده پیام توسط مؤلفه تبادل (exchange) استفاده می‌شود. کلید مسیریابی یکی از اجزا پیام است. درواقع کلید مسیریابی یک آدرس مجازی به مؤلفه تبادل (exchange) می دهد که توسط آن پیام را به سمت مصرف کننده صحیح هدایت کند مصرف کنندگان پیام (Message consumers)برنامه هایی هستند که به صف (queue ) موجود در کارگزار متصل می شوند و پیام های خود را دریافت می کنند. کارگزاران/سرورهای پیام (Message Brokers/Servers)پیام‌های منتشر شده توسط تولیدکننده پیام را بصورت ناهمزمان در اختیار مصرف‌کنندگان مورد نظر قرارمی دهند. کارگزار دو جزء کلیدی داردمولفه Exchange مولفه تبادل (Exchange) مسیریابی پیام ها را انجام می دهد.در واقع پیام ها در Exchange های داخل کارگزار منتشر می شوند. سپس Exchange کپی‌هایی از آن پیام‌ها را طبق قوانین خاص که bindings نام دارند و توسط توسعه‌دهنده تعریف‌شده در صف‌ها توزیع می‌کند. Binding یک رابطه بین یک Exchange و یک صف است. هر صف با یک Exchange از طریق یک binding key یکتا مرتبط می شوند. (دقت کنید binding key ربطی به routing key ندارد)مولفه Queue موجودیتی که پیام ها را در حافظه یا روی دیسک (که توسط Exchange مسیریابی شده اند) ذخیره می کند و آنها را به یک یا چند مصرف کننده تحویل می دهد صف نامیده می شود . صف ها اجزای دو طرفه هستند. سمت ورودی یک صف پیام ها را از یک یا چند Exchange دریافت می کند و سمت خروجی صف به یک یا چند مصرف کننده پیام متصل است. هر پیام تا زمانی که توسط مصرف کننده پیام دریافت شود در صف ذخیره می ماند.صف دارای ویژگی‌های مختلفی مانند خصوصی/اشتراکی (private/shared)، بادوام/موقت (durable/temporary)، و غیره است. این ویژگی‌ها برای پیاده‌سازی یک صف با ویژگی‌های عملکردی متفاوت مفید هستند. به عنوان مثال، یک صف خصوصی برای رساندن پیام به یک مصرف کننده خاص یا منفرد است، در حالی که یک صف اشتراکی پیام را به چند مصرف کننده تحویل می دهد. مدل AMQ