Зачем нам нужны очереди сообщений в программировании? 

Если вы давно занимаетесь программированием так или иначе вы могли столкнуться с такими задачами, в которых вам могут понадобиться очереди.

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

Еще более усложняет задачу если товары находятся на стороннем API и мы можем взаимодействовать с каждым товаром только по отдельности. По отдельности обращаться к каждому товару и делать запрос на обновление этого товара. 

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

Пока все товары у нас не обновятся, пользователь ограничен в своих действиях. У него будет крутиться значок загрузки страницы. 

Ответ от сервера не приходит и это рождает большие трудности: во-первых нужно настраивать большое время обработки для веб-сервера, иначе он будет падать с ошибкой. 

Также трудности у нас возникают если вы увеличиваете время ответа сервера. Это дает лазейки для хакерских атак. Тоже не не самая желательная история. Кроме того, блокируются другие задачи. Если нужно выполнять какие-то задачи ещё фоном помимо обновления. 

Ну и самая, пожалуй, главная проблема, которая при этом возникает. Если пользователь закроет вкладку браузера, то весь процесс обновления придётся начинать сначала. Это хорошо если время выполнения нашего скрипта будет занимать 1-2 минуты, а представьте, если выполнение этого скрипта занимает десятки минут, а то и часов. Конечно, такой процесс обновления данных будет просто нереальным. 

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

Важное здесь слово фоново. Все процессы обновления данных у нас будут происходить независимо от действий пользователя. Пользователь дал задачу на обновление и обновление данных будет происходить у нас независимо от действий пользователя.

Как происходит работа с очередями сообщений?

Это становится возможным благодаря так называемым брокерам сообщений, очередям куда мы каждый товар формируем в виде некого объекта с данными, который нужно обработать. Как правило, в этот объект данных добавляется идентификатор товара и, соответственно, каждый товар с каждым идентификатором помещается в этот самый брокер сообщений. 

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

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

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

Подводя итог. Для чего же нам нужны очереди сообщений?

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

Например, нам нужно удалить какую-то картинку с нашего сайта и мы разработали интерфейс, в котором пользователю дается возможность удаления этой картинки. Для того, чтобы удалить картинку, нам нужно удалить ее с базы данных и с жёсткого диска. Мы настраиваем таким образом очередь, что удаление самой картинки из базы данных выполняется синхронно, а удаление жесткого диска может выполняться фоново. В принципе, пользователю не обязательно ждать пока с сервера удалится тот или иной файл. Мы можем его запустить в очередь на удаление и, как возникнет необходимость, этот файл будет удалён для пользователей. 

Это не критично в базе данных этой картинки уже нет и он её не увидит. Он будет думать, что она удалена а фоново очередью программа потом последовательно все эти сообщения, все эти картинки удалит. 

Ну и, конечно, долгие задачи, которые требуют больших вычислительных мощностей. Пример, который мы рассматривали в этом видео.

И третий случай, когда нам нужно использовать очереди - это когда нам нужна надёжность. Надежность выполнения данных. Например, это очень часто бывает при выполнении каких-то денежных операций. Если мы хотим, чтобы эти денежные операции выполнялись надёжно, чтобы при сбое на сервере в оперативной памяти, на на жёстком диске, какой-то сбой произошёл в интернет соединении и денежный перевод от пользователя к пользователю у нас не выполнился. 

Если вы не используете очереди - эта транзакция может потеряться. Если же вы используете очереди, то при таком сбое при выполнении какой-то транзакции эта транзакция переходит в специальный раздел. 

Неуспешные транзакции можно настроить таким образом, чтобы сервис со временем обошел эти неуспешные попытки и попробовал их выполнить снова. 

Даже если эти попытки будут снова не выполнены, программист будет знать, что у нас есть такая проблема, что именно это сообщение у нас было не передано и будут выполнены какие-то действия. 

Для таких задач повышения надежности системы тоже можно использовать очереди.

Такой полезный инструмент очередь. 

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

Общие понятия такие. Размещаем какие-то сообщения, которые должны быть обработаны с течением времени и какой-то отдельный сервис, который эти сообщения обрабатывает. 

Если говорить о конкретных технических решениях, которые используется для очередей, мы можем либо написать какое-то свое программное решение для организации очередей, можно хранить их даже в базе данных.

Также можно хранить очередь в Redis. Можно воспользоваться сервисами, которые заточены для работы с очередями. Наиболее популярные Rabbit MQ, Kafka, Amazon очереди. Облачные сервисы, как Яндекс облако тоже предоставляет работу с очередями. Имейте это ввиду, что такие возможности у нас есть для работы с очередями.