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

Go에서 Dead RabbitMQ 연결을 감지하고 처리하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-03 05:34:09380검색

How to Detect and Handle Dead RabbitMQ Connections in Go?

Go에서 죽은 RabbitMQ 연결 감지 및 처리

제공된 RabbitMQ 소비자 스크립트에서 RabbitMQ 서버 작업이 중단되면 스크립트가 계속 실행됩니다. 하지만 메시지에 응답하지 않습니다. 이 문제를 해결하려면 끊어진 연결을 감지하고 스크립트를 다시 연결하거나 종료하는 것이 중요합니다.

기본 라이브러리인 streadway/amqp가 솔루션을 제공합니다. amqp.Connection 유형에는 채널 신호 전송 또는 프로토콜 오류를 반환하는 NotifyClose() 메서드가 있습니다. 이 채널을 사용하면 연결 실패를 감지할 수 있습니다.

다음은 연결 오류 처리를 통합하는 업데이트된 버전의 스크립트입니다.

import (
    "log"

    "github.com/streadway/amqp"
)

func main() {
    // Connection loop
    for {
        conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
        if err != nil {
            log.Printf("Failed to connect to RabbitMQ: %v", err)
            continue
        }

        notify := conn.NotifyClose(make(chan *amqp.Error))

        ch, err := conn.Channel()
        if err != nil {
            log.Printf("Failed to open a channel: %v", err)
            continue
        }

        q, err := ch.QueueDeclare(
            "test_task_queue",
            true,
            false,
            false,
            false,
            nil,
        )
        if err != nil {
            log.Printf("Failed to declare a queue: %v", err)
            continue
        }

        err = ch.Qos(
            1,
            0,
            false,
        )
        if err != nil {
            log.Printf("Failed to set QoS: %v", err)
            continue
        }

        msgs, err := ch.Consume(
            q.Name,
            "",
            false,
            false,
            false,
            false,
            nil,
        )
        if err != nil {
            log.Printf("Failed to register a consumer: %v", err)
            continue
        }

        // Message receive loop
        for {
            select {
            case err := <-notify:
                // Connection error handling
                log.Printf("Connection error: %v", err)
                break // Reconnect

            case d := <-msgs:
                // Message handling
                log.Printf("Received a message: %s", d.Body)
                d.Ack(false)
                dot_count := bytes.Count(d.Body, []byte("."))
                t := time.Duration(dot_count)
                time.Sleep(t * time.Second)
                log.Printf("Done")
            }
        }
    }
}

이 수정된 스크립트에서 연결 루프는 다른 작업. 메시지 수신 루프 내에서 select 문은 오류 채널과 들어오는 메시지를 모두 확인합니다. 연결 오류가 감지되면 오류를 기록하고 다시 연결을 트리거합니다. 이 메커니즘을 통해 스크립트는 일시적인 연결 문제를 복구하고 정상적인 작업을 재개할 수 있습니다.

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

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