>백엔드 개발 >Golang >amqp.Dial은 Go에서 연결 생성을 위해 스레드로부터 안전합니까? 글로벌 연결과 요청별 연결에 대한 논쟁.

amqp.Dial은 Go에서 연결 생성을 위해 스레드로부터 안전합니까? 글로벌 연결과 요청별 연결에 대한 논쟁.

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-28 12:23:02446검색

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

연결 생성을 위한 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.