AMQP по-русски

    Сегодня довольно мало информации о протоколе AMQP (Advanced Message Queueing Protocol) и его применении, особенно на русском языке. А вообще это — замечательный, уже достаточно широко поддерживаемый открытый протокол для передачи сообщений между компонентами системы с низкой задержкой и на высокой скорости. При этом семантика обмена сообщениями настраивается под нужды конкретного проекта. Такие решения существовали и ранее, но это первый стандарт, для которого существует большое количество свободных реализаций.

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

    Сегодня тема доставки информации в реальном времени является крайне актуальной (достаточно вспомнить хотя бы Twitter, Google Wave). И здесь системы передачи сообщений могут служить внутренним механизмом обмена данными, который обеспечивает доставку данных (изменений данных) клиентам.

    Я не ставлю своей целью сегодня рассказать о том, как писать приложения для AMQP. Хочу лишь немного рассказать о том, что это совсем не страшно, не очень сложно, и действительно работает, хотя стандарт находится еще в развитии, выходят новые версии протокола, брокеров и т.п. Но это уже вполне production-quality. Расскажу лишь базовые советы, чтобы помочь “въехать” в протокол.

    Для начала, маленькая коллекция ссылок (в основном, на английском): что такое вообще обмен сообщениями и почему AMQP такой (Messaging in general and AMQP design); сравнение различных реализаций обмена сообщениями, в частности основанных на AMQP (Message Queue Comparison); клиентская библиотека AMQP для Twisted Framework (Python) с поддержкой Thrift (Thrift, AMQP in Twisted); руководство от Red Hat о том, что такое messaging и как работать с AMQP, описывает их “коробочный” продукт на основе AMQP, но подходит и для любых AMQP-брокеров (AMQP Programming Tutorial for C++, Java, and Python); достаточно много документации, описаний архитектурных решений на сайте ZeroMQ, который не совсем AMQP-брокер, но общая архитектура, детали реализации представляют отдельный интерес; обзорная статья от Duncan McGregor о txAMQP и AMQP в общем (A Simfonia on Messaging with txAMQP, II, III).

    Далее необходимо выбрать AMQP-брокер, который вы будете использовать. При выборе необходимо рассматривать как собственно характеристики сервера: скорость работы, надежность, легкость установки и поддержки, но также внимательно смотреть на версию AMQP-протокола, которая поддерживается брокером, — она должна совпадать с версией клиентской AMQP-библиотеки. Из брокеров я бы посоветовал RabbitMQ, написанный на Erlang, и Qpid, версии на C++ (AMQP 0-10) и Java (0-8, 0-9).

    Сам протокол AMQP устроен достаточно интересно: на самом нижнем уровне определяется формат кодирования данных в бинарный вид для передачи по TCP-соединению, выше лежит формат передачи RPC-запросов между сервером и клиентом. Сама семантика работы с сообщениями, создания очередей и т.п. описывается в XML-спецификации, которая по сути задает RPC-интерфейс сервера и клиента (примеры таких XML-файлов для версий 0-8 и 0-10). Этот XML является последней и конечной спецификацией протокола. Более того, версии протокола 0-8 и 0-10 отличаются настолько сильно, что поддерживать их одновременно вряд ли возможно в одной программе. Что еще более интересно, иногда такие spec-файлы для разных брокеров AMQP, формально поддерживающих одну и ту же версию протокола, отличаются настолько, что не являются взаимозаменяемыми. Но это скорее небольшие технические проблемы.

    AMQP основан на трех понятиях:
    1. Сообщение (message) — единица передаваемых данных, основная его часть (содержание) никак не интерпретируется сервером, к сообщению могут быть прицеплены структурированные заголовки.
    2. Точка обмена (exchange) — в нее отправляются сообщения. Точка обмена распределяет сообщения в одну или несколько очередей. При этом в точке обмена сообщения не хранятся. Точки обмена бывают трех типов: fanout — сообщение передается во все прицепленные к ней очереди; direct — сообщение передается в очередь с именем, совпадающим с ключом маршрутизации (routing key) (ключ маршрутизации указывается при отправке сообщения); topic — нечто среднее между fanout и exchange, сообщение передается в очереди, для которых совпадает маска на ключ маршрутизации, например, app.notification.sms.* — в очередь будут доставлены все сообщения, отправленные с ключами, начинающимися на app.notification.sms.
    3. Очередь (queue) — здесь хранятся сообщения до тех пор, пока не будет забраны клиентом. Клиент всегда забирает сообщения из одной или нескольких очередей.

    Меня в AMQP привлек эффективный бинарный протокол, ориентированность протокола на минимальные задержки и гибкость настройки. Я его использовал для рассылки сообщений всем серверам кластера (fanout exchange) и организации аналогов “почтовых ящиков”, в которые доставляются сообщения, адресованные определенным клиентам (direct exchange). Для получения сообщений нет необходимости опрашивать сервер, достаточно подписаться на сообщения из очереди, и сервер передаст их в тот момент, когда они появятся.

    В качестве клиентской библиотеки я выбрал библиотеку txAMQP для Twisted Framework (Python). В общем и целом все работает, но где-то требуются небольшие “доделки” и “подкрутки”, которые я планирую опубликовать на launchpad. В AMQP и вокруг AMQP есть много интересного и перспективного. К примеру, брокер RabbitMQ умеет масштабироваться и работать в едином кластере. Мне кажется, это очень полезная и перспективная технология.
    Поделиться публикацией

    Похожие публикации

    Комментарии 31
      –1
      спасибо, отличный материал!
        +2
        Очень интерестно, хотелось бы добавить несколько ссылок:

        Реализация на Пыхапе
        Реализация на Питоне

        Спасибо, что подняли тему!
        –3
        А вот и вторая часть) спасибо!
          0
          Хорошо написано, основательно.
            0
            От себя могу так же порекомендовать RabbitMQ.
              0
              Присоединяюсь, пробовал и его и Qpid. Qpid проще в процессе прототипирования (проще запустить и управлять), а в продакшне уже Rabbit!
              • НЛО прилетело и опубликовало эту надпись здесь
                  0
                  Хмм. в qpid amqp версии (если я правильно помню ) 0-10, в раббит — 0-8, то есть несовместимо. Все таки отлаживать лучше на той же версии, что и в продакшн.
                    0
                    C Qpid не все так просто. Java-версия умеет 0-8.
                0
                Все-таки до сих пор не очень понятны use cases для этого.

                Если не затруднит — приведите пару примеров.

                К примеру, если я использую Erlang для разработки системы, то её компоненты могут обмениваться сообщениями при помощи встроенных средств. Есть ли в такой системе применение какой-либо MQ системе?

                  0
                  Мне трудно сказать, я не эксперт в Erlangе, знаю, что там замечательный внутренний messaging. Чаще всего рано или поздно придется интегрироваться с другими системами, написанными на чем-то еще. И вот тогда «прослойка» в виде AMQP-брокера может очень даже пригодится.

                  P.S. RabbitMQ (AMQP-брокер) как раз написан на Erlang.
                    +1
                    Между компонентами системы, которая целиком написана на Erlang тоже может оказаться удобным обмен по AMQP. Дело тут даже не в интеграции, а в гибкой и удобной маршрутизации сообщений между узлами.
                    +1
                    Ерланговский обмен сообщениями и AMQP — разные вещи. Заменять одно другим не имеет смысла, разве что в некоторых случаях, близким к экспериментальным. AMQP может применяться для группового обмена в гетерогенных системах.
                  • НЛО прилетело и опубликовало эту надпись здесь
                    • НЛО прилетело и опубликовало эту надпись здесь
                        0
                        Мне кажется, что обязательно надо об этом написать!
                        • НЛО прилетело и опубликовало эту надпись здесь
                            0
                            Спасибо большое, даешь AMQP в массы!
                            • НЛО прилетело и опубликовало эту надпись здесь
                                0
                                С транзакциями все впорядке, я правда не скажу как это у Rabbit-а сделано, но код у них довольно чистый, и эрланг для MQ просто чудесно расписан, можно и патч им написать, если не реализованно
                        0
                        В качестве клиентской библиотеки я выбрал библиотеку txAMQP для Twisted Framework (Python). В общем и целом все работает, но где-то требуются небольшие “доделки” и “подкрутки”, которые я планирую опубликовать на launchpad.

                        Ну как, планы реализовались?
                          0
                          wiz, нет еще… Если интересно, могу кинуть код лично. Публиковать еще не готов пока ;)
                            0
                            Можно, для начала, вкратце, суть изменений? Сильно опасные баги или что там пофиксено?
                              0
                              Там мелкие багфиксы в разных точках, где что-то ломалось. Ничего серьезного.
                          0
                          Спасибо, лично мне вы помогли начать в этом разбираться.
                          Есть опечатки, перечитайте и поправьте.
                          • НЛО прилетело и опубликовало эту надпись здесь
                              0
                              Спасибо за пост!
                              Можно подробнее о преимуществах и недостатках по сравнению с иными алгоритмами, выполняющие те же задачи? (ссылки, другие посты по данной теме, которые вы рекомендуете к прочтению)
                                0
                                Если сравнивать брокеры сообщений — они все примерно похожи на AMQP. Если смотреть на другие варианты очередей (beanstalkd, Kafka, и т.п.) — это другие решения с другими характеристиками. ØMQ — обмен сообщениями без брокера.

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое