这真的取决于你想做什么。如果您只想从队列中获取一条消息(第一条),您可能应该使用basic.get
,如果您打算处理来自队列的所有传入消息 -basic.consume
这就是您想要的。
可能不是平台或库特定的问题,而是协议理解问题。
UPD
我不太熟悉 Go 语言,所以我将尝试向您简要介绍 AMQP 细节并描述用例。
有时您可能会遇到麻烦并产生开销basic.consume
:
有了basic.consume
这样的工作流程:
- 发送
basic.consume
方法来通知代理您要接收消息
- 虽然这是一种同步方法,但请等待
basic.consume-ok
来自代理的消息
- 开始收听
basic.deliver
来自服务器的消息
- 这是一种异步方法,您应该自己处理服务器上没有可用消息的情况,例如限制阅读时间
有了basic.get
这样的工作流程:
basic.get
向代理
发送同步方法
- 等待
basic.get-ok
方法,它保存消息或basic.empty
方法,表示服务器上没有可用消息的情况
同步和异步方法的注意事项:同步应该有一些响应,异步是否没有
关于basic.qos
方法prefetch-count
属性的注意事项:no-ack
当属性设置为basic.consume
或时,它会被忽略basic.get
。
Spec 有一个注释basic.get
:“此方法使用同步对话提供对队列中消息的直接访问,该对话是为同步功能比性能更重要的特定类型的应用程序设计的”,适用于连续消息消费。
我的个人测试表明,在 RabbitMQ 3.0.1、Erlang R14B04 上,使用basic.get
(0.38659715652466) 获取 1000 条消息比逐条获取 1000 条消息 (0.47398710250854) 更快basic.consume
,平均速度超过 15%。
如果您只在主线程中使用一条消息 - 可能您必须使用basic.get
.
您仍然可以仅异步使用一条消息,例如在单独的线程中或使用某种事件机制。有时这对您的机器资源来说会是更好的解决方案,但您必须注意队列中没有可用消息的情况。
如果您必须一一处理消息,很明显basic.consume
应该使用,我认为