Маршрутизация с учетом информационного наполнения с RabbitMQ и Python

Действительно ли возможно с RabbitMQ и Python сделать маршрутизацию с учетом информационного наполнения?

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

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

9
задан safl 19 July 2010 в 11:37
поделиться

1 ответ

Ответ - «да», но это еще не все ...:)

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

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

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

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

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

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

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

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

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

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

18
ответ дан 4 December 2019 в 09:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: