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