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