RabbitMQ:获取Basic.consumerOK回复时出错

RabbitMQ:获取Basic.consumerOK回复时出错,rabbitmq,amqp,Rabbitmq,Amqp,我试图在一个通道上通过管道将一组方法发送到RabbitMQ服务器,然后等待相应的同步响应。我正在观察以下一个工件: 客户端请求管道: 交换.声明队列.声明队列.绑定基本.消费基本.Qos 服务器响应管道: Exchange.DeclareOk队列.DeclareOk队列.BindOk

我试图在一个通道上通过管道将一组方法发送到RabbitMQ服务器,然后等待相应的同步响应。我正在观察以下一个工件:

客户端请求管道:

交换.声明
队列.声明
队列.绑定
基本.消费
基本.Qos

服务器响应管道:

Exchange.DeclareOk
队列.DeclareOk
队列.BindOk
基本.消费OK

注意响应
Basic.ConsumeOk
是如何在
Basic.QosOk
之后出现的,尽管管道中的请求顺序不同。阅读规范后,我得出结论,在同步请求和相应的响应之间,只能接收异步方法(
Basic.Deliver
Basic.Return
Channel.Flow
Connection.Close
Channel.Close

否则,例如,如果我发出几个
队列。声明
请求,甚至是
Basic.Consume
请求,如果不保留顺序,就不可能知道哪个响应对应于哪个请求


这算正常吗?我的理解有缺陷吗?或者RabbitMQ不支持流水线?

我假设您使用的是自定义库或您自己的代码,因为RabbitMQ或我们维护的任何客户端库都不支持流水线。当您使用官方支持的库运行某些代码时,很容易看到

当我运行您使用Pika描述的方法序列时,我看到请求和响应按照预期的顺序发送

我在中修改了
receive.py
,并包含了从我的机器捕获的数据包


我正在使用RabbitMQ 3.7.13、Erlang 21.3.2、Python 3.7.2和Pika 0.13.1。

是的,这确实是我自己的实现。如果您说客户端库不支持流水线,那么显然在Pika中您不会观察到这种效果。您是RabbitMQ代理的维护者吗?如果是这样的话,你能告诉我哪些文档描述了可以管道化的方法和那些不能管道化的方法吗?显然,
Basic.Publish
必须支持流水线。我建议使用RabbitMQ Java客户端作为客户端库的参考实现。在中,有返回值的方法,也有不返回值的方法。当返回一个值时,客户端必须等待它完成操作。当客户端等待操作完成时,不应该发出另一种操作(方法不应该被发送),这是正确的吗?我相信是正确的。当然,您可以在另一个频道上发送相同的方法。