18.09.2019

      Очередь сообщений(Message Queue, MQ)

      Сейчас среди требований по многим бэкенд-вакансиям можно увидеть термины RabbitMQ, ActiveMQ, Kafka. Возможно, вы уже знаете, что это названия очередей сообщений (Message Queue). Но что из себя представляет очередь сообщений? Почему это такое важное требование, что на него обязательно надо обращать внимание? Разобраться в этом нам поможет небольшая аналогия.
      Представьте, что вы решили с друзьями организовать книжный клуб. Вы разделились по жанрам: кто-то читает фантастику, кто-то детективы, кто-то исторические романы, а кто-то поэтические сборники. Как только один из участников клуба узнает про новую книгу, он отправляет ее своему другу на прочтение, чтобы каждый смог узнать его мнение о книге. Так книгу не надо читать каждому, её один раз читает один из ваших друзей и все уже знают, о чем она. Это и есть ваше приложение, где каждый элемент (участник клуба) отвечает за обработку книг своего жанра.

      А теперь представьте, что у участников клуба нет никаких способов коммуникации, кроме личного общения. Они вынуждены жить в одной квартире, так как у них нет других способов координировать свои действия и не теряться. Если в клуб вступают новые участники, в квартире становится тесно и они вынуждены переезжать в новую квартиру — и так пока участников снова не станет слишком много. Если кто-то из участников клуба затеит ремонт, то читать спокойно не сможет никто и весь клуб закроется до завершения ремонта. Любые ссоры и напряжение в коллективе также будут влиять на всех. Что уж говорить про ситуацию, когда количество новых книг станет слишком большим — книжный клуб просто не справится с этим.

      Подобный пример — это типичное монолитное приложение. Монолитную архитектуру проще использовать, она хорошо годится для небольших проектов, особенно учебных, pet-проектов, с небольшой командой и небольшими нагрузками. Если вам попался разработчик без опыта с очередями сообщений, то он работал либо только над небольшими проектами, либо над доисторическими проектами-монолитами (чем-то средним между пирамидой Хеопса и гигантским общежитием).

      Как же решить проблему нашего книжного клуба? Очевидно, что нужно улучшить способ коммуникации, дать возможность общаться на дальних расстояниях. Все мы знаем такое решение.
      Необходимо добавить в клуб мобильного оператора с телефонами. Каждый из участников покупает телефон и получает свой мобильный номер, как бы регистрируясь в системе. Вы обмениваетесь этими номерами, занося их себе в записную книжку. Теперь можно просто нажать “отправить Васе сообщение” и это сообщение дойдет именно до того участника клуба, которого зовут “Вася”. Просто и удобно.

      Нужно заметить, что сам мобильный оператор и телефоны — это не часть вашего клуба, а чужой проект, которым вы просто пользуетесь, не задумываясь, как он работает (и, в целом, вам это и не нужно). Ваше “приложение” использует стороннее решение для коммуникации между участниками. Это стороннее приложение и есть Message Queue.
      Вы спросите: “Почему собственно очередь сообщений? Где тут очередь?”. Дело в том, что теперь Вы не вынуждены выслушивать каждого, кто решил порекомендовать книгу, и читать эти книги одновременно. Вы можете оставлять сообщения непрочитанными и читать их одно за другим по мере того, как вы завершаете книгу из предыдущего сообщения. Так у вас формируется очередь книг к прочтению.

      Что нам дает такой подход? Каждый участник клуба может быть сам по себе: вы можете жить и в одной квартире, и в разных квартирах одного дома, а можете и в разных городах. Он даже может переехать в другую страну и у вас ничего не поменяется, кроме роуминга

      Теперь ваш клуб может быть разбросан по всему миру и работать точно также хорошо, как и если бы вы все сидели рядом и общались лично. Так формируется распределенная архитектура. Преимуществ у этого подхода много — теперь никто не ссорится из-за тесноты, каждый, кто решил затеять ремонт, не мешает другим. Вы можете набирать сколько угодно новых участников и не встретитесь с проблемами масштабируемости вашего клуба. Вы можете даже набрать участников, которые говорят на разных языках, главное договорится общаться друг с другом на одном языке.

      Более того, кто-то из участников клуба может схитрить и собрать целую команду, которая будет помогать ему читать книги — каждому по отдельному сообщению с книгой. При этом никто из других участников клуба не поймет разницы, ведь формат работы останется тот же.

      Внедрение очереди сообщений делает приложение легко масштабируемым, распределенным, приспособленным к многопоточности. Отдельные его части можно обновлять, не затрагивая остальное приложение. Не важно, какое у вас количество участников и команд, какие языки вы используете — работа будет все такой же эффективной. Такое приложение гораздо проще подстроить под высокие нагрузки. Нужно лишь научить всех пользоваться мобильными телефонами :)

      Частный случай описанной нами системы — это микросервисная архитектура (microservices), поэтому микросервисы чаще всего идут рука об руку с очередями сообщений.
      Message Queue — верный признак серьезного продукта, над которым работает множество команд и который нацелен на большую аудиторию. Очередь сообщений в резюме — это показатель опытного программиста, который не понаслышке знаком с серьезной разработкой.
      Хотя, конечно, никто не запрещает впихнуть очередь сообщений в условный “калькулятор” для солидности: там она как пятое колесо, зато круто выглядит в резюме. Так что будьте внимательны и рассматривайте резюме комплексно.

      Николай Клестов,CTO