Введение в протокол AMQP
AMQP (Advanced Message Queueuing Protocol) — это стандартный протокол прикладного уровня, предоставляющий унифицированные сервисы обмена сообщениями и являющийся открытым стандартом для протоколов прикладного уровня, предназначенных для промежуточного программного обеспечения, ориентированного на сообщения. AMQP — это сетевой протокол для передачи асинхронных сообщений между процессами.
Клиенты и промежуточное ПО на основе этого протокола могут доставлять сообщения без ограничений разными клиентскими/промежуточными продуктами, разными языками разработки и т.д.
Основные характеристики AMQP — ориентированность на сообщения, очередь, маршрутизация (включая peer-to-peer и публикацию/подписку), надёжность и безопасность. AMQP обеспечивает поведение поставщиков сообщений и клиентов, обеспечивая истинную совместимость между разными поставщиками.
AMQP и JMS
JMS была попыткой стандартизировать раннее промежуточное программное обеспечение сообщений, стандартизировалась только на уровне API и далека от создания совместимости.
В отличие от JMS, AMQP — это протокол на уровне провода, описывающий формат данных, передаваемых по сети, в байтах. В результате любой инструмент, соответствующий этому формату данных, который создаёт и интерпретирует сообщения, совместим с другими совместимыми инструментами.
Состав ядра AMQP
Производитель
Новости производства.
ConnectionFactory
Фабрика, производящая Соединение.
Связь
Подключение, сетевая связь с Broker TCP/IP/Triple Handshake и Quad Wave.
AMQP-соединения обычно длинные. AMQP — это протокол прикладного уровня, который использует TCP для обеспечения надёжной доставки. AMQP использует механизмы аутентификации и обеспечивает защиту по TLS (SSL). Когда приложению больше не нужно подключаться к AMQP-прокси, оно должно плавно отключить AMQP-соединение, а не просто отключать TCP-соединение.
Канал
Сетевой канал — это лёгкое соединение, построенное поверх соединения. Почти все операции выполняются в каналах — каналах для чтения и записи сообщений, и клиенты могут создавать пары для каждого канала, каждая из которых представляет собой сессионную задачу.
Если Соединение сравнить с оптоволоконным кабелем, то канал Канала сравнивается с одним из волокон в оптоволоконном кабеле. На соединении можно создать любое количество каналов.
Большинство наших бизнес-операций осуществляется через интерфейс Channel, включая:
- queueDeclare
- ExchangeDeclare для коммутатора
- queueBind queueBind Bind
- Опубликовать сообщение basicОпубликовать
- Потребительские новости, BasicConconsume и т.д.
Брокер
Принять подключение клиента для реализации AMQP-сервисов сущности, таких как rabbitmq.
VirtualHost (веб-хостинг)
Виртуальный хостинг, используемый для логической изоляции, виртуальный хост может иметь несколько обменов и очередей, и один и тот же виртуальный хост не может иметь обмены с одинаковым именем.
Для реализации нескольких изолированных сред (пользователей, пользовательских групп, коммутаторов, очередей и т.д.) на одном прокси-сервере AMQP предлагает концепцию виртуальных хостов (виртуальных хостов — vhosts). Это очень похоже на концепцию веб-хостинга веб-серверов, которая обеспечивает полностью изолированную среду для AMQP-сущностей. Когда соединение установлено, клиент AMQP указывает, какой виртуальный хост использовать.
Обмен
Коммутатор принимает сообщения и отправляет их в связанную очередь на основе ключа маршрутизации (без возможности хранения сообщений).
Коммутатор — это AMQP-сущность, используемая для отправки сообщений. После того как коммутатор получает сообщение, он направляет его в одну или нулевую очередь. Используемый алгоритм маршрутизации определяется типом коммутатора и правилами связывания.
Тип переключателя:
- Прямой обмен
- Обмен фанаут
- Обмен темами
- Обмен заголовками
Свойства коммутаторов:
- Название: Название коммутатора
- Долговечность: Флаг сохранения, указывающий на сохранение этого переключателя
- Автоудаление: Флаг удаления, указывающийКогда все очереди завершены с помощью этого обмена, удаляются ли они
- Аргументы: зависит от самого агента
Статус коммутатора:
Постоянные коммутаторы будут существовать после перезапуска брокера, а staging коммутаторы — нет (их нужно будет заново декларировать после возвращения брокера в онлайн).
Стандартный переключатель
Стандартная биржа на самом деле является прямой обменом, который предварительно объявлен брокером сообщений и не имеет имени (имя — пустая строка).
Можно представить себе стандартный переключатель как специальный переключатель с прямым подключением. Имя коммутатора по умолчанию: Null string (AMQP по умолчанию) Тип переключателя по умолчанию: прямой подключённый переключатель
При создании очереди, если коммутатор, который должен быть привязан, не указан, он автоматически будет привязан к коммутатору по умолчанию, а имя ключа маршрутизации привязки будет совпадать с именем очереди.
Прямое подключение к коммутатору
Коммутатор с прямым подключением доставляет сообщения в очередь соответствующих связывающих ключей на основе ключа маршрутизации, который передаёт сообщение. Уникастная маршрутизация, используемая прямым коммутатором для обработки сообщения.
При создании очереди, если она привязана к прямому коммутатору, ей не нужно указывать имя ключа маршрутизации, так как по умолчанию будет иметь имя ключа маршрутизации, совпадающее с именем очереди.
Очередь из коммутаторов с прямым подключением обычно распределяет задачи между несколькими потребителями по одному циклу (мы называем это опросом).
Рабочий процесс:
- При привязке очереди к коммутатору дайте ей ключ связывания, предполагая R;
- Когда сообщение с ключом маршрутизации отправляется коммутатору с прямым подключением, коммутатор направляет его в очередь с ключом маршрутизации.
Выключатели вентиляторов
Коммутатор вентилятора направляет сообщения ко всем очередям, привязанным к нему, независимо от ключа маршрутизации.
Если N очередей привязаны к секторному коммутатору, то при отправке сообщения на этот секторный коммутатор отправляет копию сообщения всем N очередям отдельно. Переключатели вентиляторов обычно используются для обработки трансляционной маршрутизации сообщений.
Сценарии применения:
трансляционные сообщения; Функция группового чата.
Смена темы
Переключение темы отправляет сообщения в одну или несколько очередей в зависимости от ключа маршрутизации и типа Exchange, и мы часто используем его для реализации различных подписок публикации/подписки, то есть публикации.
Правила маршрутизации для коммутаторов с прямым подключением строго согласованы, то есть ключ маршрутизации должен совпадать с ключом связи перед отправкой сообщения в очередь. Правила маршрутизации переключателя темы — это нечеткие совпадения, которые можно реализовать, выполнив некоторые правила через джокеры.
В нём указано:
- В клавише связки могут быть два специальных символа * и # для нечеткого совпадения. где * используется для совпадения слова, #用于匹配多个单词 (может быть нулем)
- Ключ маршрутизации — это строка, разделённая точками (каждую отдельную строку, разделённую точкой, мы называем словом)
- Когда производитель отправляет сообщение Routing Key=A.A.A.A, удовлетворяется только A.*.*, и оно будет направлено только в очередь1.
- Когда производитель отправляет сообщение Routing Key=A.B.A, удовлетворяющее A.*.* и *.B.*, будет маршрутизировано в очередь 1 и очередь 2.
- Когда производитель отправляет сообщение Routing Key=A.B.C, то A.*.*, *.B.* и *.* удовлетворяются. C маршрутизируется в очередь 1, очередь 2, очередь 3.
Сценарии применения:
- обновления новостей, связанных с категориями или тегами;
- Фоновые задачи, выполняемые несколькими работниками, каждый из которых отвечает за выполнение определённых конкретных задач.
Головной переключатель
Коммутаторы заголовков не зависят от правил сопоставления ключа маршрутизации для привязки ключей к маршрутизационным сообщениям, а скорее соответствуют атрибуту заголовка в содержимом отправленного сообщения.
Головные переключатели можно рассматривать как ещё одно проявление прямого подключения коммутатора. Однако ключ маршрутизации прямого коммутатора должен быть строкой, и значения атрибутов заголовка не ограничены этим, они могут быть даже целыми числами или хеш-значениями (словари) и т.. Больше гибкости (но на практике мы редко используем головные выключатели).
Рабочий процесс:
- Когда очередь привязана к переключательу заголовка, одновременно привязываются несколько заголовков для сопоставления.
- Входящие сообщения несут заголовок и параметр «x-match». Когда «x-match» установлен в «любой», можно сопоставить любое значение заголовка, а когда «x-match» — «все», все значения заголовка должны быть сопоставлены.
Краткое описание переключателя
Связывание
Виртуальное соединение между Exchange и Queue.
BindingKey — это описание правил для привязок Exchange и Queue. Ключ привязки указывает, какой тип маршрутизационного ключа будет назначен текущей связанной очереди в текущей бирже.
Ключ маршрутизации
Правила маршрутизации, которые виртуальная машина может использовать для определения маршрутизации конкретного сообщения.
Ключ связи против ключа маршрутизации
- Ключ связывания — это ключ связи между очередью и коммутатором;
- Ключ маршрутизации — это информация, которую производитель отправляет коммутатору;
- Когда ключ связи и ключ маршрутизации совпадают, поместите сообщение в соответствующую очередь.
Связывающий ключ — это описание правил Exchange и Queue binding, которое используется для разбора, когда Exchange получает сообщение: сообщение, полученное Exchange, будет иметь поле Routing Key, и Exchange сопоставляет этот Маршрутизационный ключ со всеми связывающими ключами текущей Exchange, и если требования выполнены, он отправляется в Binding Ключ привязан к очереди для отправки сообщения.
Ключ связывания против ключа маршрутизации в различных коммутаторах
Переключатель по умолчанию: Binding Key — это имя очереди, которое нельзя настраивать. Ключ маршрутизации также является именем очереди до успешной маршрутизации в очередь Прямой коммутатор соединения: Ключ связывания — это имя очереди, которое можно настраивать. Ключи маршрутизации можно успешно направить в очередь только если ключ связи совпадает с ним Переключатель вентилятора: без клавиши связи; Конечно, ключа маршрутизации нет. Автоматически маршрутизируется ко всем очередям, привязанным к коммутатору Смена темы: кастомный ключ связывания; Настройте ключ маршрутизации. Ключ маршрутизации==Ключ связывания, и нечеткое совпадение должно быть успешно направлено в очередь Переключатель головки: без клавиши привязки; Конечно, ключа маршрутизации нет. Совпадения на основе атрибута заголовка в содержимом отправленного сообщения
Очередь
Хранит сообщения, которые вот-вот будут проглощены приложением.
Свойства очереди:
- Название: Название очереди
- Долговечность: очередь остаётся после перезапуска брокера сообщений
- Эксклюзив: используется только одним соединением, и очередь удаляется при закрытии соединения
- Автоудаление: удалено, когда последний пользователь отписывается
- Аргументы: некоторые брокеры сообщений используют его для выполнения дополнительных функций, аналогичных TTL
Создание очереди: Очереди можно использовать только после их объявления. Если очередь ещё не существует, объявление очереди создаёт её. Если объявленная очередь уже существует и атрибуты идентичны, объявление не влияет на исходную очередь. Если атрибуты в объявлении отличаются от тех, что в существующей очереди, создаётся исключение на уровне канала с кодом ошибки 406.
Сохранение очереди: Очередь сохранения хранится на диске и остаётся там при перезагрузке брокера. Очереди, которые не сохраняются, называются временными очередями. Не все сценарии и случаи требуют сохранения очереди.
Сохраняющаяся очередь не делает сообщения, направленные к нему, постоянными. Если агент сообщений отключается и перезапускается, очередь сохранения будет объявлена повторно во время перезапуска, и в любом случае можно восстановить только сохраняющиеся сообщения.
Потребитель
Новости потребительского потребления. В AMQP существует два способа для потребителей получать ожидающие сообщения:
Промежуточное программное обеспечение сообщений доставляет сообщения потребителям (push API) Потребители активно получают сообщения (pull API) Примечание: когда несколько потребителей слушают одну и ту же очередь, сообщения в очереди будут восприниматься только одним из потребителей (не один раз для каждого потребителя)
Сообщение
Данные, передаваемые между сообщениями, сервисами и приложениями, состоят из свойств и тел.
Атрибуты изменяют сообщения, такие как приоритет сообщения, задержка и другие продвинутые функции, а основная часть — это содержимое текста сообщения.
Свойства сообщения:
- Тип контента
- Кодирование контента
- Ключ маршрутизации
- Режим доставки (постоянный или нет)
- Режим доставки (постоянный или непостоянный)
- Приоритет сообщения
- Временная метка публикации сообщения
- Срок годности
- Идентификатор приложения издателя
Основная часть сообщения: Помимо атрибутов, AMQP-сообщения также содержат полезную нагрузку (данные, которые фактически передаёт сообщение), которую AMQP-прокси рассматривает как непрозрачный массив байт.
Брокер сообщений не инспектирует и не изменяет полезную нагрузку. Сообщения могут содержать только атрибуты без полезной нагрузки. Обычно используются данные в сериализированном формате, таких как JSON, и для экономии денег буферы протокола и MessagePack сериализируют структурированные данные для публикации в виде полезной загрузки сообщений. AMQP и её коллеги обычно используют поля «content-type» и «content-encoding» для связи с сообщениями с целью идентификации полезных нагрузок, но это основано только на конвенциях.
Сохранение сообщений: Сообщения публикуются в постоянной форме, а агент AMQP хранит это сообщение на диске. Если сервер перезагружается, система подтверждает, что полученное сообщение о сохранении не потеряно.
Простое отправление сообщения на постоянный коммутатор или маршрутизация его в сохраняющуюся очередь не делает сообщение постоянным: сохранение сообщения полностью зависит от режима сохранения самого сообщения.
Регулярная публикация сообщений может повлиять на производительность.
Рабочий процесс AMQP
Издатель публикует сообщение через биржу.
Коммутатор распределяет входящие сообщения в очередь, привязанную к коммутатору, согласно правилам маршрутизации.
Наконец, агент AMQP передаст сообщение потребителю, который подписался на эту очередь, или пользователь получит его самостоятельно по мере необходимости.
Механизм передачи сообщений AMQP
Подтверждение сообщения
Потребители иногда не обрабатывают сообщения или иногда сбывают напрямую. И причины, связанные с сетью, тоже могут вызвать различные проблемы. Это подводит нас к вопросу, когда правильное время для агентов AMQP удалять сообщения.
Два режима подтверждения сообщений AMQP:
Режим автоподтверждения: Удаляйте сообщение сразу после его отправки потребителю через промежуточное программное обеспечение. (Используя метод AMQP: basic.deliver или basic.get-ok) Режим явного подтверждения: дождитесь, пока пользователь отправит подтверждение, прежде чем удалять сообщение. (Используя метод AMQP: basic.ack) Если потребитель кладёт трубку, не отправив подтверждение, агент AMQP передаёт сообщение другому потребителю. Если в этот момент нет доступных потребителей, брокер сообщений ждёт, пока следующий потребитель зарегистрируется в этой очереди, и затем пытается доставить сообщение снова.
Отклонение сообщений
Когда потребитель получает сообщение, процесс обработки может быть успешным или неудачным. Пользователь может сообщить брокеру сообщений (промежуточному программному обеспечению), что сообщение не было обработано (или не завершено) из-за «отклонённого сообщения». Когда сообщение отклонено, потребитель может сказать брокеру, что с ним делать — уничтожить его или вернуть в очередь.
Если в очереди только один потребитель, убедитесь, что вы не отклоняете сообщение и не помещаете его обратно в очередь, из-за чего сообщение будет бесконечно циклироваться на том же потребителе.
В AMQP метод basic.reject используется для выполнения операции отклонения сообщений. Однако у basic.reject есть ограничение: нельзя использовать его для отклонения нескольких сообщений с подтверждениями. Но если вы используете RabbitMQ, вы можете использовать расширение AMQP 0-9-1, называемое отрицательными подтверждениями (также называемыми nacks), чтобы решить эту проблему.
Исходный текст:Вход по гиперссылке виден.
|