1 of 20

Очереди сообщений

Проектирование и разработка распределенных программных систем, лекция 5

2 of 20

Бэкенд постоянно ждет

3 of 20

Когда не нужно дожидаться завершения задачи

  • Отправка e-mail
  • Обработка изображений
  • Взаимодействие с внешними системами
  • Сохранение аналитики
  • Уведомление пользователей
  • Синхронизация компонентов системы

4 of 20

Откладываем эти задачи с помощью очереди сообщений

5 of 20

Очереди сообщений

  • RabbitMQ
  • ZeroMQ
  • Apache Kafka
  • Amazon SQS

6 of 20

Термины в AMQP

  • Message — передаваемые данные.
  • Producer (publisher) — тот, кто пишет в очередь.
  • Consumer (subscriber) — тот, кто читает из очереди.

7 of 20

Термины в AMQP

  • Exchange — точка обмена, которая распределяет сообщения по очередям.
  • Queue — очередь, в которой хранятся сообщения, пока консьюмер не заберет их.
  • Binding — связь exchange и queue.

8 of 20

Как это работает (протокол AMQP)

9 of 20

Producer и Consumer

Producer не знает, в какую очередь он пишет. Он просто отправляет событие в exchange.

Consumer знает, из какой очереди он читает.

10 of 20

Типы exchange

  • fanout — отправляет сообщения во все очереди.
  • direct — очередь выбирается по routing key, указанному в сообщении.
  • topic — очередь выбирается по routing key и маске (например app.notification.sms.#).
  • headers — очередь выбирается по совпадению значений из списка.

11 of 20

Плюсы очередей

  • Асинхронная обработка — отправили сообщение и не ждем результатов обработки.
  • Масштабируемость — можем добавлять консьюмеров или продюсеров независимо друг от друга.
  • Низкая связанность системы — консьюмер и продюсер могут ничего друг про друга не знать.

12 of 20

Плюсы очередей

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

13 of 20

Важные моменты

14 of 20

Persistence

Очередь сообщений становится еще одной БД. Нужно сохранять ее состояние на диск, чтобы восстановить состояние после перезагрузки или падения.

15 of 20

Ack(nowledgment)s

Консьюмер может отваливаться во время обработки сообщения. Тогда сообщение должен обработать другой консьюмер (или тот же после восстановления).

Для этого есть механизм acks: консьюмер блокирует сообщение на время обработки, а потом сообщает, что его можно удалить.

16 of 20

Пакетная обработка

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

17 of 20

Отдельные консьюмеры для важных задач

  • Неважные задачи не должны блокировать важные.
  • DDoS неважными задачами.
  • В RabbitMQ есть механизм приоритетов.

18 of 20

Переполнение очередей

  • Ограничение размера очереди.
  • Ограничение времени жизни сообщения.
  • Flow control в RabbitMQ.
  • Мониторинг размера очереди.

19 of 20

Flow control

20 of 20

Ссылки

Принципы и приёмы обработки очередей: https://habr.com/ru/company/oleg-bunin/blog/309332/

101 способ приготовления RabbitMQ и немного о pipeline архитектуре: https://habr.com/ru/company/oleg-bunin/blog/310418/

Очереди и блокировки. Теория и практика: https://habr.com/ru/company/oleg-bunin/blog/316458/