Маршрутизация на основе контента с помощью RabbitMQ и Python

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

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

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

2 ответов


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

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

Если мы возьмем первое определение, это более или менее предположения, которые мы делаем: Данные где-то появляются, и они отправляются брокеру 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 определит, находится ли изображение в черно-белом или цветном цвете, и отправит его в "черно-белую" или "цветную" очередь, где какой-то подходящий клиент возьмет верх.

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

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


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

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

исходный код RabbitMQ находится в интернете, поэтому вы можете посмотреть тему exchange code здесь: 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-документов) без разбора всего тела сообщения.