RabbitMQ — один из наиболее часто используемых брокеров сообщений в мире, и он имеет огромное значение для компаний, которые хотят создавать быстрые, надежные и легко масштабируемые приложения.
Человечество всегда имело потребность в общении, и, конечно же, IT-системы и программное обеспечение имеют такие же потребности. Здесь основы таковы: служба - отправитель, служба - получатель, сообщение.
Иногда отправителю нужен быстрый ответ, иногда вы ждете ответа, иногда вы вообще не ожидаете ответа.
Существуют разные способы общения, это касается и IT-систем. Один из таких способов — соединение двух систем друг с другом через очередь. Очередь сообщений позволяет приложениям взаимодействовать, отправляя сообщения друг другу. Очередь сообщений обеспечивает временное хранилище сообщений, когда программа назначения занята или не подключена.
В первом разделе мы познакомимся с очередью сообщений и компонентами, необходимыми для ее реализации. Мы также поговорим о преимуществах использования очереди сообщений.
Очередь сообщений
Начнем с основ.
Отправляющее приложение или служба, если хотите, называется Издателем. Это часть системы, которая отправляет сообщение Брокеру.
Эти сообщения содержат информацию, на которую могут отреагировать другие приложения. Издатели несут ответственность за все сообщения, поступающие в систему. Принимающее приложение называется Потребителем. Это часть системы, которая получает сообщение из очереди сообщений. Сообщения в RabbitMQ обычно передаются от брокера потребителям.
Предполагается, что Потребитель должен предпринять действие после получения сообщения, будь то задача или информация, которую необходимо обработать.
Брокер — это программное обеспечение, которое действует как посредник между службами, получая сообщения от одной службы (издателей) и передавая их другим (потребителям) для выполнения задачи.
Сам брокер сообщений может иметь одну или несколько очередей. Брокер немного сложнее, чем показано здесь, но мы углубимся в эти детали чуть позже.
Очередь — это группа сообщений, ожидающих обработки. Сообщения всегда добавляются в конец очереди. Эта очередь находится внутри брокера.
Сообщение — это данные, передаваемые между издателем и потребителем. По сути, сообщения представляют собой массивы байтов с добавленными сверху заголовками.
Примером сообщения может быть что-то, что сообщает одной системе начать обработку задачи. Оно может содержать информацию о выполненной задаче или просто сообщение.
Варианты использования очереди сообщений
Представьте, что у нас есть веб-приложение, которое позволяет пользователям загружать изображение профиля. После того, как пользователь выполнит загрузку, он может решить, какую часть изображения он хочет использовать, следует ли ее масштабировать и т.д.
Когда пользователя устраивает изображение, он сохраняет новые настройки. Веб-приложение отправляет изображение вместе с настройками в часть системы, отвечающую за «Обработку изображений». Обычно это система производит оптимизацию изображения для Интернета.
Это сообщение помещается в очередь, определенную в брокере сообщений. Сообщения организуются в том же порядке, в котором они поступают в очередь: «первым пришел — первым обслужен» (FIFO). Потребитель получает сообщение и обрабатывает запрос на масштабирование изображения.
Преимущества очереди сообщений
Микросервисы — это группа компонентов, которые взаимодействуют с помощью централизованной службы, например очереди сообщений.
Противоположность микросервисной системы называется монолитной системой, где одни части системы напрямую взаимодействует с другими частями системы. По этой причине микросервисные приложения часто являются «несвязанными», а монолитные приложения — «сильно связанными».
Кроме того, использование брокера сообщений в вашей системе означает, что вы осуществляете связь между компонентами асинхронно. Это очень похоже на отправку электронного письма: ответ отправляется тогда, когда это удобно.
Противоположностью этому является прямое общение или «синхронное» общение, которое больше похоже на разговор по телефону. Ответ немедленный, и как только вы повесите трубку, разговор закончится.
Асинхронная связь и развязка внутри систем могут быть очень полезными. Ниже приведены некоторые преимущества наличия очереди сообщений как части архитектуры.
Система микросервисов разделена на два или более небольших сервиса, где каждый микросервис разрабатывается отдельно. Сумма всех микросервисов составляет общее приложение. Каждый микросервис работает индивидуально и не связан с другими.
По этой причине разные микросервисы могут быть написаны на разных языках, разрабатываться разными командами и развиваться независимо.
Если один из микросервисов выйдет из строя или по какой-то другой причине будет недоступен, остальные сервисы в системе продолжат выполнять свои задачи самостоятельно. Это делает приложение отказоустойчивым и стабильным.
С другой стороны, в монолитной системе сбой одной службы может вызвать проблемы или даже привести к выходу из строя всего приложения.
Система, использующая очередь сообщений, предлагает временное хранилище для сообщений, ожидающих обработки потребителем. Таким образом, издатели могут продолжать создавать сообщения, не беспокоясь о самом сообщении. Пока сообщения попадают в очередь, они находятся в безопасности внутри брокера и имеют минимальный риск потери.
Если потребитель не может обработать сообщение, оно может быть доставлено повторно несколько раз, пока потребитель не сможет его успешно обработать.
Давайте приведем еще один распространенный пример: почти каждая IT-система так или иначе включает в себя базу данных. В тесно связанной архитектуре приложение должно дождаться ответа сервера базы данных, прежде чем оно сможет завершить транзакцию. Если произойдет сбой базы данных, возможно, произойдет сбой и приложения, а зачем нам сбой всего приложения из-за небольшого обновления в базе данных? Отделив базу данных от приложения и добавив между ними очередь сообщений, потребитель может получить данные от брокера и выполнить действие с базой данных позже, что делает приложение более отказоустойчивым.
Высокомасштабируемая система означает, что ее можно настроить для обработки необходимого объема рабочей нагрузки в любой момент времени. Когда система испытывает большую нагрузку - вы масштабируете ее, если рабочая нагрузка снижается - вы масштабируете ее. Подобно тому, как когда вы идете в магазин за продуктами и очередь на кассу становится все длиннее, на помощь добавляются дополнительные кассиры.
Добавление большего количества потребителей в существующую систему микросервисов помогает сократить очереди в часы пик, и вы можете удалять потребителей, когда они не нужны. Вам не нужно строить сверхразмерную систему только для того, чтобы иметь возможность справляться с пиками.
Ритейлеры и сервисы потокового мультимедиа часто используют масштабирование, поскольку они часто знают конкретные моменты, когда их приложения испытывают большую нагрузку.
Микросервисная система является устойчивой системой, что означает, что она может быстро восстанавливаться после сложных условий. Поскольку использование очередей сообщений разделяет ваши службы, делая их несвязанными друг с другом, последствия сбоя одной службы не повлияют на другие.
Служба по-прежнему может публиковать сообщения в очереди, и сообщения будут оставаться в очереди до тех пор, пока неисправная служба не будет запущена и не заработает. Это также применимо, когда служба нуждается в обновлении или если разработчики хотят добавить новую службу в уже существующую систему.
Асинхронная связь в очереди сообщений означает, что сообщения в очереди не должны обрабатываться немедленно. Вместо этого они будут обработаны, как только назначенная служба будет готова. Это позволяет системе продолжать обслуживать вас или других пользователей с уверенностью, что задача будет выполнена не сразу, а в кратчайшие сроки.
Чтобы прояснить разницу между синхронным и асинхронным общением: при совершении покупок в Интернете асинхронная система позволит вам продолжить навигацию по интернет-магазину после того, как вы разместите заказ и нажмете «Отправить». Платеж будет обработан в фоновом режиме, а подтверждение заказа будет отправлено на ваш адрес электронной почты, когда это возможно.
С другой стороны, синхронная система временно заблокирует интернет-магазин до тех пор, пока система не одобрит всю серию событий.