> 백엔드 개발 > Golang > Go에서 Dead RabbitMQ 연결을 적절하게 처리하는 방법은 무엇입니까?

Go에서 Dead RabbitMQ 연결을 적절하게 처리하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-10 06:48:12
원래의
387명이 탐색했습니다.

How to Gracefully Handle Dead RabbitMQ Connections in Go?

Go에서 Dead RabbitMQ 연결 감지

이 시나리오에서 streadway/amqp 라이브러리를 사용하여 Go로 작성된 소비자 스크립트는 다음과 같은 경우에 종료되지 않습니다. RabbitMQ 서버가 중지되었습니다. 또한 서버가 다시 시작되면 소비자는 메시지 수신을 중단합니다.

해결 방법: 연결 알림 사용

amqp.Connection 유형에는 다음을 제공하는 NotifyClose() 메서드가 있습니다. 전송 또는 프로토콜 오류 신호를 보내기 위한 채널입니다. 이 방법을 사용하면 연결 끊김 이벤트를 처리하고 적절하게 처리할 수 있습니다.

다음 코드 조각은 연결 알림을 사용하여 끊어진 연결을 감지하고 필요한 작업을 수행하는 방법을 보여줍니다.

import (
    "log"
    "time"

    "github.com/streadway/amqp"
)

func main() {
    for {  // Reconnection loop
        conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/") // Setup
        if err != nil {
            log.Fatal(err)
        }
        notify := conn.NotifyClose(make(chan *amqp.Error)) // Error channel

        ch, err := conn.Channel()
        if err != nil {
            log.Fatal(err)
        }
        msgs, err := ch.Consume(
            "test_task_queue", // Queue
            "",     // Consumer
            false,  // Auto-ack
            false,  // Exclusive
            false,  // No-local
            false,  // No-wait
            nil,    // Args
        )
        if err != nil {
            log.Fatal(err)
        }

        for {  // Receive loop
            select {  // Check connection
            case err = <-notify:
                // Work with error
                log.Println(err)
                break // Reconnect
            case d := <-msgs:
                // Work with message
                log.Printf("Received a message: %s", d.Body)
                d.Ack(false)
                dotCount := bytes.Count(d.Body, []byte("."))
                t := time.Duration(dotCount)
                time.Sleep(t * time.Second)
                log.Printf("Done")
            }
        }
    }
}
로그인 후 복사

이 수정된 스크립트에서는 알림 채널을 사용하여 연결 종료를 지속적으로 확인하는 루프 내에 기본 소비자 논리를 래핑했습니다. 오류가 수신되면 오류를 기록하고 프로세스가 다시 연결됩니다.

연결 알림을 활용하면 죽은 RabbitMQ 연결을 감지하고 다시 연결, 오류 기록, 스크립트 종료 등의 적절한 조치를 취할 수 있습니다.

위 내용은 Go에서 Dead RabbitMQ 연결을 적절하게 처리하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