RabbitMQ:乱序获取 Basic.ConsumeOk 回复
RabbitMQ: Getting Basic.ConsumeOk reply out of order
我正在尝试将单个通道上的一堆方法发送到管道中的 RabbitMQ 服务器,然后等待相应的同步响应。我正在观察以下工件:
客户端请求管道:
Exchange.Declare
-> Queue.Declare
-> Queue.Bind
- > Basic.Consume
-> Basic.Qos
服务器响应管道:
Exchange.DeclareOk
-> Queue.DeclareOk
-> Queue.BindOk
- > Basic.QosOk
-> Basic.ConsumeOk
请注意响应 Basic.ConsumeOk
是如何在 Basic.QosOk
之后出现的,即使管道中的请求顺序不同。阅读规范我得出一个结论,在 同步请求 和相应的 响应 之间只能接收异步方法(Basic.Deliver
, Basic.Return
, Channel.Flow
, Connection.Close
, Channel.Close
).
否则,例如,如果我连续发出几个 Queue.Declare
请求甚至 Basic.Consume
请求,如果不保留顺序,就不可能知道哪个响应对应于哪个请求。
这算正常吗?我的理解有问题吗?或者 RabbitMQ 不支持流水线?
我假设您使用的是自定义库或您自己的代码,因为 RabbitMQ 或我们维护的任何客户端库都不支持流水线。当您 运行 使用官方支持的库的一些代码时,很容易看到。
当我 运行 使用 Pika 描述的方法序列时,我看到请求和响应按预期顺序发送。
我在 the code here 中修改了 receive.py
并包含了从我的机器捕获的数据包。
我正在使用 RabbitMQ 3.7.13、Erlang 21.3.2、Python 3.7.2 和 Pika 0.13.1。
我正在尝试将单个通道上的一堆方法发送到管道中的 RabbitMQ 服务器,然后等待相应的同步响应。我正在观察以下工件:
客户端请求管道:
Exchange.Declare
-> Queue.Declare
-> Queue.Bind
- > Basic.Consume
-> Basic.Qos
服务器响应管道:
Exchange.DeclareOk
-> Queue.DeclareOk
-> Queue.BindOk
- > Basic.QosOk
-> Basic.ConsumeOk
请注意响应 Basic.ConsumeOk
是如何在 Basic.QosOk
之后出现的,即使管道中的请求顺序不同。阅读规范我得出一个结论,在 同步请求 和相应的 响应 之间只能接收异步方法(Basic.Deliver
, Basic.Return
, Channel.Flow
, Connection.Close
, Channel.Close
).
否则,例如,如果我连续发出几个 Queue.Declare
请求甚至 Basic.Consume
请求,如果不保留顺序,就不可能知道哪个响应对应于哪个请求。
这算正常吗?我的理解有问题吗?或者 RabbitMQ 不支持流水线?
我假设您使用的是自定义库或您自己的代码,因为 RabbitMQ 或我们维护的任何客户端库都不支持流水线。当您 运行 使用官方支持的库的一些代码时,很容易看到。
当我 运行 使用 Pika 描述的方法序列时,我看到请求和响应按预期顺序发送。
我在 the code here 中修改了 receive.py
并包含了从我的机器捕获的数据包。
我正在使用 RabbitMQ 3.7.13、Erlang 21.3.2、Python 3.7.2 和 Pika 0.13.1。