RabbitMQ:获取Basic.ConsumeOk的回复顺序混乱

时间:2019-03-26 19:39:56

标签: rabbitmq amqp

我正在尝试在单个通道上向管道中的RabbitMQ服务器发送一堆方法,然后等待相应的同步响应。我正在观察以下工件:

客户端请求管道:

Exchange.Declare -> Queue.Declare -> Queue.Bind -> {{ 1}} -> Basic.Consume

服务器响应管道:

Basic.Qos -> Exchange.DeclareOk -> Queue.DeclareOk -> {{ 1}} -> Queue.BindOk

请注意,Basic.QosOk之后的响应Basic.ConsumeOk是如何产生的,即使请求在管道中的顺序不同。阅读规范后得出的结论是,在同步请求和相应的响应之间,只能接收异步方法(Basic.ConsumeOk,{{1} },Basic.QosOkBasic.DeliverBasic.Return)。

否则,例如,如果我连续发出多个Channel.Flow个请求甚至什至Connection.Close个请求,那么如果不保留订单,就不可能知道哪个响应对应于哪个请求。

这被认为是正常的吗?我的理解有缺陷吗?还是RabbitMQ不支持管道传输?

1 个答案:

答案 0 :(得分:1)

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

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

我在the code here中修改了receive.py,还包括从我的计算机中捕获的数据包。

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