这真的取决于你想做什么。如果您只想从队列中获取一条消息(第一条),您可能应该使用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应该使用,我认为