به نرمافزار یا سختافزاری که برای ارسال یا دریافت پیام در سیستمهای توزیع شده استفاده میشود میانافزار پیام محور(Message-oriented middleware - MOM) میگویند. این امکان به طور معمول به صورت افزونهای در سیستمهای سختافزاری یا نرمافزاری، برای جلوگیری از پیچیدگی استفاده میشود. از این میانافزار میتوان مستقل از سیستم عامل یا زبان برنامهنویسی بهره برد.
Apache ActiveMQ یک میان افزار پیام محور(MOM) و جزء دستهای از نرم افزارها است که پیامها را بین برنامهها ارسال میکند. با استفاده از ارتباطات نامتقارن استاندارد، ActiveMQ امکان loose coupling (اتصال سست) بین سرویسهای یک برنامه را میدهد، که بیشتر این امکان برای پیامرسانی سازمانی و برنامههای توزیع شده الزامی است.
ActiveMQ یک پروژهی منبع بازِ نوشته شده با جاواست که توسط بنیاد نرم افزار آپاچی توسعه یافته. آپاچی در حال حاضر دو نسخه از ActiveMQ را ارائه میدهد: Classic و Artemis که پس از تکامل Artemis و گنجاندن تمام ویژگیهای نسخه ی کلاسیک در آن، آپاچی تنها از Artemis پشتیبانی میکند.
ActiveMQ قابل مقایسه با سایر سیستمهای پیام رسانی مانند Apache Kafka ، RabbitMQ و Amazon Simple Queue Service است. همچنین آمازون Amazon MQ را ارائه میدهد که یک پیاده سازی مدیریت شده از ActiveMQ Classic است. هر یک از این فناوریها از پیامرسان سازمانی از طریق زیرساختهای loose coupling پشتیبانی میکنند.
در این پست، نحوهی عملکرد ActiveMQ و برخی از معیارهای کلیدی آن را بررسی خواهیم کرد که میتوانید برای درک عملکرد زیرساخت پیام رسانی خود، این معیارها را مونیتور کنید.
ActiveMQ چگونه کار میکند؟
ActiveMQ پیامها را بین برنامههای کلاینت ارسال میکند به این صورت که:
- Producers (تولیدکنندگان)، که پیامها را ایجاد میکنند و برای تحویل ارسال میکنند.
- Consumers (مصرفکنندگانی) که پیامها را دریافت و پردازش میکنند.
- Broker (کارگزار) ActiveMQ هر پیام را از طریق یک endpoint پیام رسانی به نام destination (مقصد) در ActiveMQ Classic یا یک آدرس در Artemis هدایت میکند.
هر دو نسخهی ActiveMQ قادر به پیامرسانی point-to-point هستند-که در آن broker هر پیام را به یکی از مصرفکنندگان موجود در یک الگوی چرخشی هدایت میکند- و همچنین میتوانند به صورت "pub/sub" (publish/subscribe) پیامرسانی کنند -که در آن broker هر پیامی را به هر مصرفکنندهای که در موضوع (در ActiveMQ Classic) یا آدرس (در ActiveMQ Artemis) مشترک است، تحویل میدهد-. نمودار زیر اجزای موجود در استقرار ActiveMQ Classic را نشان میدهد.
همانطور که در بالا نشان داده شد، کلاسیک پیامهای point-to-point را از طریق QUEUE (صف) و پیامهای pub/sub را از طریق TOPIC (موضوع) ارسال میکند. ولی Artemis از صف برای پشتیبانی از هر دو نوع پیام و از انواع مسیریابی برای اعمال رفتار مورد نظر استفاده میکند.
در پیامرسانی point-to-point، broker هر پیام را به یک آدرس که با مسیریابی anycast پیکربندی شده ارسال میکند و پیام در یک صف قرار میگیرد که توسط یک مصرفکننده بازیابی میشود. (هر آدرس anycast به طور معمول یک صف دارد، اما در صورت لزوم میتواند شامل چندین صف باشد، به عنوان مثال برای پشتیبانی از دستهای از سرورهای ActiveMQ از چند صف استفاده میشود.) در مورد پیامرسانی pub/sub، آدرس حاوی یک صف برای هر اشتراک موضوع است و broker از نوع مسیریابی multicast برای ارسال یک کپی از هر پیام به هر صف استفاده میکند.
ActiveMQ عملکردی مخصوص در APIی Java Message Service (JMS)( سیستم پیام رسان جاوا) پیادهسازی میکند که استانداردی را برای ایجاد، ارسال و دریافت پیامها تعریف میکند. برنامههای کلاینت ActiveMQ (تولیدکنندگان و مصرفکنندگان) نوشته شده در جاوا میتوانند از JMS API برای ارسال و دریافت پیام استفاده کنند. علاوه بر این، هر دو نوع کلاسیک و آرتمیس از کلاینتهای غیرJMS نوشته شده در Node.js، Ruby، PHP، Python و زبانهای دیگر پشتیبانی میکنند که میتوانند از طریق پروتکلهای AMQP، MQTT و STOMP به بروکر ActiveMQ متصل شوند.
ActiveMQ پیامها را به صورت نامتقارن ارسال میکند، بنابراین مصرفکنندگان لزوماً پیامها را بلافاصله دریافت نمیکنند. وظیفهی تولیدکننده برای نوشتن و ارسال پیام، با وظیفهی مصرفکننده برای واکشی آن ارتباط ندارد. از آنجایی که ActiveMQ از یک broker به عنوان واسطه استفاده میکند، تولیدکنندگان و مصرفکنندگان از یکدیگر مستقل (و حتی بیاطلاع) هستند. به محض اینکه یک تولیدکننده پیامی را برای یک broker ارسال میکند، بدون توجه به اینکه مصرفکننده پیام را دریافت میکند یا نه، وظیفه آن کامل میشود. برعکس، هنگامی که یک مصرفکننده پیامی را از یک broker دریافت میکند، بدون اطلاع تولید کنندهای که پیام را ایجاد کرده است، این کار را انجام میدهد.
این نوع چیدمان، که در آن مصرفکنندگان بدون اطلاع از یکدیگر کار میکنند، به عنوان loose coupling شناخته میشود. مزایای loose coupling عبارتند از:
- توان عملیاتی بالا: از آنجایی که تولیدکنندگان نیازی به انتظار برای تایید مصرفکننده یا broker ندارند، میتوانند به سرعت پیام ارسال کنند-ActiveMQ میتواند به هزاران پیام در ثانیه دست یابد.
- انعطاف پذیری: کلاینتها میتوانند به طور موقت در دسترس نباشند، به صورت پویا به محیط اضافه شوند، و حتی به زبانی جدید بازنویسی شوند، بدون اینکه روی کلاینتهای دیگر تأثیر بگذارند یا باعث ایجاد خطا در فرآیند پیامرسانی شوند.
- ناهمگونی: کلاینتها به طور مستقل عمل میکنند و با بروکر ActiveMQ ارتباط برقرار میکنند اما مستقیماً با یکدیگر ارتباط برقرار نمیکنند. در نتیجه، ممکن است به هر یک از زبانهایی که ActiveMQ پشتیبانی میکند نوشته شوند.
از آنجایی که اجزای معماری ActiveMQ مجزا از همند، شما باید بر تولیدکنندگان، مصرفکنندگان، مقصدها، آدرسها و brokerها بهطور کلی مونیتور کنید تا بتوانید متوجه علت هر مشکل احتمالی بشوید. به عنوان مثال، اگر متوجه شوید که خروجی تولیدکننده متوقف شدهاست، اینطور نیست که حتما مشکلی وجود دارد اما اگر با افزایش مصرف حافظه مقصد مرتبط باشد، میتواند یک تنگنا را در سیستم بزرگتر نشان دهد. بعداً، ما به برخی از معیارهای خاص که به مونیتور کردن کلی ActiveMQ کمک میکند نگاه خواهیم کرد. اما ابتدا، واحد اساسی کار ActiveMQ (پیام) را بررسی میکنیم.
پیامها
هر پیامی که ActiveMQ ارسال میکند بر اساس مشخصات JMS است و از هدرها، properties (خصوصیات) اختیاری و بدنه تشکیل شده است.
هدرها
هدرهای پیام JMS حاوی فراداده (Meta Data) در مورد پیام است. هدرها در مشخصات JMS تعریف میشوند و مقادیر آنها یا در زمانی که سازنده پیام را ایجاد میکند یا در زمانی که ActiveMQ آن را ارسال میکند تنظیم میشود.
هدرها کیفیتهایی از پیام را منتقل میکنند که بر نحوهی رفتار broker و کلاینت تأثیر میگذارد. بیایید به دو ویژگی کلیدی که ActiveMQ هنگام ارسال پیام در نظر میگیرد نگاهی بیندازیم: 1-انقضا و 2-ماندگاری.
1-انقضای پیام
بسته به محتوا و هدف، یک پیام ممکن است پس از مدت زمان معینی ارزش خود را از دست بدهد. هنگامی که یک تولید کننده پیامی را ایجاد میکند، میتواند یک مقدار انقضا را در هدر پیام تنظیم کند. اگر اینطور نباشد، مقدار هدر خالی میماند و پیام هرگز منقضی نمیشود.
ActiveMQ هر پیام منقضی شدهای را به جای ارائهی آن، از صفها و موضوعات خود دور میاندازد و انتظار میرود که مصرفکننده هر پیامی را که پس از انقضا، پردازش نشده باقی بماند نادیده بگیرد.
2-ماندگاری پیام
پیامهای ActiveMQ بهطور پیشفرض پایدار هستند، اما میتوانید ماندگاری را بر اساس هر پیام یا تولیدکننده، پیکربندی کنید. هنگامی که یک persistent message (پیام دائمی) ارسال میکنید، broker پیام را قبل از تحویل گرفتن در دیسک ذخیره می کند. اگر broker در آن نقطه از کار بیفتد، یک کپی از پیام باقی میماند و فرآیند ارسال پیام میتواند با راه اندازی مجدد broker بازیابی شود. از طرف دیگر، یک non-persistent message (پیام غیردائمی) به طور معمول فقط در حافظهی broker وجود دارد و در اتفاقی که باعث راه اندازی مجدد broker شود از بین میرود.
ارسال پیامهای غیر دائمی به طور معول سریعتر است زیرا broker نیازی به اجرای عملیات نوشتن ندارد. پیامهای غیر دائمی برای دادههای کوتاهمدتی که در فواصل زمانی مکرر جایگزین میشوند، مانند بهروزرسانی یکبار در دقیقه به ازای مکان هر آیتم، مناسب است.
Properties (ویژگیها)
ویژگی ها راهی برای افزودن Meta Data اختیاری به پیام ارائه میدهند. ActiveMQ از برخی ویژگی هایی که در مشخصات JMS تعریف شدهاند پشتیبانی میکند، تولیدکنندگان همچنین میتوانند ویژگی ها را (به طور دلخواه و خارج از مشخصات JMS ) تعریف کرده و آنها را برای هر پیام اعمال کنند. مصرفکنندگان میتوانند انتخابگرها را برای فیلتر کردن پیامها بر اساس مقادیر موجود در ویژگی های پیام پیاده سازی کنند. به عنوان مثال، میتوانید یک سازندهی ActiveMQ را پیکربندی کنید تا یک ویژگی coin
را به هر پیام، با مقدار heads
یا tails
، متصل کند و همه آنها را به یک موضوع ارسال کند. شما میتوانید دو مصرفکننده بنویسید - یک مصرفکنندهی heads
و یک مصرفکنندهی tails
- که در آن موضوع مشترک هستند اما فقط پیامهایی را با مقدار انتخابی ویژگی coin
دریافت میکنند.
بدنه
محتوای یک پیام ActiveMQ بدنهی آن است. بدنهی یک پیام میتواند به صورت متنی یا دادههای باینری باشد. (همچنین خالی بودن بدنه پیام قابل قبول است.) مقدار هدر پیام JMSType که به صراحت توسط سازنده هنگام ایجاد پیام تنظیم میشود، تعیین میکند که چه چیزی میتواند در بدنهی پیام حمل شود: یک فایل، یک byte stream، یک شی جاوا، یک stream اولیهی جاوا، مجموعهای از جفت نام-مقدار، یا یک رشتهی متن.
برای اطلاعات بیشتر در مورد انواع پیام، به مستندات JMS مراجعه کنید.
حافظه و ذخیره سازی
ActiveMQ از حافظه برای ذخیرهی پیام هایی که در انتظار ارسال به مصرفکنندگان هستند استفاده میکند. هر پیام مقداری از حافظه را اشغال میکند (این مقدار بستگی به اندازه ی پیام دارد) تا زمانی که از صف خارج شود و به مصرفکننده تحویل داده شود. در آن مرحله، ActiveMQ حافظهای را که برای آن پیام استفاده شده بود آزاد میکند. وقتی تولیدکنندگان سریعتر از مصرفکنندگان هستند (در یک بازهی زمانی معین، نوبتبندی بیشتر از نوبتدهی وجود دارد) استفاده ActiveMQ از حافظه افزایش مییابد.
ActiveMQ همچنین پیامهایی را برای ذخیرهسازی روی دیسک مینویسد. Classic و Artemis هر دو از paging (صفحهبندی) برای انتقال پیامها به دیسک در صورت اتمام حافظه استفاده میکنند. هنگامی که ActiveMQ نیاز به ارسال آن پیامها دارد، آنها از دیسک به حافظه بازگردانده می شوند. صفحهبندی پیامها به دیسک و از دیسک باعث تأخیر میشود، اما به ActiveMQ اجازه میدهد تا حجم زیادی از پیامها را بدون نیاز به حافظهی کافی برای نگهداری همه آنها پردازش کند. صفحهبندی بهطور پیشفرض فعال است، اما اختیاری است (شما میتوانید آدرسی را پیکربندی کنید تا زمانی که هیچ حافظهای برای ذخیره کردن پیامها وجود ندارد، آنها را کنار بگذارید).
در این بخش، نحوهی استفادهی ActiveMQ از حافظه و دیسک برای ذخیرهی پیامها را بررسی خواهیم کرد.
حافظه
سیستم هاست مقداری از حافظهی خود را به عنوان حافظهی heap(پشته) برای JVM که ActiveMQ در آن اجرا می شود اختصاص می دهد. حداکثر اندازه ی پشته ی پیش فرض ActiveMQ در نسخههای متفاوت ActiveMQ و JVM متفاوت است. برای تعیین حداکثر درصد حافظهی پشتهی JVM که ActiveMQ Classic می تواند استفاده کند، فرزندِ memoryUsage
عنصرِ systemUsage
را در فایل پیکربندی brokerِ (activemq.xml) تنظیم کنید. میتوانید این را به عنوان درصدی از حافظهی پشتهی JVM (به عنوان مثال <memoryUsage percentOfJvmHeap="60" />
)، یا به صورت تعدادی بایت بیان کنید، همانطور که در زیر نشان داده شده است. (توجه داشته باشید که بسته به پیکربندی شما، عنصر broker شما ممکن است متفاوت از نمونهی موجود در این مثال به نظر برسد.)
activemq.xml
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="MY_BROKER">
[...]
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage limit="1 gb" />
</memoryUsage>
</systemUsage>
</systemUsage>
[...]
</broker>
حافظهی مشخص شده در عنصر memoryUsage باید در بین تمام صفها و موضوعات broker به اشتراک گذاشته شود. همچنین هر مقصد ممکن است با یک محدودیت حافظهی صریح، که در عنصر memoryLimit در داخل یک policyEntry اختیاری در فایل activemq.xml تعیین شده است، پیکربندی شود:
activemq.xml
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="MY_BROKER">
[...]
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue="MY_QUEUE" memoryLimit="100mb" />
<policyEntry topic="MY_TOPIC" memoryLimit="50mb" />
</policyEntries>
</policyMap>
</destinationPolicy>
[...]
</broker>
ActiveMQ Artemis از نیمی از حافظهی موجود برای JVM استفاده می کند مگر اینکه این تخصیص حافظه را با تنظیم پارامتر global-max-size
در فایل پیکربندی broker (broker.xml) مشخص کنید. اگر پیامهایی که در همهی آدرسهای broker نگهداری میشوند، به تمام فضای مشخص شده توسط global-max-size نیاز داشته باشند، Artemis پیامهای جدید را به محض رسیدن در دیسک، صفحهبندی میکند. با تنظیم پارامتر max-size-bytes
در عنصر address-setting
در فایل broker.xml، می توانید حافظهی موجود برای هر آدرس Artemis را به صورت اختیاری کنترل کنید. بدون مقدار max-size-bytes
، یک آدرس، منابع حافظهی موجود در سطح broker را با تمام آدرسهای دیگر، تا حد پیشفرض یا global-max-size
تعریفشده، به اشتراک میگذارد.
قطعه کد زیر عنصر address-settings
را از یک فایل نمونه در کد منبع ActiveMQ Artemis نشان می دهد. این عنصر، رفتار صفحهبندی دو آدرس (با نامهای "pagingQueue" و "exampleQueue") را پیکربندی میکند و شامل یک پیکربندی catch-all است که برای همه ی آدرسهای دیگر اعمال میشود (تعیین شده توسط match="#"). مقدار max-size-bytes
در هر آدرس، حداکثر مقدار حافظه ای را که برای ذخیره ی پیامهای آدرس استفاده می شود، تعیین می کند. Artemis از مقدار page-size-bytes
برای تعیین اندازهی هر فایل صفحه، روی دیسکی که پیامهای صفحهبندی شده ی آدرس را ذخیره می کند، استفاده می کند. آرتمیس با صفحهبندی بیشتر پیامها، فایلهای صفحه دیگری با همان اندازه ایجاد میکند.
broker.xml
<address-settings>
<address-setting match="pagingQueue">
<max-size-bytes>100000</max-size-bytes>
<page-size-bytes>20000</page-size-bytes>
</address-setting>
<address-setting match="exampleQueue">
<max-size-bytes>10Mb</max-size-bytes>
<page-size-bytes>1Mb</page-size-bytes>
</address-setting>
<address-setting match="#">
<max-size-bytes>10Mb</max-size-bytes>
<page-size-bytes>1Mb</page-size-bytes>
</address-setting>
</address-settings>
هر دو نوع ActiveMQ (Classic و Artemis) به طور متفاوتی از حافظه برای پیامهای غیر دائمی و پیامهای دائمی استفاده میکنند. هر پیام غیر دائمی به محض رسیدن در حافظه ذخیره می شود. وقتی حافظهی موجود پر شد، کلاسیک همه پیامها را به دیسک منتقل میکند، اما آرتمیس پیامهای موجود را در حافظه میگذارد و پیامهای جدید را روی دیسک صفحهبندی میکند. هر پیام دائمی نیز به محض رسیدن در حافظه ذخیره میشود و همچنین در محل ذخیره ی پیام روی دیسک نوشته میشود. اگر حافظه دیگری در دسترس نباشد، پیامهای دائمی ورودی مستقیماً در محل ذخیرهی پیام نوشته میشوند.
تا زمانی که حافظهی موجود در مقصد یا آدرس تمام نشده باشد، پیامهای دریافتی را میتوان مستقیم از حافظه ارسال کرد، بدون اینکه هیچ گونه تأخیر مرتبط با فعالیت دیسک ایجاد شود. اگر پیام در حافظه موجود نباشد (یا به این دلیل که از حافظه به محل ذخیرهی موقت منتقل شده است یا به این دلیل که زمانی که حافظه موجود پر شده است بر روی محل ذخیرهی پیام نوشته شده است)، broker باید دادههای پیام را از دیسک صفحهبندی کند تا آن را به یک مصرفکننده ارسال کند.
ذخیره سازی
میتوانید مقدار فضای ذخیرهسازی را که broker های کلاسیک شما برای پیامهای دائمی در عنصر storeUsage
فایل activemq.xml استفاده میکنند، مانند مثال زیر مشخص کنید:
activemq.xml
<systemUsage>
<systemUsage>
<storeUsage>
<storeUsage limit="100 mb"/>
</storeUsage>
</systemUsage>
</systemUsage>
فضای ذخیره سازی پیامهای غیر دائمی ActiveMQ Classic به طور جداگانه مشخص شده است. پیامهای غیر دائمی تنها پس از اتمام حافظه در دسترس در حافظه نوشته میشوند. میتوانید مقدار فضای ذخیرهسازی مورد استفاده برای پیامهای غیر دائمی را در عنصر tempUsage
فایل activemq.xml مشخص کنید، که پیشفرض 50 گیگابایت است. میتوانید این را به صورت درصدی از فضای دیسک موجود (percentLimit
) یا به صورت مقداری بایت (مانند شکل زیر) پیکربندی کنید:
activemq.xml
<systemUsage>
<systemUsage>
<tempUsage>
<tempUsage limit="100 mb"/>
</tempUsage>
</systemUsage>
</systemUsage>
ActiveMQ Classic از KahaDB به عنوان مکانیزم پیش فرض ذخیرهی پیام خود استفاده میکند و هم پیامهای دائمی و هم پیامهای غیر دائمی را ذخیره میکند.
منبع اصلی پیام آرتمیس، file journal است. برای اینکه ActiveMQ بتواند پیامها را به طور موثر مدیریت کند، file journal طوری طراحی شده است که حرکت مورد نیاز head دیسک را هنگام استفاده از حافظه HDD به حداقل برساند (اگرچه ActiveMQ از ذخیره سازی SSD نیز پشتیبانی میکند). همانطور که در مستندات Artemis توضیح داده شده است، میتوانید file journal را از طریق فایل broker.xml پیکربندی کنید.
هر دو نسخه از ذخیره ی پیامها بوسیلهی JDBC نیز پشتیبانی میکنند. با استفاده از این پیکربندی، میتوانید از میان تعدادی پایگاه داده ی SQL، مکانیزم ذخیرهسازی را که به بهترین وجه نیازهای شما را برای مقیاسپذیری و پشتیبانی برآورده میکند، انتخاب کنید. برای اطلاعات بیشتر در مورد استفاده از محل ذخیرهی پیام JDBC به مستندات ActiveMQ Classic و ActiveMQ Artemis مراجعه کنید.
ما به برخی از ویژگیهای پیامهای JMS و روشهای مختلفی که ActiveMQ آنها را ذخیره و ارسال میکند، نگاه کردهایم. اما کار ActiveMQ تا زمانی که پیامی به مصرفکننده تحویل داده نشود، تکمیل نمیشود. در بخش بعدی به نحوهی برخورد مصرفکنندگان با پیامها خواهیم پرداخت.
مصرفکنندگان
مصرفکنندگان برنامههایی هستند که پیامهایی را که ActiveMQ ارسال میکند دریافت میکنند. در این بخش، ما به برخی از ویژگیهای کلیدی که بر رفتار مصرفکنندگان تأثیر میگذارند نگاه میکنیم: اشتراکها و تأیید.
اشتراکهای Durable (بادوام) در مقایسه با اشتراکهای nondurable (بیدوام)
یک مصرفکننده میتواند در یک موضوع به عنوان بادوام یا بیدوام مشترک شود. (دوام فقط برای پیامهای درون یک موضوع اعمال میشود، نه در یک صف.) در مورد اشتراک بادوام، اگر مشترک در دسترس نباشد، ActiveMQ پیامها را حفظ میکند و هنگامی که آن مشترک دوباره وصل میشود، پیامهای جدیدی را که در زمان قطع بودنش برایش ارسال شده، دریافت میکند ولی یک مشترک بیدوام هیچ پیامی در مورد موضوع منتشر شده در زمان قطع بودنش، دریافت نمیکند.
تأیید پیام
برای اطمینان از دریافت پیامها و (در صورت لزوم) برای جلوگیری از ارسال بیش از یک بار پیام ، ActiveMQ از تأیید پیام پشتیبانی میکند. هر مصرفکننده طوری پیکربندی شده است که تعیین میکند چه زمانی و چگونه پیامی را تأیید کند (یا به صورت خودکار پس از دریافت یا با فراخوانی صریح متد acknowledge
). معیارهای ActiveMQ هم برای Classic و هم برای Artemis اطلاعاتی دربارهی تعداد پیامهای تأیید شده و پیامهایی که هنوز تأیید نشده نشان میدهند، اما معنای آن معیارها به حالت تأیید مصرفکننده بستگی دارد. افزایش در پیامهای تایید نشده میتواند به این معنی باشد که مصرفکننده آفلاین است و نمیتواند پیامها را دریافت کند، یا اینکه مصرفکننده با موفقیت فراخوانی تأیید manual خود را انجام نمیدهد.
جمعبندی
تا اینجا ما توضیح دادهایم که ActiveMQ چیست و چگونه کار میکند و سپس به بررسی انواع ActiveMQ و تفاوتها و ویژگیهای شاخص آنها پرداختیم. در بخش بعدی، چند معیار مفید را معرفی خواهیم کرد تا به شما در درک نحوهی مونیتور ActiveMQ کمک کند.