这个库中的类型被设计成可以安全地从多个 goroutine 中使用,尽管通常保留一个管理代理的 IO 并使用与您的类型相关的 chan 与您的 AMQP 逻辑进行通信的单个 goroutine 更简单应用。
感谢您的回答。
@cenkalti从同一频道上的多个 goroutine 发布是不安全的。
更具体地说:每次发布非空消息时,
客户端在线发送 3 个(或更多)帧:
[method: basic.publish] [content headers] [content body]+
从多个线程/goroutines/进程在同一个通道上发布时,
您最终可能会遇到不正确的交错,例如
[method: basic.publish] [content headers] [method: basic.publish] [content body] [content headers] [content body]
RabbitMQ 将无法解析此帧序列并引发致命错误。 解决方案
是要么
最有用的评论
@michaelklishin交错来自同一通道上不同线程的帧是大多数库实现的一个问题。 该库将发送序列化,直到所有帧都被传递,无论它是否是具有内容的方法。
这是互斥锁: https ://github.com/streadway/amqp/blob/master/channel.go#L206,它确保发布的所有帧都在每个通道开始下一次发送之前写入。
此测试使用多个 goroutine 来传递需要在同一通道上跨多个主体帧拆分的有效负载: https ://github.com/streadway/amqp/blob/master/client_test.go#L466