Correlation_id 在 rabbitmq 中

Correlation_id in rabbitmq

我正在查看一段在默认交换中使用 callback_queue 和 correlation_id 的代码。但是当我试图将它更改为用户定义的交换时,我没有在该队列上得到任何回复。为了测试它,我尝试了 https://www.rabbitmq.com/tutorials/tutorial-six-python.html 中的这个非常简单的示例,我发现如果我使用默认以外的交换,我不会得到任何回复。如果还有什么我应该做的,请告诉我。谢谢

   ../rabbitmq $ ./rpc_client.py 1
    (' [x] Requesting fib%s', '1')
     [.] Got 1

    ../rabbitmq $ ./rpc_client.py 19
    (' [x] Requesting fib%s', '19')


    .../rabbitmq $ ./rpc_server.py
 [x] Awaiting RPC requests
 [.] fib(1)
 [.] fib(19)

如果我在脚本中将 exchange='' 更改为 exchange='test'(测试是我创建的交换),我注意到消费者只是坐着..如果我使用默认值,我会得到回复..

../rabbitmq $ ./rpc_server.py   
 [x] Awaiting RPC requests

../rabbitmq $ ./rpc_client.py 1 
(' [x] Requesting fib%s', '1')

我也看了correlationId and temporary queues in RPC model - AMQP

https://github.com/eandersson/python-rabbitmq-examples/blob/master/Flask-examples/pika_async_rpc_example.py

如果您使用的是自定义交换器,则需要将绑定添加到您的队列中。这适用于 rpc_queue 和回复队列(例如 amq.gen-xxx)。

RabbitMQrpc_client.py 示例中,在 result.method.queue 之后添加 queue_bind

self.channel.queue_bind(self.callback_queue, 'test', self.callback_queue)

rpc_server.py 示例中,在 queue_declare 之后添加 queue_bind

channel.queue_bind('rpc_queue', 'test', 'rpc_queue')

您需要添加绑定的原因是您没有使用默认交换。默认交换器自动绑定到所有队列,因此您无需添加上述绑定即可工作。您可以阅读有关默认交换的更多信息 here.