|
|
게시됨 2018. 4. 9. 오전 10:23:21
|
|
|
|

기본적으로 rabbitMQ 큐 메시지는 하드 디스크에 영속성되지 않기 때문에, rabbitMQ 서비스가 재시작되면 메시지가 사라집니다.
큐의 지속성
예를 들어, 큐의 영속성이 식별됩니다durableis는 true로 설정되어 있으며, 이는 영구 큐임을 의미합니다서비스를 재시작한 후에는 이 큐도 존재하게 되는데, 이는 서비스가 하드디스크에 영속 큐를 저장하고, 서비스가 재시작되면 이전에 영속된 큐를 다시 설정하기 때문입니다. 큐는 영속성을 유지할 수 있지만, 내부 메시지가 영속성인지 여부는 메시지의 영속성 설정에 따라 달라집니다. 즉, 재시작 전에 큐에 메시지가 전송되지 않았다면, 재시작 후에도 원래 메시지가 큐에 남아 있는지는 메시지 전송 시 설정에 따라 달라집니다. 재시작 후에도 메시지를 영속성으로 유지하고 싶다면, 메시지가 지속된다는 식별 정보를 설정해야 합니다.
큐 지속성 설정:
메서드의 네 번째 매개변수인 autoDelete는 보통 false로 입력됩니다. 문서에서는 이 매개변수가 true라고 설명하고 있는데, 이는 큐가 더 이상 사용되지 않거나(구독되지 않음) 서버가 이를 삭제한다는 의미입니다. 테스트 중에는 연결 변경 대기열의 모든 수신자가 연결이 끊겨 있는 한, 대기열은 삭제되며, 아직 처리되지 않은 메시지가 있더라도 대기열은 삭제됩니다. RabbitMQ 재시작도 제거됩니다. false가 입력되면 서비스는 큐를 삭제하지 않으며, 모든 클라이언트가 연결이 끊어져도 큐 내 메시지는 존재합니다. 클라이언트 연결이 없을 때도 전송자는 변경 대기열에 메시지를 입력할 수 있으며, 클라이언트가 실행되면 이 메시지들을 받게 됩니다. 하지만 RabbitMQ 서비스를 재시작하면 큐가 사라지고 그 안의 메시지도 자연스럽게 사라집니다.
세 번째 매개변수는 배타적이며, 문서에는 만약 참이면 큐의 연결이 끊어지고, 큐는 삭제되며, 내부 메시지도 포함된다고 명시되어 있습니다.
두 번째 매개변수인 durable은 문서에서 만약 참이라면 서비스 재시작 후에도 존재하는 영구 큐를 나타낸다고 설명합니다. 서비스는 영구 큐를 하드 디스크에 저장하고, 서비스가 재시작되면 이 큐를 재확인하기 때문입니다. 물론, autoDelete와 exclucial이 모두 false일 때는 분명히 잘못된 것입니다. 큐는 영속성을 유지할 수 있지만, 내부 메시지가 영속성인지 여부는 메시지의 영속성 설정에 따라 달라집니다. 즉, 재시작 전에도 큐에 메시지가 남아 있다면, 재시작 후에도 원래 메시지가 큐에 남아 있는지는 메시지를 보낼 때 발신자의 설정에 따라 달라집니다.
코드를 수정한 후 실행을 시도하면 오류가 다음과 같습니다:
처리되지 않은 예외: RabbitMQ.Client.Exceptions.OperationInterruptedException: AMQP 작업이 중단됨: AMQP close-reason, Peer에 의해 시작, 코드=406, text="PRECONDITION_FAILED - vhost 'myserver'에서 큐 'Hello'에 대한 inequivalent arg 'durable': 'true'를 받았지만 current는 'false'입니다. classId=50, methodId=10, cause=
왜냐하면 우리는 'hello'라는 비지속 큐를 정의했기 때문입니다. RabbitMQ는 기존 큐를 다른 매개변수 설정으로 재정의할 수 없습니다.
해결책은 두 가지가 있습니다:
1: 다른 이름으로 큐를 재선언합니다. 예를 들어 my_queue 2: http://localhost:15672 주소가 적힌 정의된 "hello" 큐를 삭제하고 사용자 이름과 비밀번호로 로그인합니다. RabbitMQ의 기본 비밀번호와 사용자 이름은 'guet'입니다. "queue" 열을 클릭하면 대기열 목록을 볼 수 있고, "hello" queue를 클릭하면 대기열 세부 정보를 확장할 수 있습니다. 페이지를 끝까지 당기면 "삭제" 항목이 있고, 그걸 클릭한 뒤 "대기열 삭제" 버튼을 누르면 대기열을 삭제할 수 있습니다. 그 후 코드가 실행되면 영속성을 지원하는 헬로 큐가 생성됩니다.
메시지의 지속성
재시작 후에도 메시지가 지속되도록 설정해야 합니다. 설정은 송신자가 전송하는 시점으로, 비교적 간단하며 코드는 다음과 같습니다:
DeliveryMode는 기본값이 1이며, 비영속적이며, 2로 설정하면 메시지가 영구적임을 의미합니다
코드를 수정한 후에는 메시지를 보내기 위해 프로듀서 프로그램만 열고, rabbitMQ 서비스를 재시작한 뒤 컨퍼먼을 다시 열어도 메시지가 사라지지 않은 것을 확인합니다.
(끝)
첨부된 것은 C# 소스 코드입니다:
관광객 여러분, 이 게시물의 숨겨진 내용을 보고 싶으시다면 부탁드립니다 회답
|
이전의:예외 메시지: "StrongTypingException: IsPrima...다음:C# 대의자 소개 (delegate, Action, Func, 술어)
|