Создавать ли соединение каждый раз, когда 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)
}