ظهر بخیر، هابر! من می خواهم یک کتاب مرجع کتاب دانش را که موفق به جمع آوری آن شده ام به اشتراک بگذارم RabbitMQ و در توصیه ها و نتیجه گیری های کوتاه خلاصه می شود.
فهرست مندرجات
RabbitMQ. بخش 1. مقدمه. Erlang، AMQP و RPC
RabbitMQ. بخش 2. درک مبادلات
RabbitMQ. قسمت 3. درک صف ها و اتصالات
RabbitMQ. قسمت 4. درک پیام ها و فریم ها
RabbitMQ. قسمت 5: انتشار پیام و عملکرد مصرف
RabbitMQ. بخش 6. بررسی ماژول های فدراسیون و بیل
RabbitMQ. قسمت 7. جزئیات در مورد Connection و Chanel
RabbitMQ. قسمت 8. RabbitMQ در دات نت
RabbitMQ. بخش 9. نظارت
مختصری در مورد AMQP
AMQP (پروتکل صف پیشرفته پیام) یک پروتکل باز برای انتقال پیام بین اجزای سیستم است. ایده اصلی این است که زیرسیستم های جداگانه (یا برنامه های کاربردی مستقل) می توانند پیام ها را به شیوه ای دلخواه از طریق یک کارگزار AMQP مبادله کنند، که مسیریابی را انجام می دهد، احتمالاً تحویل را تضمین می کند، جریان های داده را توزیع می کند و در انواع پیام های مورد نظر مشترک می شود.
پروتکل AMQP سه مفهوم را معرفی می کند:
exchange (نقطه مبادله یا مبادله) - پیام ها به آن ارسال می شود. نقطه مبادله پیام را توزیع می کند در یک یا چند صف او پیام ها را به یک صف هدایت می کند بر اساس اتصالات ایجاد شده (binding) بین او و صف
queue (صف) - یک ساختار داده روی دیسک یا در RAM که پیوندهای پیام ها را ذخیره می کند و کپی هایی از پیام ها را می دهد consumers (به مصرف کنندگان)
binding (الزام آور) - قاعده ای که به نقطه تبادل می گوید که این پیام ها باید در کدام صف قرار گیرند
Erlang توسط این شرکت توسعه یافته است Ericsson در اواسط دهه 1980 به عنوان یک سیستم بلادرنگ توزیع شده، با تحمل خطا، برای برنامه هایی که نیاز به 99,999% آپتایم دارند. Erlang مورد استفاده در صنایع مختلف و کاربردهای مدرن، به عنوان مثال. WhatsApp. ادامه مطلب را می توانید در مقاله بخوانید معماری واتس اپ که فیسبوک آن را به قیمت ۱۹ میلیارد دلار خرید
مختصری در مورد RabbitMQ
خرگوش ام کیو یک کارگزار پیام منبع باز است. این پیام ها را در امتداد تمام اصول اولیه پروتکل هدایت می کند AMQP شرح داده شده در مشخصات فنی. RabbitMQ پروتکل را پیاده سازی و تکمیل می کند AMQP.
ایده اصلی مدل پیام رسانی در RabbitMQ چیز این است producer (ناشر) پیامی را مستقیماً به صف ارسال نمی کند. در واقع، و اغلب، ناشر حتی نمیداند که آیا پیام اصلاً به هر صفی تحویل داده میشود یا خیر.
درعوض، ناشر فقط می تواند به صرافی پیام ارسال کند. صرافی از یک سو پیام های ناشران را دریافت می کند و از سوی دیگر آنها را به صف می فرستد. صرافی باید دقیقا بداند که با پیامی که دریافت می کند چه کند. آیا باید به یک صف خاص اضافه شود؟ آیا باید به چند صف اضافه شود؟ یا پیام باید نادیده گرفته شود.
کار مختصر RabbitMQ را می توان به صورت زیر توصیف کرد:
ناشر پیامی را به یک صرافی خاص ارسال می کند
یک مبادله با دریافت پیام، آن را به یک یا چند صف مطابق با قوانین الزام آور بین خود و صف هدایت می کند.
صف یک ارجاع به این پیام را ذخیره می کند. پیام خود در RAM یا روی دیسک ذخیره می شود
هنگامی که مصرف کننده برای دریافت پیام از صف آماده شد، سرور یک کپی از پیام را از طریق پیوند ایجاد کرده و ارسال می کند.
مصرف کننده پیام را دریافت کرده و تاییدیه را برای کارگزار ارسال می کند
کارگزار پس از دریافت تاییدیه، یک کپی از پیام را از صف حذف می کند. سپس از رم و دیسک پاک می شود
RPC
روند RPC (تماس رویه از راه دور) تقریباً زیربنای تمام فعل و انفعالات با هسته است RabbitMQ. به عنوان مثال، بحث های اولیه در مورد شرایط مشتری با RabbitMQ، روند خاصی را نشان می دهد RPC. وقتی این دنباله کامل شد، RabbitMQ آماده پذیرش درخواست های مشتری خواهد بود:
همچنین در مشخصات AMQP هم کلاینت و هم سرور می توانند دستورات را صادر کنند. این بدان معنی است که مشتری منتظر ارتباط با سرور است. دستورات کلاس ها و متدها هستند. مثلا، Connection.Start - فراخوانی روش Start کلاس Connection.
اتصال و کانال ها
برای چنین تبادل اطلاعات بین مشتری و سرور، کانال. کانال ها در داخل ایجاد می شوند اتصال خاص. هر کانال از کانال های دیگر جدا شده است. در حالت همزمان، تا زمانی که پاسخی دریافت نشود، امکان اجرای دستور بعدی وجود ندارد.
برای اینکه بتوانید دستورات را به صورت موازی ارسال کنید، باید چندین کانال را باز کنید. هر کانال یک کانال جداگانه ایجاد می کند Erlang روند. یک اتصال می تواند چندین کانال داشته باشد (مالتی پلکسینگ). برای هر کانال ساختارها و اشیاء خاصی در حافظه وجود دارد. بنابراین، هر چه تعداد کانالها در یک اتصال بیشتر باشد، RabbitMQ از حافظه بیشتری استفاده می کند برای مدیریت چنین ارتباطی
یک مثال ساده از ایجاد یک اتصال و کانال با استفاده از RabbitMQ.Client:
// ...
private void TryConnect()
{
var factory = new ConnectionFactory()
{
HostName = "host_name",
UserName = "user_name",
Password = "p@ssword",
// Включение автоматичекого восстановления
// соединения после сбоев сети
AutomaticRecoveryEnabled = true
};
_connection = factory.CreateConnection();
}
// ...
public void CreateChanel()
{
_channel = _connection.CreateModel();
// other options
}
باز کردن یک اتصال جدید برای هر عملیات به شدت ممنوع است منجر به هزینه های بالایی خواهد شد. کانالها نیز باید پایدار باشند، اما بسیاری از خطاهای پروتکل باعث بسته شدن کانال میشوند، بنابراین طول عمر کانال ممکن است کوتاهتر از عمر اتصال باشد.
RabbitMQ کجا استفاده می شود؟
در زمینه میکروسرویس ها، پروتکل AMQP و اجرای آن در RabbitMQ اغلب برای استفاده می شود تعامل ناهمزمان بین خدمات
در زمینه IIOT پروتکل AMQP و اجرای آن در RabbitMQ برای تبادل داده بین سرورها (سرور-سرور) استفاده می شود. همچنین از افزونه استفاده کنید پلاگین MQTT RabbitMQ که اجرای پروتکل است MQTT برای انتقال داده ها بین سنسور و سرور در محیط های کم سرعت و با تأخیر بالا (لیست کامل پروتکل های پشتیبانی شده در وب سایت پروژه).
در مقاله بعدی با جزئیات بیشتر به درک مبادلات خواهیم پرداخت.