Контентно-ориентированная маршрутизация с RabbitMQ и Python - PullRequest
9 голосов
/ 19 июля 2010

Возможно ли с RabbitMQ и Python выполнять маршрутизацию на основе контента?

Стандарт AMQP и RabbitMQ утверждают, что поддерживают маршрутизацию на основе контента, но есть ли библиотеки для Python, которые поддерживают указание привязок на основе контентаetc.?

Библиотека, которую я сейчас использую (py-amqplib http://barryp.org/software/py-amqplib/), кажется, поддерживает только тематическую маршрутизацию с простым сопоставлением с шаблоном (#, *).

Ответы [ 2 ]

18 голосов
/ 11 августа 2010

Ответ "да", но это еще не все ...:)

Давайте сначала договоримся о том, что означает контентно-ориентированная маршрутизация. Есть два возможных значения. Некоторые люди говорят, что он основан на части сообщения header . Другие говорят, что оно основано на части сообщения data .

Если мы примем первое определение, это более или менее допущения, которые мы делаем: Данные появляются где-то и отправляются брокеру AMQP каким-то программным обеспечением. Мы предполагаем, что эта часть программного обеспечения знает достаточно о данных, чтобы поместить пары ключ-значение (KV) в заголовок сообщения, описывающего содержимое. В идеале, отправитель также является производителем данных, поэтому он имеет столько информации, сколько мы могли бы захотеть. Допустим, данные являются изображением. Затем мы можем сделать так, чтобы отправитель поместил пары KV в заголовок сообщения следующим образом:

width=1024
height=768
mode=bw
photographer=John Doe

Теперь мы можем реализовать маршрутизацию на основе содержимого, создавая соответствующие очереди. Допустим, у нас есть отдельная операция для черно-белых изображений и отдельная операция для цветных изображений. Мы можем создать две очереди, одна из которых получает сообщения с mode=bw, а другая с mode=colour. Затем у нас есть отдельные клиенты, которые слушают эти очереди. Брокер выполняет маршрутизацию, и в нашем клиенте нет ничего, что должно знать о маршрутизации.

Если мы возьмем второе определение, мы пойдем из разных предположений. Мы предполагаем, что данные появляются где-то и отправляются брокеру AMQP каким-то программным обеспечением. Но мы предполагаем, что не имеет смысла требовать, чтобы это программное обеспечение заполняло заголовок парами KV. Вместо этого мы хотим принять решение о маршрутизации на основе данных .

В AMQP есть два варианта: вы можете принять решение о внедрении нового обмена для вашего конкретного формата данных или делегировать маршрутизацию клиенту.

В RabbitMQ есть прямой (1-к-1), разветвленный (1-к-N), заголовки (отфильтрованные по заголовкам 1-к-N) и тематические (отфильтрованные по темам 1-N) обмены , но вы можете реализовать свои собственные в соответствии со стандартом AMQP. Это потребует прочтения большого количества документации RabbitMQ и реализации обмена в Erlang.

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

Итак, по вашему второму вопросу, вы действительно ничего не делаете в своем клиенте, который выполняет привязку к контенту. Либо ваш клиент (ы) работает, как описано выше, либо вы создаете новый тип обмена в самом RabbitMQ. Затем в своем коде установки клиента вы определяете тип обмена как ваш новый тип.

Надеюсь, это ответит на ваш вопрос!

5 голосов
/ 01 июня 2011

В RabbitMQ маршрутизация - это процесс, посредством которого биржа решает, в какие очереди помещать ваше сообщение. Вы публикуете все сообщения для обмена, но вы получаете только сообщения из очереди. Это означает, что обмен является активной частью процесса, который принимает некоторые решения о пересылке или копировании сообщений.

Обмен темами, включенный в RabbitMQ, просматривает строку входящих сообщений (routing_key) и сопоставляет ее с шаблонами (binding_keys), предоставленными всеми очередями, которые заявляют о своем желании получать сообщения от обмена.

Исходный код RabbitMQ находится в сети, поэтому вы можете посмотреть код обмена тем здесь: http://hg.rabbitmq.com/rabbitmq-server/file/9b22dde04c9f/src/rabbit_exchange_type_topic.erl Большая сложность заключается в обработке структуры данных, называемой trie, которая обеспечивает очень быстрый поиск. Фактически такая же структура данных используется внутри интернет-маршрутизаторов.

Здесь найден обмен заголовками http://hg.rabbitmq.com/rabbitmq-server/file/9b22dde04c9f/src/rabbit_exchange_type_headers.erl вероятно, легче понять. Как вы можете видеть, не требуется много кода, чтобы сделать обмен другого типа. Если вы хотите изучить содержимое (или, может быть, просто заглянуть в первые несколько байтов сообщений, вы должны быть в состоянии быстро отличить XML от JSON, а не от чего-то еще. И если ваши объекты JSON и документы XML поддерживают определенную последовательность элементов, тогда вы должен иметь возможность различать различные объекты JSON (или типы документов XML) без анализа всего тела сообщения.

...