طبق تعاریف رسمی ارائه شده برای Message Brokerها، برنامههای واسطی هستند که پیامها را طبق پروتکل رسمی پیامی در سمت انتشاردهنده دریافت کرده و به فرمت مورد انتظار دریافتکننده در اختیار آنها قرار میدهد. به عبارتی پیام را به نحوی که برای انشاردهنده راحتتر است دریافت کرده و به صورت مورد نظر برای دریافتکنندههای آن پیامها ارسال میکنند.
حال سوالی که در مورد این نرمافزارها مطرح میشود این است که این پیامها چه موقعی باید مورد استفاده قرار بگیرند؟ و جواب خیلی ساده است: زمانی که پردازش و route کردن پیامها اهمیت دارد. به این معنی که شما میزان بسیاری زیادی پیام دارید (به هزاران، میلیون و میلیاردها پیام فکر کنید.) و در این حالت ارزش دارد تا از یک واسط پیامی به عنوان هسته اصلی تمامی پیامهای خود استفاده کنید تا تمامی سرویسهای موجود به عنوان منبع پیامهای خود از این رابط پیامیاستفاده کنند و تمامی پردازشها و فعالیتهای مربوطه در این نرمافزار صورت بگیرند.
یکی از بهترین نمونه استفاده این تکنولوژیها میتوان به بهرهگیری در معماری میکرو سرویسها اشاره کرد. در صورتی که تمایل دارید با این معماری نرمافزاری بیشتر اشنا شوید، میتوانید مقاله “میکرو سرویسها: از معماری تا پیادهسازی” را مطالعه کنید. در این مقاله سعی شده است کلیت و پیشنیازهای آن ارائه شوند. در قسمت ارتباطات غیرهمزمان در این مقاله نقش message brokerها توضیح داده شده است. Message Brokerها به خوبی میتوانند برای ارتباط غیرهمزمان بین سرویسها و اشتراکگذاری پیامهای آنها مورد استفاده قرار بگیرند.
در ادامه دو مورد سناریوهایی که میتوان از Message Brokerها استفاده شوند، معرفی میشوند.
سناریو ۱
حالتی را در نظر بگیرید که میخواهید نرمافزارهای خود را به یکدیگر متصل کنید. در صورتی که بخواهید تمامی سرویسها را به یک زبان واحد انتقال دهید یا همگی را در یک ساختار پایگاه داده تعریف کرده و به هم متصل کنید، ممکن است خیلی هزینه بر باشد. به طور مثال نیاز است تا سرویس اطلاعات خود را با سرویسی دیگر به هماهنگ کند یا حالتی را در نظر بگیرید که پس از به روز رسانی سرویسی اطلاعات سایر سرویسها نیز به روز رسانی شوند. راهکار بهینه راهاندازی یک مرکز رویداد متمرکز است تا تا همه برنامهنویسیان در تمامی سرویسها با آن در ارتباط باشند. که در این حالت رویدادها یک راه ارتباطی بین سرویسها و طبق قاعده خاصی تعریف میشوند و هیچ نیازی به تخصص در زبان برنامه نویسی یا قواعد خاصی نیست. فقط نیاز است تا سرویسها دادههای مورد نظر (پیامها) را طبق این ساختار برای مرکز رویداد ارسال کنند.
سناریو ۲
حالتی را در نظر بگیرید که میخواهید یک نرمافزار موفق در زمینه اینترنت اشیاء راهاندازی کنید و دستگاههای بسیار زیادی نیاز است تا دادههای خود را برای سرور مرکزی ارسال کنند. در این حالت خیلی راحت میتوانید یک Message Broker راهاندازی کنید که تمامی دستگاهها اطلاعات خود را برای آن ارسال میکنند و این نرمافزار است که تمامی پردازشها و پروسههای مربوط به این دادهها را انجام میدهد.
کاربرد در نرمافزارهای مدرن
به طور کلی میتوان message brokerها یکی از مولفههای اصلی در معماری نرمافزارهای مدرن امروزی تعریف کرد و یکی از مهمترین تکنولوژیهای مورد استفاده در نرمافزارهای تحت وب است. چرا که به عنوان یک نرمافزار حد واسط یا اصطلاحا middleware عمل میکنند تا یک ارتباط غیرهمزمان بین قسمتهای مختلف نرمافزارها ایجاد کنند. به این صورت که بخشهای مختلف نرمافزار بدون نیاز به اطلاع از یکدیگر از طریق متد publish/subscribe با یکدیگر در ارتباط هستند. به این معنی که به صورت کاملا مستقل و بدون وابستگی که اصطلاحا loosely coupled گفته میشود، به عنوان دریافتکننده یا ارسال کننده پیام خود را برای message broker ارسال یا از آن دریافت میکنند.
به طور کلی از مزایای این کارگزارهای پیامی میتوان به مواردی مثل زیر اشاره کرد:
- برای اطمینان از استقلال سرویسها و اینکه هیچ وابستگیای به هم ندارند
- برای ایجاد ارتباط غیر همزمان بدون ایجاد توقف و وقفه در فرایند اجرایی برنامه.
- زمانی که دریافتکننده پیامها نمیتواند به سرعت ارسال پیامها توسط فرستنده آنها را پردازش کنند و نیاز است از طریق بافر کردن پیامها و ایجاد صف توسط کارگزار پیام این فرآیند صورت بگیرد.
به طور کلی این کارگزهای پیام با پردازش و در دست گرفتن تمامی انتقالهای مربوط به پیامها بین سرویسها باعث ایجاد پایداری در این فرآیند میشوند.
شکل زیر کاربرد این نرمافزارها را بهتر نمایش میدهد:
همانطور که مشاهده میکنید سرورها بر اساس موضوعهای مختلف دادههای خود را بر روی broker اصطلاحا publish میکنند و هر سروری که به این اطلاعات نیاز داشته باشد برای آن موضوع و تاپیک اصطلاحا subscribe میکند و این پیامها را دریافت میکند. که این دادهها به روشهای مختلف مثل xml، json یا باینری و … ارسال شده باشند که وابسته به نحوه برنامهنویسی و کاربرد آن سرویس دارد.
به طور کلی message brokerهای معروفی وجود دارند که برخی از آنها میتوان به موارد زیر اشاره کرد:
- Apache Kafka
- RabbitMQ
- Apache ActiveMQ
- Kestrel
- WSO2 Message Broker
- Azure event hubs
در ادامه چند مورد از معروفترین آنها معرفی میشوند.
بررسی Message Brokerهای معروف
به طور کلی message brokerهای مختلفی مثل ActiveMQ، Kafka، RabbitMQ، Redis و … وجود دارند. در ادامه برخی از معروفترین این رابطهای پیامی معرفی خواهند شد:
Apache Kafka
این نرمافزار که اولین بار برای لینکداین پیادهسازی و در سال ۲۰۱۱ به صورت متنباز ارائه شد، یکی از معروفترین Message Brokerهای موجود است. شکل زیر معماری این نرمافزار را نشان میدهد:
این نرمافزار که با زبان جاوا نوشته شده است دارای تکنولوژی فوقالعادهای است. به این صورت که تمامی پیامهای را در قالبهای فایلهای flat ذخیره کرده و مصرفکنندگان آن پیامها با فراخوانی پیام بر اساس offset پیام بر روی فایل به پیامها دسترسی خواهند داشت. کافکا معماری خیلی سادهای پیاده کرده است. البته این بدین معنی نیست که این نرمافزار ضعیف پیاده شده است. بلکه این سادگی دقیقا نقطه قوت این نرمافزار بوده و فوق العاده سریع بوده و منابع کمی مصرف میکند.
کافکا خیلی به مصرفکنندگان اهمیت نمیدهد و خیلی اطلاعات آنها را ثبت نمیکند. و پیامهای تکراری با استفاده از زمان یا storage قابل بازیابی هستند. یکی از ابزارهایی که حتما باید در کنار کافکا استفاده شود، zookeeper است. به زودی مقالهای برای اطلاعات بهتر در مورد این سرویس فوقالعاده کاربردی در همین سایت ارائه خواهد شد.
RabbitMQ
یکی از اولین نرمافزارهای متنباز ارائه شده به عنوان یک Message Broker است. از AMQP استفاده میکند تا در پلتفرمها و زبانهای مختلف مورد قابل استفاده باشد. شکل زیر یک نمونه فرآیند کار این Message Broker را نشان میدهد:
این نرمافزار که به زبان Erlang نوشته شده است و اگرچه زبان شناخته شده و معروفی نیست ولی با این وجود این دسته وظایف را بخوبی انجام میدهد. یکی از مزیتهای این نرمافزار اولویت گذاری بر روی پیامها و استفاده از صفها با اولویتهای مختلف است. به این ترتیب شما میتوانید برنامه ریزی کنید که چه پیامهای از سمت چه انتشار دهندههای پیامی با چه اولویتی پیامهای خود را به مصرفکنندگان برسانند.
برای درک بهتر کار این نرمافزار بگذارید یک مثال خیلی ساده بزنیم: فرض کنید که شما میخواهید یک درگاه ساده پیامکی ایجاد کنید. و گروههای کاربری مختلفی هستند که میخواهند پیامهای خود را ارسال کنند. پس در اینجا Producerها همان نرمافزار شماست که لیست این کاربران را دریافت میکند. پس پیام در اینجا لیست این کاربران که باید برای آنها پیام ارسال شوند و محتوای پیامها و غیره است. این اطلاعات از سمت نرمافزار شما برای RabbitMQ ارسال میشوند. اما نکته ای که هست شما میخواهید گروههای کاربری مختلف دارای اولویتهای مختلف باشند. پس یعنی پیامها اولویت دارند.
برخی از مزیتهای آن میتوان به موارد زیر اشاره کرد:
- پیامرسانی غیرهمزمان. این نرمافزار از پروتکلهای پیامی مختلف پشتیبانی میکند.
- تجربه خوب برای توسعه دهندگان. به این صورت که برای زبانهای مختلف برنامهنویسی سازگار بوده و به راحتی در کنار هر زبانی میتوان از آن استفاده کرد.
- قابلیت توسعه پذیری خیلی خوب از طریق کلاستر کردن یا مجموعهای از نودها
- پلاگینها و ابزارهای خوبی برای استفاده از این نرمافزار با قابلیت پشتیبانی از Continuous Integration و … برای این نرمافزار ارائه شده است.
Azure Event Hubs
یک پلتفرم جریان داده بزرگ و سرویس جمعاوری رویدادها است که میتواند میلیونها رویدادها در ثانیه دریافت یا پردازش کند. دادههایی که به یک هاب رویداد ارسال میشوند میتوانند به انواع سیستمهای آنالیز real-time یا ذخیرهسازی داده و غیره ارسال شده و مورد استفاده قرار بگیرند. در ادامه برخی از موارد استفاده از این نرمافزار ارائه شده است:
- شناسایی ناهنجاری یا Anomaly Detection (تقلب و …)
- لاگگیری نرمافزارها
- بایگانی کردن اطلاعات
- تحلیل تراکنشها
- …
شکل زیر نحوه کار این پلتفرم را نشان میدهد که از یک پروتکل صفگذاری پیام پیشرفته (AMQP) استفاده میکند و رویدادهای دستهبندی شده در اختیار گروههای مصرفکننده و دریافتکنندههای رویدادها قرار داده میشود.
بسیار زیبا
کاربردی و مناسب 🙂