معرفی RabbitMQ: بخش چهارم، آشنایی با رابط مدیریت تحت وب

فهرست بخش های این آموزش:

در این بخش یاد می گیریم که چطور از طریق پنل مدیریت تحت وب RabbitMQ، صف ها، Connection ها، Channel ها، Exchange ها و User ها را مدیریت کنیم. علاوه بر آن، می توانیم نرخ ارسال و دریافت پیام ها را مانیتور کنیم؛ یا به طور دستی پیامی را به یک Exchange یا Queue خاص ارسال کنیم.

این رابط کاربری یک پلاگین است که در پشت صحنه به وسیله HTTP API با RabbitMQ ارتباط برقرار می کند و به طور پیش فرض بر روی RabbitMQ نصب شده است و پس از نصب RabbitMQ می توانیم آن را فعال کنیم(در بخش اول یاد گرفتیم که چطور RabbitMQ را نصب کنیم و پلاگین Management را فعال کنیم ). از این رابط مدیریت می توان برای عیب یابی سیستم هم استفاده کرد.

در این بخش با همه ی تب های این رابط مدیریت آشنا خواهیم شد. سپس با یک مثال خواهیم دید که چطور یک Queue و Exchange و Binding بین آن ها را نصب و کانفیگ کنیم.

مفاهیم:

  • مفهوم Cluster: یک Cluster شامل تعدادی Node از کامپیوتر هایی است که با هم کار می کنند. یک Instance از RabbitMQ که بیش از یک Node داشته باشد، Cluster نامیده می شود.
  • مفهوم Node: یک کامپیوتر در RabbitMQ Cluster.

تب Overview

با نگاه کلی به شکل 1 دو نمودار را می بینیم؛ یک نمودار پیام های صف شده(Queued Message) را نشان می دهد و دیگری نرخ پیام ها(Message rates) را نشان می دهد. در بالای نمودار ها با کلیک روی "last minute" می توان فاصله زمانی(Interval) نمودار ها را تغیر داد. همچنین با کلیک روی "?" می توان اطلاعات دیگری را مشاهده کرد.

نمودار پیام های صف شده(Queued message):

این نمودار یک تعداد کلی از پیام های صف شده از همه Queue ها می دهد. Ready تعداد پیام های آماده تحویل را نشان میدهد. Unacked تعداد پیام هایی که منتظر پاسخ از طرف Consumer هستند تا از Queue حذف شوند را نشان می دهد.

نمودار نرخ پیام ها(Message rates):

نرخ پیام ها یک نمودار است که نشان می دهد رسیدگی به پیام ها با چه سرعتی انجام گرفته.

شکل 1 - رابط مدیریت RabbitMQ
شکل 1 - رابط مدیریت RabbitMQ

بخش Nodes:

این بخش اطلاعاتی را درباره Node های مختلف RabbitMQ نشان می دهد. همچنین در اینجا اطلاعاتی درباره سرور و رم و تعداد Erlang process به ازای هر Node و پلاگین های فعال وجود دارد.

شکل 2 - اطلاعات مختص Node
شکل 2 - اطلاعات مختص Node

بخش های Import/Export definitions:

این امکان وجود دارد که کانفیگ ها و تنظیمات انجام شده در RabbitMQ را Export کنیم یا یک کانفیگ را Import کنیم. با Export کردن و دانلود کانفیگ ها ما یک فایل JSON از همه تنظیمات و کانفیگ های RabbitMQ خواهیم داشت. از این فایل JSON می توان برای بازیابی Exchange ها، Queue ها، VHost ها، سیاست(Policy) ها و User ها استفاده کرد. همچنین از این ویژگی می توان برای بک آپ استفاده کرد.

شکل 3 - Import و Export کردن در فایل JSON
شکل 3 - Import و Export کردن در فایل JSON

تب های Connections و Channels

اتصالات(Connection) و Channel ها در RabbitMQ می توانند وضعیت های مختلفی اعم از Starting، Tuning، Opening، Running، Flow، Blocking، Blocked، Closing یا Closed باشد.

شکل 4 - تب Connections در رابط مدیریت RabbitMQ
شکل 4 - تب Connections در رابط مدیریت RabbitMQ

تب Connections

در تب Connection(شکل 4) اتصالات فعال به سرور RabbitMQ را نشان می دهد. Username نشان می دهد که این Connection مربوط به کدام کاربر است. Channels تعداد Channel هایی که از این Connection استفاده می کنند را نشان می دهد. SSL/TLS مشخص می کند که آیا این Connection توسط SSL امن شده است یا خیر.

با کلیک روی یکی از Connection ها می توان یکسری اطلاعات درباره آن Connection خاص بدست آورد(شکل 5). در این بخش میتوان لیست Channel های فعال که درون این Connection و نرخ جابجایی داده ها و مشخصات Client را مشاهده کرد، همچنین در این قسمت می توانید Connection را ببندید.

