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