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 중국어 웹사이트의 기타 관련 기사를 참조하세요!