Что такое очереди
Кратко:
- Очереди используются для организации независимой работы поставщиков и потребителей информации в системах реального времени.
- Они служат буфером между поставщиком и потребителем, позволяя развязать два параллельных процесса.
- Очереди используются внутри программ при взаимодействии потоков и в организации больших систем.
- Они помогают решать проблемы интеграции приложений, их отказоустойчивости и масштабирования.
- Существует два распространённых типа очередей: FIFO и стандартная.
- У очередей FIFO сравнительно небольшое количество вызовов API в секунду.
- В свою очередь из стандартных очередей сообщения по возможности считываются последовательно.
- Преимуществом этого подхода является более высокая пропускная способность.
Что такое очереди
Зачем нужны очереди
Предположим, вы создаете поисковую систему. У вас есть роботы (поставщики), которые собирают ссылки и передают их обработчикам (потребителям) для разбора страниц и записи результата в базу данных. Самый простой способ передавать ссылки от роботов к обработчикам — вызывать обработчики напрямую из роботов. Однако, такая реализация имеет ряд недочётов, например:
- Как правило, роботы работают быстрее обработчиков: данные будут накапливаться внутри роботов, а значит, их память или диск будут быстро переполняться.
- Роботам нужно знать рабочий интерфейс обработчиков, который может меняться по мере совершенствования системы, а значит, будет нужно адаптировать и код роботов.
- Нет гарантии, что обработчик разберет ссылку целиком.
Практически все эти проблемы решаются при помощи очередей, т. е. последовательности некоторой информации. Главная задача очередей — организовать независимую работу поставщиков и потребителей информации в системах реального времени. Вот что это означает в нашем примере.
Робот пишет сообщение в очередь: «У меня есть новая ссылка, вот она». Обработчик ссылок читает записанное сообщение из очереди и забирает себе ссылку на разбор. Чтобы другой обработчик не начал обрабатывать ту же самую ссылку, очередь скрывает это сообщение на некоторый промежуток времени (таймаут видимости), достаточный для его обработки потребителем.
Если сообщение обработано успешно, оно удаляется из очереди, а обработчик забирает себе следующее. Если обработчик вышел из строя или произошёл обрыв соединения, по истечении таймаута видимости сообщение снова становится доступным в очереди, и его может взять другой обработчик.
Таким образом, очередь служит буфером между поставщиком и потребителем, позволяя развязать два параллельных процесса. Если потребитель начинает медленнее вычитывать элементы, то очередь будет их накапливать. А шанс догнать процесс и обработать данные побыстрее даст потом.
Очереди используются внутри программ при взаимодействии потоков и в организации больших систем, где взаимодействуют несколько программ или сервисов. В таких системах очереди помогают решать проблемы интеграции приложений, их отказоустойчивости и масштабирования, например:
- надёжной передачи данных и команд между компонентами;
- обработки данных от множества устройств IoT;
- обработки событий, по которым должна быть вызвана функция.
Стоит учитывать, что у очередей есть ряд ограничений. Главным из них является неопределённое время на обработку принимающей стороной. Сложно предсказать, когда потребитель получит и обработает элемент.
Виды очередей
Существует два распространённых типа очередей: FIFO и стандартная.
FIFO означает «first in, first out», т. е. порядок размещения данных в очереди совпадает с порядком, в котором данные из нее считываются. Очереди FIFO используются в тех случаях, когда нужно обеспечить строгий порядок доставки и однократную обработку сообщений. Например, соблюдение исходного порядка важно для финансовых транзакций. Если представить, что у клиента на счету было 2 000 рублей, и он сначала положил туда 10 000, а затем потратил 5 000, то очевидно, что порядок выполнения транзакций имеет значение. Стоит отметить, что у очередей FIFO сравнительно небольшое количество вызовов API в секунду.

В свою очередь из стандартных очередей сообщения по возможности считываются последовательно, но соблюдение исходного порядка при доставке сообщений не гарантируется. Преимуществом этого подхода является более высокая в сравнении с FIFO пропускная способность: стандартные очереди поддерживают сравнительно большое количество вызовов API в секунду (отправка, принятие или удаление сообщения).

В Yandex Cloud сервисом очередей является Yandex Message Queue. Он относится к PaaS-слою и объединён с другими serverless-сервисами в группу Бессерверные вычисления. В следующем уроке мы поговорим о его специфике.