Действительно ли возможно с RabbitMQ и Python сделать маршрутизацию с учетом информационного наполнения?
Стандарт AMQP и RabbitMQ утверждают, что поддерживали маршрутизацию с учетом информационного наполнения, но являются там какими-либо библиотеками для Python, которые поддерживают указывающую привязку на основе содержимого и т.д.?
Библиотека, которой я в настоящее время пользуюсь (py-amqplib http://barryp.org/software/py-amqplib/) кажется только основанной на теме поддержки маршрутизации с простым сопоставлением с образцом (#, *).
Ответ - «да», но это еще не все ...:)
Давайте сначала договоримся о том, что означает маршрутизация на основе содержимого. Есть два возможных значения. Некоторые говорят, что он основан на части сообщения заголовка . Другие говорят, что это основано на части сообщения 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. Затем в коде настройки клиента вы определяете тип обмена как ваш новый тип.
Надеюсь, это ответит на ваш вопрос!