В предыдущем уроке вы познакомились с основными стилями взаимодействия. В этом уроке вы узнаете больше об обмене сообщениями.
Айгуль
Про стили взаимодействия всё понятно?
Даня
Более-менее. Расскажешь подробнее об обмене сообщениями?
Айгуль
Конечно! Слышал когда-нибудь о каналах?
Даня
Да, но предполагаю, что не о тех 🤪
Система обмена сообщениями
Обмен сообщениями между приложениями обеспечивает ориентированное на сообщения промежуточное ПО (message-oriented middleware — MOM), которое также называют системой обмена сообщениями.
В спринте «Архитектура системы» вы узнали, что неотъемлемым элементом архитектуры SOA является промежуточное ПО для обмена сообщениями (messaging middleware) — это другой тип промежуточного ПО, его не следует путать с MOM.
MOM решают проблему ненадёжности сети. Сбой в сети — это одна из самых распространённых причин утраты сообщения во время его доставки.
Взаимодействующие приложения могут находиться за тысячи километров друг от друга. Сообщения между ними могут передаваться по бесчисленным телефонным линиям, локальным и общественным сетям, маршрутизаторам, коммутаторам и каналам спутниковой связи. На каждом этапе доставки сообщения может возникнуть сбой.
MOM гарантирует доставку сообщения с компьютера отправителя на компьютер получателя вне зависимости от сбоев в сети. Чтобы сообщение было гарантировано доставлено, МОМ отправляет его снова и снова, пока оно не будет принято получателем.
Основными архитектурными элементами системы обмена сообщениями являются:
Сообщение (message).
Канал (channel).
Сообщение
Данные большинства приложений состоят из разнородных элементов — например записей файлов, объектов, строк таблицы БД. Для передачи данных по каналу их нужно привести к единому формату — сообщению (message).
Сообщение — это неделимая единица данных, которая может быть передана через канал.
Чтобы передать элементы данных, приложение-отправитель должно:
Распределить их по кадрам (в сетях Ethernet, канальный уровень OSI) или пакетам (в сети Интернет, сетевой уровень OSI).
Оформить каждый кадр или пакет в виде сообщения.
Поместить сообщение в требуемый канал.
Чтобы получить данные, приложение-получатель должно извлечь их из сообщения.
Сообщение состоит из двух основных частей:
Заголовка
Содержит информацию, необходимую для доставки: адрес компьютера отправителя и адрес компьютера получателя.
Тела
Содержит данные, важные приложению-получателю. Для процесса обмена сообщениями эта информация не важна.
Вы уже знакомы с двумя типами сообщений: HTTP-запросом и HTTP-ответом.
Канал
Каналы — это виртуальная труба, соединяющая отправителя и получателя, через которую доставляются сообщения.
Приложение-отправитель помещает сообщение не просто в систему обмена сообщениями, а в один из её каналов. Приложение-получатель извлекает сообщение не просто из системы обмена сообщениями, а из конкретного канала.
Процесс доставки
Процесс доставки сообщения от отправителя к получателю через канал состоит из пяти основных действий:
Создание
Приложение-отправитель создаёт сообщение, содержащее важные приложению-получателю данные.
Отправка
Приложение-отправитель помещает сообщение в канал. С этого момента отправитель может не беспокоиться о дальнейшей судьбе сообщения — система обмена сообщениями гарантирует его доставку. Она сохраняет сообщение в хранилище компьютера отправителя: оперативной памяти или на жёстком диске. Такой подход называется передачей сообщения с его промежуточным хранением.
Доставка
Система обмена сообщениями доставляет сообщение с компьютера отправителя на компьютер получателя. Она сохраняет сообщение в хранилище компьютера получателя. Процесс передачи сообщения с его промежуточным хранением повторяется всякий раз, когда сообщение во время доставки должно пройти через несколько компьютеров.
Получение
Приложение-получатель извлекает сообщение из части канала, которая расположена на компьютере получателя.
Обработка
Приложение-получатель извлекает важные данные из сообщения.
Направление канала
Может ли приложение использовать один и тот же канал для отправки и приёма сообщений? Несмотря на то, что эта возможность осуществима, в её реализации нет практического смысла, потому что в таком случае приложение будет принимать свои собственные сообщения.
Поэтому каналы сообщений делают однонаправленными. Это значит, что если необходимо организовать двунаправленное взаимодействие, то есть когда приложение в одних случаях является отправителем, а в других — получателем, то необходимы два отдельных канала сообщений.
Типы каналов
Все каналы сообщений делятся на два типа:
Точка-точка (point-to-point).
Издание-подписка (publish-subscribe — Pub/Sub).
Архитектор ПО и команда разработки должны определить тип каждого канала, который будет использоваться для обмена сообщениями между отправителями и получателями.
Точка-точка
Канал «точка-точка» работает по принципу «первым пришёл, первым ушёл» (first in, first out — FIFO). Это значит, что сообщения становятся в очередь на доставку: сообщение первым пришло в канал и первым должно из него выйти. Первое сообщение в очереди будет доставлено первым, второе — вторым, третье — третьим и так далее.
Реализацию таких каналов называют очередями (queues).
Если у канала только один получатель, то каждое отдельное сообщение будет доставлено только один раз. Если же у канала множество получателей, то, чтобы каждое отдельное сообщение было доставлено только один раз, получателям потребуется координировать свои действия друг с другом. Множество получателей одного канала называют конкурирующими потребителями (competing consumers).
Конкурирующими потребителями могут быть, например, экземпляры (копии) одного и того же приложения. Канал в таком случае будет являться балансировщиком нагрузки. Вы узнали об экземплярах приложения и балансировщике нагрузки в спринте «Архитектура системы».
Канал «точка-точка» обеспечивает доставку любого сообщения только одному из конкурирующих потребителей. Если несколько потребителей попытаются извлечь из канала одно и то же сообщение, то канал «точка-точка» позволит сделать это только одному из них. Таким образом, получателям не нужно координировать действия друг с другом.
Канал «точка-точка» используют в тех случаях, когда на одно сообщение нужно отреагировать только единожды. Например, при пополнении банковского счёта или оформлении заказа.
Если одно сообщение должно быть доставлено не одному, а всем приложениям-получателям, то следует использовать канал «издание-подписка».
Издание-подписка
Канал «издание-подписка» обеспечивает доставку копий сообщения отправителя множеству получателей. При этом отправителя называют издателем (publisher), а получателей — подписчиками (subscribers).
Канал «издание-подписка» на самом деле представляет собой несколько каналов: один входящий канал, куда издатель помещает сообщение, и множество исходящих каналов, откуда подписчики извлекают копии сообщения. Каждому подписчику предоставляется отдельный исходящий канал — это обеспечивает доставку сообщения только один раз каждому из них.
Реализацию таких каналов называют темами (topic) или топиками.
Канал «издание-подписка» используют в тех случаях, когда сообщения носят информационный характер и утрата одного сообщения не приводит к серьёзным проблемам. Например, тема (топик) может передавать температуру воздуха в помещениях каждую секунду. Приложениям-подписчикам, которым интересны температурные данные, не составит проблемы подождать секунду в случае, если предыдущее сообщение не было доставлено.
Выберите подходящий ситуации тип канала.
Открытие банковского счёта клиенту.
Точка-точка
Чтобы система банка не открыла клиенту множество счетов, следует использовать канал «точка-точка».
Уведомление подписчиков страницы в социальной сети о размещении нового поста.
Издание-подписка
Уведомления о размещённом посте носят информационный характер, поэтому больше подходит канал «издание-подписка».
Отправка сообщения в личной переписке в мессенджере.
Точка-точка
Отправитель личного сообщения не хочет, чтобы сообщение одному-единственному контакту было задублировано из-за ошибок в координации приложений-получателей, поэтому следует выбрать канал «точка-точка». В случае, если сообщение должно быть отправлено не одному человеку, а сразу множеству, например в группу или канал мессенджера, то лучше выбрать канал «издание-подписка».
Передача с частотой в три секунды измерений температуры, влажности и освещённости с датчиков умного дома на мобильные устройства пользователя.
Издание-подписка
Данные с датчиков умного дома носят информационный характер, а чтобы получить следующее измерение нужно подождать всего три секунды. Поэтому в данной ситуации больше подходит канал «издание-подписка».
Архитектурные шаблоны
Термины «стиль» (style) и «шаблон» (pattern) в контексте архитектуры взаимодействия приложений употребляются как взаимозаменяемые. При этом термин «шаблон» употребляется чаще по отношению к организации небольшой части взаимодействия.
Стиль «Обмен сообщениями» включает множество шаблонов, наиболее распространёнными из которых являются:
В случае отказа системы обмена сообщениями все находящиеся в ней сообщения будут утеряны, потому что они хранятся во временном хранилище данных — оперативнойпамяти (random access memory — RAM) компьютера.
Память — это электронный компонент, способный хранить данные. При этом память нуждается в постоянном подключении к источнику питания для хранения данных. Если компьютер отключат от источника питания, то все данные в памяти будут утеряны.
Однако, потери сообщений можно избежать, если реализовать в системе обмена сообщениями гарантированную доставку сообщений.
Гарантированная доставка — это архитектурный шаблон, который обеспечивает передачу сообщений, находящихся в системе обмена сообщениями на момент её отказа, после восстановления её работоспособности.
С помощью этого шаблона отправитель может быть уверен, что сообщение будет доставлено получателю даже в случае отказа системы обмена сообщениями.
Гарантированная доставка обеспечивается хранением сообщений в постоянном хранилище данных — на жёстком диске (hard disk) компьютера.
Диск — это устройство, представляющее собой алюминиевый магнитный диск, которое используется как основное хранилище данных компьютера. Он не нуждается в постоянном подключении к источнику питания для хранения данных. Если компьютер отключат от источника питания, то все данные на диске будут сохранены и смогут быть извлечены при повторном подключении к источнику питания.
При отправке сообщения его копия сохраняется на диске компьютера, где работает приложение-отправитель. Копия не удаляется, пока сообщение не будет доставлено и сохранено на диске компьютера, где работает приложение-получатель.
Для использования гарантированной доставки архитектор ПО и команда разработки должны быть уверены, что она действительно необходима, потому что она обладает существенными недостатками:
Гарантированная доставка приводит к снижению производительности — сообщения будут доходить до получателя гораздо медленнее.
Реализация гарантированной доставки в системах с большим количеством сообщений требует большого объёма дискового пространства, которое значительно дороже, чем объёмы оперативной памяти. Если диск будет заполнен, то все последующие сообщения не смогут быть записаны, что приведёт к сбоям в обмене сообщениями.
Постоянный подписчик
Приложение-подписчик подключается к системе обмена сообщениями, когда устанавливает соединение с каналом. Пока приложение поддерживает соединение, оно может извлекать сообщения из канала. Приложения, поддерживающие соединение с каналом, называют активными.
Как только приложение закроет соединение, оно больше не сможет извлекать помещённые отправителем в канал сообщения. Приложения, закрывшие соединение с каналом, называют неактивными.
Приложение-подписчик может закрыть соединение с каналом намеренно, если его больше не интересуют сообщения из этого канала. При этом соединение может быть закрыто вне зависимости от намерения приложения-подписчика. Например, если само приложение перестало работать или закрыло соединение для проведения технических работ. В таком случае подписчик наверняка хотел бы получить сообщения за всё время, когда он не был подключён к системе обмена сообщениями.
Именно для таких случаев предназначен шаблон «постоянного подписчика», дополняющий канал «издание-подписка».
Постоянный подписчик — это архитектурный шаблон системы обмена сообщениями, который гарантирует, что получатель не пропустит ни одного сообщения, даже если он какое-то время был неактивен.
Процесс взаимодействия с использованием шаблона «постоянного подписчика» может выглядеть так:
Постоянный подписчик устанавливает соединение с каналом (становится активным).
Издатель помещает сообщения в канал.
Постоянный подписчик извлекает из канала сообщения издателя.
Постоянный подписчик закрывает соединение (становится неактивным).
Издатель помещает сообщения в канал.
Система обмена сообщениями сохраняет сообщения для постоянного подписчика.
Постоянный подписчик вновь становится активным.
Постоянный подписчик извлекает из канала сохранённые системой сообщения.
Непостоянный подписчик в этом процессе не смог бы получить сообщения, помещённые издателем в канал за то время, когда подписчик было неактивен.
Определите, какие утверждения относятся к шаблону «гарантированная доставка», а какие — к шаблону «постоянный подписчик». Перетащите карточку в соответствующую колонку.
Гарантированная доставка
Гарантирует, что сообщения будут доставлены получателю даже при отказе системы.
Гарантирует, что сообщения будут доставлены получателю даже при отказе системы.
Обеспечивает доставку сообщения за счёт сохранения сообщений на жёстком диске компьютеров отправителя и получателя.
Обеспечивает доставку сообщения за счёт сохранения сообщений на жёстком диске компьютеров отправителя и получателя.
Постоянный подписчик
Гарантирует, что получатель не пропустит ни одного сообщения.
Гарантирует, что получатель не пропустит ни одного сообщения.
Обеспечивает доставку сообщения после повторного подключения получателя за счёт сохранения сообщения системой.
Обеспечивает доставку сообщения после повторного подключения получателя за счёт сохранения сообщения системой.
Правильных ответов: 4, неправильных ответов: 0.
Технологии разработки систем обмена сообщениями
Описанные элементы архитектуры системы обмена сообщениями можно реализовать с помощью разных технологий. При этом одна система может сочетать несколько технологий. Архитектор ПО и команда разработки могут выбрать любые технологии.
Например, для реализации системы обмена сообщениями может быть использовано приложение ActiveMQ. Оно реализует каналы «точка-точка» и «издатель-подписчик», в дополнение к которым могут быть использованы архитектурные шаблоны гарантированной доставки и постоянного подписчика.
Для реализации сообщений могут быть использованы разные стили представления данных: JSON или XML.
Самые популярные протоколы для обмена сообщениями это:
Веб-сокет (WebSocket)
Веб-сокет заменяет протокол HTTP. Он используется для реализации мессенджеров.
Передача последовательности сообщений с телеметрическими данными (Message Queuing Telemetry Transport — MQTT)
Используется для реализации систем Интернета вещей (Internet of Things — IoT). Примером системы Интернета вещей является умный дом.
Расширенный протокол управления очередью сообщений (Advanced Message Queuing Protocol — AMQP)
Может использовать защищённые SSL-соединения. Используется для внутренних систем предприятия, так как обеспечивает быструю и надёжную передачу сообщений.
Понимая архитектурные элементы и стили системы обмена сообщениями, системный аналитик сможет разобраться в любой используемой технологии.
Подведём итоги
Обмен сообщениями между приложениями обеспечивает ориентированное на сообщения промежуточное ПО (MOM), которое также называют системой обмена сообщениями. MOM решают проблему ненадёжности сети.
Основными архитектурными элементами системы обмена сообщениями являются:
Сообщение
Неделимая единица данных, которая может быть передана через канал. Типами сообщений являются, например, HTTP-запрос и HTTP-ответ.
Канал
Виртуальная труба, соединяющая отправителя и получателя, через которую доставляются сообщения.
Все каналы сообщений делятся на два типа:
Точка-точка
Работает по принципу «первым пришёл, первым ушёл» и обеспечивает доставку любого сообщения только одному из конкурирующих потребителей.
Издание-подписка
Обеспечивает доставку копий сообщения отправителя множеству получателей.
Стиль «Обмен сообщениями» включает множество шаблонов, наиболее распространёнными из которых являются:
Гарантированная доставка сообщения
Обеспечивает передачу сообщений, находящихся в системе обмена сообщениями на момент её отказа, после восстановления её работоспособности.
Постоянный подписчик
Гарантирует, что получатель не пропустит ни одного сообщения, даже если он какое-то время был неактивен.
Описанные элементы архитектуры системы обмена сообщениями можно реализовать с помощью разных технологий. При этом одна система может сочетать несколько технологий. Понимая архитектурные элементы и стили системы обмена сообщениями, системный аналитик сможет разобраться в любой используемой технологии.
Draggable item. Ensure your screen reader is not in browse mode and then press space bar to lift.