소비자가 메시지를 받고 처리 작업이 완료되면, 이 메시지 식별자를 가진 ack을 보내 메시지가 수신되었고 처리가 완료되었음을 서버에 알립니다. RabbitMQ는 메시지를 처리하는 소비자의 링크가 끊길 때까지 메시지가 제대로 처리되지 않았다고 판단하기 전에 메시지를 재전송합니다. 메시지 확인 응답은 기본적으로 꺼져 있습니다. Consumer를 초기화할 때 noAck 파라미터가 있습니다.true로 설정하면 소비자는 메시지를 받자마자 ACK를 반환합니다。
일반적으로 일반적으로 사용되는 시나리오 노크는 true로 설정되지만, 지불과 같이 고위험 요구가 있는 프로젝트에 해당합니다. 모든 메시지에 대해서는 그 무결성과 정확성을 보장해야 합니다. 메시지를 받은 후에는 올바른 비즈니스 로직이 실행되었는지 확인한 후, 서버에 ACK를 적극적으로 반환해야 합니다. 대기열에 있는 메시지는 rabbitmqctl list_queues 이름 message_rady message_unacknowleded 명령어나 백그라운드 관리 인터페이스를 통해 확인할 수 있습니다.
noAck이 false로 설정되어 있다면, 클라이언트는 서버에 ACK를 적극적으로 보내야 하며, 클라이언트가 메시지를 확인하지 않으면 다음과 같은 상황이 발생합니다:
프로그램이 계속 실행 중인 한, 이 10개의 메시지는 래그가 붙지 않은 상태로 남아 RabbitMQ로 다시 전달할 수 없습니다. 더 강력한 것은RabbitMQ 메시지 소비에는 타임아웃 메커니즘이 없습니다즉, 프로그램이 재시작되지 않으면 메시지는 항상 언래킹 상태에 머무릅니다. 운영 이벤트 작업을 할 때 이 비고정 상태 메시지를 잊지 마세요.
준비됐어
이 상태를 가진 메시지는 처리될 대기열에 존재합니다.
미확인
이 상태의 메시지는 이미 처리 중이지만 확인되지 않음을 나타냅니다.
프로그램이 닫히면(소비자가 닫혀 있는 한) 이 10개의 메시지는 다시 준비 상태로 돌아갑니다.
확인 메시지
클라이언트가 서버에 ACK를 보내면 어떻게 되나요? 즉, 메시지 수신 여부를 확인하는 것인가요? 코드는 다음과 같습니다:
BasicAck 메서드의 두 번째 매개변수인 multiple이 false로 설정되면, RabbitMQ는 현재 메시지가 확인되었다는 알림을 받았음을 의미합니다.만약 참이라면, 첫 번째 매개변수가 지정한 전달 태그보다 작은 추가 메시지가 인정됩니다。 (대량 확인은 채널 전체에 해당합니다)
확인 취소
분산 프로그램의 클라이언트 중 하나가 예외를 가지고 메시지 확인을 취소하고 다른 클라이언트가 메시지를 처리하도록 하려 한다면 어떻게 해야 할까요?
소비 메시지에 예외가 있으면 확인을 취소해야 하며, 그 후 Channel의 basicReject 메서드를 사용할 수 있습니다.
첫 번째 매개변수는 전달 태그를 지정하고, 두 번째 매개변수는 이 실패 메시지를 처리하는 방법을 설명합니다.true의 값은 메시지가 다시 큐 헤더에 들어가는 것을, false 값은 메시지가 포기되었음을 의미합니다。
|