Как я могу использовать Pika для отправки и получения сообщений RabbitMQ? - PullRequest
4 голосов
/ 27 марта 2011

У меня возникла проблема с тем, чтобы Pika работала с ключами маршрутизации или обменами так, чтобы это соответствовало документации AMQP или RabbitMQ.Я понимаю, что в документации RabbitMQ используется более старая версия Pika, поэтому я проигнорировал их пример кода.

То, что я пытаюсь сделать, это определить очередь, «порядок» и иметь двух потребителей, один из которых обрабатывает ключ «exchange» или routing_key, а другой - «тест».Из этой документации RabbitMQ это должно быть достаточно просто, используя прямой обмен и ключи маршрутизации или обмен темами.

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

На стороне потребителя не совсем понятно, как мне связать потребителя с обменом или обработкой ключей маршрутизации, и документация на самом деле не помогает.

Если я отброшу все идеи илиобмены и ключи маршрутизации, сообщения стоят в очереди и легко обрабатываются моим потребителем.

Любые указатели или примеры кода, которые есть у людей, были бы хороши.

1 Ответ

11 голосов
/ 27 марта 2011

Как оказалось, мое понимание AMQP было неполным.

Идея заключается в следующем:

Клиент :

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

channel.basic_publish(exchange='order',
                      routing_key="order.test.customer",
                      body=pickle.dumps(data),
                      properties=pika.BasicProperties(
                          content_type="text/plain",
                          delivery_mode=2))

Потребитель

Когда канал открыт, мы объявляем обмен и очередь

channel.exchange_declare(exchange='order', 
                         type="topic", 
                         durable=True, 
                         auto_delete=False)

channel.queue_declare(queue="test", 
                      durable=True, 
                      exclusive=False, 
                      auto_delete=False, 
                      callback=on_queue_declared)

Когда очередь готова, в обратном вызове on_queue_declared мы можем связать очередь с обменом, используя желаемый ключ маршрутизации.отправка на обмен «заказ» с ключом маршрутизации «order.test.customer» теперь будет направляться в «тестовую» очередь, где потребитель может забрать его.

...