首页  >  文章  >  后端开发  >  amqp.Dial 在 Go 中创建连接是线程安全的吗?关于全局连接与按请求连接的争论。

amqp.Dial 在 Go 中创建连接是线程安全的吗?关于全局连接与按请求连接的争论。

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-28 12:23:02362浏览

 Is amqp.Dial Thread-Safe for Connection Creation in Go? A Debate on Global vs. Per-Request Connections.

amqp 的线程安全性。在 Go Lang 中拨号以创建连接

为 AMQP 创建 TCP 连接可能是一项昂贵的操作。为了解决这个问题,引入了渠道。然而,关于是否每次都创建连接还是全局声明一次的问题已经出现。

问题:

最近在 main() 函数中的示例Go 应用程序演示了每次发布消息时连接的创建。这种方法提出了一个问题:在连接关闭的情况下,使用具有故障转移机制的全局声明的连接是否更合适,特别是考虑到 amqp.Dial 假定的线程安全性质。

答案:

不建议为每个请求创建连接。相反,请考虑使连接成为全局变量或仅在启动时初始化一次的应用程序上下文的一部分。

为了处理连接错误,可以使用 amqp.Connection.NotifyClose 注册一个通道来监视连接状态。当发生错误时,可以使用重新连接功能重新建立连接。

示例:

<code class="go">import (
    "github.com/streadway/amqp"
)

func initialize() {
    c := make(chan *amqp.Error)
    go func() {
        err := <-c
        log.Println("reconnect: " + err.Error())
        initialize()
    }()

    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    if err != nil {
        panic("cannot connect")
    }
    conn.NotifyClose(c)

    // create topology
}</code>

以上是amqp.Dial 在 Go 中创建连接是线程安全的吗?关于全局连接与按请求连接的争论。的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn