pika rabbitmq主题制作人。我是否必须将路由密钥绑定到队列?

时间:2014-09-16 08:19:32

标签: python rabbitmq pika

我理解主题使用者需要绑定它有兴趣接收的所有路由键,但我对主题的原因感到困惑。以下示例中的生产者

https://github.com/pika/pika/blob/master/docs/examples/asynchronous_publisher_example.rst

def on_queue_declareok(self, method_frame):
        """Method invoked by pika when the Queue.Declare RPC call made in
        setup_queue has completed. In this method we will bind the queue
        and exchange together with the routing key by issuing the Queue.Bind
        RPC command. When this command is complete, the on_bindok method will
        be invoked by pika.

        :param pika.frame.Method method_frame: The Queue.DeclareOk frame

        """
        LOGGER.info('Binding %s to %s with %s',
                    self.EXCHANGE, self.QUEUE, self.ROUTING_KEY)
        self._channel.queue_bind(self.on_bindok, self.QUEUE,
                                 self.EXCHANGE, self.ROUTING_KEY)
on_queue_declareok()中的

将队列绑定到路由键,因为生产者不会监听任何主题。我是否应该绑定生产者发送的所有路由密钥?

我知道以下示例

http://www.rabbitmq.com/tutorials/tutorial-five-python.html

与我使用的SelectConnection相比,

正在使用阻塞连接,但是它的生产者并没有将任何路由键绑定到队列 - 它只是为任意一个做了basic_publish()路由密钥。

#!/usr/bin/env python
import pika
import sys

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()

channel.exchange_declare(exchange='topic_logs', type='topic')

routing_key = sys.argv[1] if len(sys.argv) > 1 else 'anonymous.info'
message = ' '.join(sys.argv[2:]) or 'Hello World!'
channel.basic_publish(exchange='topic_logs', routing_key=routing_key, body=message)
print " [x] Sent %r:%r" % (routing_key, message)
connection.close()

任何澄清都将不胜感激。

-Scott

1 个答案:

答案 0 :(得分:2)

我认为你在producersconsumers之间有点困惑。 制片人向交易所发布消息。不到队列。消费者从队列中读取,而不是从交换中读取。

问题是谁将交换队列绑定到交换机是特定于应用程序的。它可能因应用程序而异。在某些情况下,您希望生产者知道此消息将在何处结束。在其他情况下,它无关紧要,消费者可以指定它感兴趣的消息。

如果您还不了解自己的要求,可以“简单地”(不是最佳方法)在UI中创建队列并将其绑定到您想要的任何交换。然后在您的生产者中,您将硬编码交换和路由密钥,在消费者中,您将硬编码队列名称。

  

绑定是交换和队列之间的关系。这个可以   简单地读作:队列对此消息感兴趣   交换。

     

绑定可以采用额外的routing_key参数。避免   与basic_publish参数混淆,我们将其称为a   绑定密钥。这就是我们如何使用密钥创建绑定: