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

Завершено

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

Очереди сообщений для межпроцессных взаимодействий на одном компьютере доступны в системных библиотеках UNIX <sys.msg.h> и POSIX mqueue.h, где их можно использовать как в синхронном, так и в асинхронном режиме. Синхронное сообщение требует, чтобы процессы отправки или получения блокировались во время его отправки до получения подтверждения от получателя. Асинхронные сообщения не блокируют процессы отправки или получения и могут помещаться в буфер для отложенной доставки.

Для приложений с охватом сразу несколько компьютеров разработали ряд специализированных систем очередей сообщений с открытым кодом, таких как WebSphere MQ от IBM, Java Message Service (JMS) и RabbitMQ. Все эти системы позволяют отправлять и получать сообщения, а также управлять ими.

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

An interface connects to senders (or producers), which create messages, and to receivers (or consumers), which can receive the messages.

Рис. 1. Интерфейс подключается к отправителям (или производителям), которые создают сообщения, а также получателям (или потребителям), которые могут получать сообщения.

Характеристики очередей сообщений

Понять и оценить по достоинству очереди сообщений и их новизну позволяет сравнение с традиционными RPC и механизмами запросов-ответов. Основные возможности очереди сообщений:

служба хранилища. В отличие от традиционных систем запросов и ответов, использующих базовые протоколы TCP и UDP через сокеты, очереди сообщений обычно хранят сообщения в определенном типе буфера, пока они не будут прочитаны конечным процессом или были явно удалены из очереди сообщений.

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

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

Преимущества очередей сообщений

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

Message queues provide an interface that allows for programs to communicate with each other.

Рис. 2. Очереди сообщений предоставляют интерфейс, позволяющий программам взаимодействовать друг с другом.

  • Прямые подключения между программами: очередь сообщений позволяет непрямым обменом данными между программами. Отправители могут не знать получателей сообщений, и наоборот. За счет этого логику маршрутизации сообщений (а потенциально и работы) может определять сама система очередей сообщений.
  • Обмен данными между программами может быть независимым от времени: очереди сообщений обычно буферизируют сообщения между программами, поэтому им не нужно блокировать или прерывать их выполнение для отправки или получения сообщений. Они могут выполнять другие действия и обрабатывать ответ как при поступлении сообщения, так и позднее. При написании приложения для обмена сообщениями необязательно знать (или учитывать) время, когда программа отправляет сообщение или когда его может принять адресат. Сообщение не потеряется; диспетчер очереди сохранит его до тех пор, пока адрес не будет готов его обработать. Сообщение остается в очереди до тех пор, пока его не удалит программа. Это означает, что отправляющие и получающие сообщения программы не связаны; отправитель может продолжать обработку, не дожидаясь, пока получатель подтвердит получение сообщения. Сообщение отправляется, даже если целевое приложение в этот момент не запущено. Оно сможет извлечь сообщение после запуска.
  • Работа может выполняться небольшими автономными программами: очередь сообщений позволяет использовать преимущества использования небольших автономных программ. Вместо одной большой программы, выполняющей все части задания последовательно, можно распределить задание между несколькими небольшими, независимым программами. Запрашивающая программа отправляет сообщения в каждую из отдельных программ, предлагая им выполнить определенную функцию. Завершив выполнение, каждая программа отправляет результаты обратно в виде одного или нескольких сообщений.
  • Связь может управляться событиями: программы можно контролировать в соответствии с состоянием очередей. Например, можно сделать так, чтобы программа запускалась, как только сообщение поступит в очередь. Или можно указать, чтобы программа не запускалась до тех пор, пока, например, не накопится очередь из 10 сообщений с приоритетом выше установленного или 10 сообщений с любым приоритетом.
  • Приложения могут назначать приоритет сообщению: программа может назначать приоритет сообщению, когда оно помещает сообщение в очередь. От него будет зависит положение в очереди, куда будет добавлено новое сообщение. Программы могут либо получать сообщения из очереди в том порядке, в котором они находятся в очереди, либо получать определенное сообщение. (Программа может выбрать получение определенного сообщения, если она ищет ответ на отправленный ранее запрос.)
  • Поддержка восстановления: многие очереди сообщений предлагают сохраняемость и ведение журнала, что позволяет восстановить состояние и сообщения в очереди во время сбоев.
  • Несколько очередей: некоторые системы позволяют определить и настроить несколько очередей, которые могут быть определены и настроены разработчиком приложения. Это позволяет направлять сообщения в определенные сущности в зависимости от связи с издателем или подписчиком. Пример такой системы — Apache Kafka.
  • Простота масштабируемости: очереди сообщений могут горизонтально масштабироваться для увеличения нагрузки сообщения, а не тесно связанных систем, где масштабирование и управление трафиком связи и конечными точками сложнее.

Проверьте свои знания

1.

Что из нижеперечисленного не является преимуществом очередей сообщений по сравнению с традиционными способами обмена сообщениями?

Проверьте свои ответы