شکل 5 - اطلاعات اتصال یک Connection خاص
شکل 5 - اطلاعات اتصال یک Connection خاص

تب Channels:

تب Channel(شکل 6) اطلاعاتی را درباره تمامی Channel های حاضر نشان می دهد.

شکل 6 - تب Channel
شکل 6 - تب Channel


با کلیک بر روی یکی از Channel ها اطلاعاتی درباره آن به ما میدهد(شکل 7). نرخ پیام ها و تعداد Consumer ها را می توان از این بخش مشاهده کرد.

شکل 7 - جزئیات درباره یک Channel خاص
شکل 7 - جزئیات درباره یک Channel خاص

تب Exchanges

لیست همه Exchange ها را می توان در این تب مشاهده کرد(شکل 8). ستون Features پارامتر های Exchange را نشان می دهد(برای مثال: D به معنی Durable است و AD به معنی Auto-Delete). مقدار ستون های Features و Type را می توان هنگام ساخت Exchange مشخص کرد. در این لیست تعدادی Exchange وجود دارند که با amq شروع شده اند و یکی به نام (AMQP Default) که از Exchange های پیشفرض هستند.

شکل 8 - تب Exchange
شکل 8 - تب Exchange

با کلیک بر روی نام Exchange می توانید جزئیات آن Exchange را مشاهده کنید(شکل 9). اضافه کردن Binding جدید به این Exchange و مشاهده Binding های قبلی و ارسال پیام به وسیله این Exchange و حذف Exchange از کار های دیگری است که می توان در این قسمت انجام داد.


شکل 9 - جزئیات یک Exchange
شکل 9 - جزئیات یک Exchange


تب Queues

در این تب میتوان همه Queue های ثبت شده در یک یا همه VHost ها را مشاهده کرد(شکل 10). همچنین می توانید در این قسمت یک Queue جدید بسازید. Queue ها براساس اینکه چرا و چطور ساخته می شوند پارامتر ها و آرگومان های متفاوتی خواهند داشت. ستون Feature پارامتر ها و آرگومان های هر Queue را نشان می دهد، مثل:

  • مفهوم Durable: یک Durable Queue اطمینان می دهد که RabbitMQ پیام ها به دست Consumer می رساند و منتظر می ماند تا Consumer پیام را پردازش کند، سپس پیام را از درون Queue حذف می کند؛ تا اگر پیام در حین پردازش در سمت Consumer با خطا رو به رو شد RabbitMQ دوباره پیام را برای پردازش ارسال کند.
  • مفهوم Message TTL: مدت زمانی که پیام درون Queue می تواند زنده بماند قبل از اینکه دور انداخته شود.
  • مفهوم Auto-expire: مدت زمانی که Queue می تواند بدون استفاده بماند قبل از اینکه به طور خودکار حذف شود.
  • مفهوم Max length: حداکثر تعداد پیامی که Queue می تواند نگهداری کند قبل از اینکه آن ها را دور بریزد.
  • مفهوم Max length byte: حداکثر سایز کل پیام هایی که Queue می تواند نگهداری کند قبل از اینکه آن ها را دور بریزد.
شکل 10 - تب Queues
شکل 10 - تب Queues


با کلیک روی هر Queue از لیست Queue ها میتوان همه اطلاعات مربوط به آن را مشاهده کرد(شکل 11). دو نمودار اول به طور کلی اطلاعات مشابهی را درباره تعداد و نرخ پیام های این Queue نشان می دهند.

شکل 11 - اطلاعات جزئی درباره یک Queue خاص
شکل 11 - اطلاعات جزئی درباره یک Queue خاص


بخش Consumers

در این بخش می توان Consumer ها و Channel های متصل به این Queue را مشاهده کرد(شکل 12).

شکل 12 - لیست Consumer های متصل به Queue
شکل 12 - لیست Consumer های متصل به Queue


بخش Bindings

همه Binding های فعال مربوط به این Queue در این قسمت نمایش داده می شوند. همچنین Binding های جدید را می توان از این بخش ایجاد کرد(شکل 13).

بخش 13 - لیست Binding های مربوط به این Queue
بخش 13 - لیست Binding های مربوط به این Queue


بخش Publish message

در این بخش می توان یک پیام را به صورت دستی بر روی Queue منتشر کرد(شکل 14). این پیام به وسیله Exchange پیش فرض یعنی AMQP default با Routing key برابر با نام Queue منتشر خواهد شد؛ همچنین این امکان وجود دارد که پیام را بر روی یک Exchange منتشر کنید(در قسمت معرفی تب Exchange در این باره توضیح داده شد).

شکل 14 - ارسال پیام به Queue به صورت دستی
شکل 14 - ارسال پیام به Queue به صورت دستی


بخش Get messages

