나는 RabbitMQ를 사용하고 있으며 전자 메일 메시지를 보관하는 대기열이 있습니다. 내 고객 서비스는 메시지를 대기열에서 제외하고 메시지를 보내려고합니다. 어떤 이유로 든 내 고객이 메시지를 보낼 수 없으면 메시지를 다시 보내서 다시 보내고 싶습니다. 나는 basicNack을 할 수 있고, 큐 플래그를 true로 설정할 수 있다는 것을 알았지 만, 메시지를 무한정 재구성하고 싶지 않습니다. (예를 들어, 우리의 전자 메일 시스템이 다운되면 계속해서 보내지 않은 메시지를 대기열에 넣고 싶지 않습니다.) 나는 다시 보낼 메시지를 다시 큐 할 수있는 유한 한 횟수를 정의하고 싶다. 그러나 전자 메일 메시지 객체에 필드를 설정할 수는 없습니다. 업데이트 된 필드가 대기열의 메시지에 없습니다. 내가 접근 할 수있는 다른 방법이 있습니까? 미리 감사드립니다.RabbitMQ에서 재시도 횟수를 어떻게 설정합니까?
답변
AMQP 프로토콜뿐 아니라 RabbitMQ에서 재 시도를 시도하는 것과 같은 기능은 없습니다. 다음 그것을 드롭 -이 이전에 재 전달되지 않은 경우
에 재전송 메시지가 (도서관이에 대한 몇 가지 인터페이스를 가지고 있어야
redelivered
매개 변수 방법basic.deliver
에 확인) :가능한 해결 재시 행동을 제한 구현 dead letter exchange에 들어가서 어떻게 든 처리하십시오.
메시지를 처리 할 수 없을 때마다 다시 게시하고 헤더 필드를 설정하거나 증가/감소 시키십시오 (예 :
x-redelivered-count
). 원하는 이름을 선택할 수 있습니다. 이 경우 재전송을 제어하려면 설정 한도를 확인해야합니다 (상단 또는 하단 - 0은 TCP/IP의 ip 헤더에있는ttl
입니다).Redis, memcache 또는 다른 저장소에 메시지 고유 키를 저장합니다 (uuid라고하지만 메시지를 게시 할 때 수동으로 설정해야합니다). mysql에서도 redelivery 수와 함께 그리고 다시 전달할 때마다이 값을 증가/감소시킵니다. 한계에이를 때까지
(진짜 괴짜 용) 쓰기 플러그인은 원하는 동작을 구현합니다.
# 3의 프로입니다 큐의 머리에 재 전달 메시지 숙박. 긴 대기열이 있거나 메시지 순서가 중요한 경우 (다시 배달하면 엄격한 메시지 순서가 손상됩니다. 자세한 내용은 공식 문서 또는 this question on SO 참조).
P.S :이
가이 항목의 similar answer이지만, PHP한다. 그것을 통해, 어쩌면 그것은 당신을 조금 도와 줄 수 있습니다. (단어 에서 읽기 시작하십시오. "순환 재전송 문제를 다루는 여러 기술이 있습니다"
Thanks 죽은 문자 교환 경로를 사용하겠습니다. – user2689570
또한 재시도 횟수를 제한하는 대신 메시지 수명 시간을 제한하는 데 신경 쓰지 않는다면 항상 TTL을 설정할 수 있습니다. –
이 블로그 게시물은 왜 이러한 종류의 문제를 해결하기 위해 RabbitMQ 위에 NServiceBus 또는 MassTransit과 같은 프레임 워크를 사용하십시오. https://www.make-awesome.com/2017/12/sure-you-can-just-use-rabbitmq/ –