Создавать ли соединение каждый раз, когда amqp.Dial является потокобезопасным или нет в go lang

Как упомянуто в документации RabbitMQ, tcp-соединения являются дорогостоящими. Итак, для этого была введена концепция канала. Теперь я столкнулся с этимпример, вmain() он создает соединение каждый раз, когда публикуется сообщение.conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/"), Разве это не должно быть объявлено глобально один раз, и должен быть механизм аварийного переключения в случае, если соединение закрывается как одноэлементный объект. Если amqp.Dial является потокобезопасным, что, я полагаю, должно быть

Отредактированный вопрос:

Я обрабатываю ошибку соединения следующим образом. В котором я слушаю канал и создаю новое соединение при ошибке. Но когда я уничтожаю существующее соединение и пытаюсь опубликовать сообщение. Я получаю следующую ошибку.

ошибка :

2016/03/30 19:20:08 Failed to open a channel: write tcp 172.16.5.48:51085->172.16.0.20:5672: use of closed network connection
exit status 1
7:25 PM

Код:

 func main() {

        Conn, err := amqp.Dial("amqp://guest:[email protected]:5672/")
        failOnError(err, "Failed to connect to RabbitMQ")
         context := &appContext{queueName: "QUEUENAME",exchangeName: "ExchangeName",exchangeType: "direct",routingKey: "RoutingKey",conn: Conn}
        c := make(chan *amqp.Error)

        go func() {
            error := <-c
            if(error != nil){                
                Conn, err = amqp.Dial("amqp://guest:[email protected]:5672/")            
                failOnError(err, "Failed to connect to RabbitMQ")            
                Conn.NotifyClose(c)                                           
            }            
        }()

        Conn.NotifyClose(c)
        r := web.New()
        // We pass an instance to our context pointer, and our handler.
        r.Get("/", appHandler{context, IndexHandler})
        graceful.ListenAndServe(":8086", r)  

    }

Ответы на вопрос(1)

Ваш ответ на вопрос