در این بخش می توان پیام ها را به صورت دستی بررسی کرد(شکل 15). این نکته را در نظر داشته باشید که با این کار پیام از صف خارج می شود و ممکن است به دست Consumer نرسد؛ برای جلوگیری از این اتفاق فیلد Ack Mode را برابر با "Nack message requeue true" قرار دهد اگر با گزینه های دیگر آشنا نیستید از همین گزینه استفاده کنید؛ این گزینه پیام را از صف خارج و دوباره وارد می کند و عملا پیام از دست نمی رود. در Messages تعداد پیام هایی که میخواهید واکشی شود را وارد کنید.

شکل 15 - بررسی پیام ها به صورت دستی
شکل 15 - بررسی پیام ها به صورت دستی


بخش های Delete و Purge

در این بخش می توانیم یک Queue را حذف یا خالی کنیم(شکل 16). با زدن از دکمه Delete Queue میتوان یک Queue را حذف کرد و با زدن دکمه Purge Messages می توان همه پیام های درون Queue را حذف کرد.

شکل 16 - حذف Queue و پاک کردن همه پیام های درون Queue
شکل 16 - حذف Queue و پاک کردن همه پیام های درون Queue


تب ادمین

در بخش Users(شکل 17) میتوان کاربران را حذف و اضافه کرد و دسترسی هایی برای آن ها تعیین کرد.

شکل 17 - تب ادمین بخش Users
شکل 17 - تب ادمین بخش Users


در بخش Virtual Hosts(شکل 18) میتوان Virtual Host ایجاد کرد و آن ها را مدیریت کرد.

شکل 18 - تب ادمین بخش Virtual Hosts
شکل 18 - تب ادمین بخش Virtual Hosts


یک مثال

در این مثال می خواهیم یک Exchange به نام example.exchange ایجاد کنیم؛ سپس یک Queue به نام example_queue ایجاد میکنیم؛ در مرحله بعد یک Binding به نام example_binding و Binding key با مقدار example_key ایجاد میکنیم؛ در مرحله آخر یک پیام را از example.exchange ارسال می کنیم تا وارد example_queue شود؛ و در مرحله آخر پیام را از example_queue می خوانیم.

1- یک exchange به نام example_exchange از نوع Direct ایجاد می کنیم(شکل 19). برای این کار وارد تب Exchange می شویم و در بخش "Add a new exchange" کانفیگ Exchange جدید را وارد می کنیم.

شکل 19 - ساخت Exchange
شکل 19 - ساخت Exchange


2- یک Queue به نام example_queue ایجاد می کنیم. برای این کار وارد تب Queues می شویم و در بخش "Add a new queue" کانفیگ Queue جدید را وارد می کنیم(شکل 20).

شکل 20 - ساخت Queue
شکل 20 - ساخت Queue


3- اکنون باید بین example.exchange و example_queue یک Binding ایجاد کنیم تا Message هایی که با Routing key برابر example_key وارد example.exchange می شوند به example_queue ما هدایت شوند. برای این کار وارد تب Queues می شویم، سپس از جدول Queue ها بر روی example_queue کلیک می کنیم تا وارد جزئیات آن شویم سپس در بخش Bindings کانفینگ Binding جدید را وارد می کنیم(شکل 21).

شکل 21 - ایجاد Binding
شکل 21 - ایجاد Binding


4- تا اینجا Queue و Exchange و Binding بین آن ها آماده شد. اکنون یک پیام را توسط example.exchange برای example_queue ارسال می کنیم. برای این کار وارد تب Exchanges شده و از جدول Exchange ها بر روی example.exchange کلیک می کنیم تا وارد جزئیات آن شویم؛ سپس در بخش "Publish message" اطلاعات پیامی که می خواهیم ارسال شود را وارد می کنیم(شکل 22).

شکل 22 - ارسال پیام از طرف example.exchange
شکل 22 - ارسال پیام از طرف example.exchange


5- تا الان پیام ما برای example_queue ارسال شد و در صف قرار گرفت؛ اکنون می خواهیم پیام را از صف خارج کنیم و نمایش دهیم. برای این کار به تب Queues رفته و از جدول Queue ها روی example_queue کلیک کنید تا وارد جزئیات آن شویم؛ سپس از بخش "Get messages" می توانیم پیام های درون Queue را ببینیم؛ اما می خواهیم علاوه بر اینکه پیام نشان داده میشود از Queue هم حذف شود به این منظور فیلد "Ack mode" را برابر "Ack message requeue false" قرار می دهیم(شکل 23).

شکل 23 - خواندن پیام از Queue
شکل 23 - خواندن پیام از Queue


در بخش های بعدی مباحث پیشرفته تری را از RabbitMQ یاد میگیریم.

این مطالب در کانال تلگرام قرار گرفت. می توانید از تلگرام هم من را دنبال کنید.

https://t.me/Dev_EhsanHosseini