Amqp: 问题:跨 goroutine 共享通道/连接是否安全?

创建于 2013-10-02  ·  4评论  ·  资料来源: streadway/amqp

最有用的评论

@michaelklishin交错来自同一通道上不同线程的帧是大多数库实现的一个问题。 该库将发送序列化,直到所有帧都被传递,无论它是否是具有内容的方法。

这是互斥锁: https ://github.com/streadway/amqp/blob/master/channel.go#L206,它确保发布的所有帧都在每个通道开始下一次发送之前写入。

此测试使用多个 goroutine 来传递需要在同一通道上跨多个主体帧拆分的有效负载: https ://github.com/streadway/amqp/blob/master/client_test.go#L466

所有4条评论

这个库中的类型被设计成可以安全地从多个 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 将无法解析此帧序列并引发致命错误。 解决方案
是要么

  • 避免从多个线程/goroutines/进程在 _the same_ 通道上发布
  • 在您自己的代码中同步发布

@michaelklishin交错来自同一通道上不同线程的帧是大多数库实现的一个问题。 该库将发送序列化,直到所有帧都被传递,无论它是否是具有内容的方法。

这是互斥锁: https ://github.com/streadway/amqp/blob/master/channel.go#L206,它确保发布的所有帧都在每个通道开始下一次发送之前写入。

此测试使用多个 goroutine 来传递需要在同一通道上跨多个主体帧拆分的有效负载: https ://github.com/streadway/amqp/blob/master/client_test.go#L466

此页面是否有帮助?
0 / 5 - 0 等级