연결 생성을 위한 Go Lang의 amqp.Dial 스레드 안전성
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!