이 글은 기계 번역의 미러 문서이며, 원본 기사로 바로 이동하려면 여기를 클릭해 주세요.

보기: 44647|회답: 8

[윈폼] rabbitMQ 큐 큐 메시지 영속성 [소스 코드 포함]

[링크 복사]
게시됨 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, 술어)
게시됨 2018. 4. 9. 오후 1:17:51 |
배우기 위해 배우세요
게시됨 2019. 6. 25. 오후 11:22:47 |
배우기 위해 배우세요
게시됨 2019. 6. 29. 오전 9:36:23 |
왜 데모를 못 봤는데, 꼭 답장해서 보려고 해요
게시됨 2019. 7. 9. 오후 5:34:42 |
C# 소스 코드를 원합니다
게시됨 2019. 7. 24. 오후 2:21:51 |
좋아요, 딱 제가 필요로 하는 거예요
게시됨 2020. 4. 11. 오후 2:34:54 |
배우세요
게시됨 2022. 1. 1. 오후 2:45:24 |
1111111111111111
 집주인| 게시됨 2023. 5. 3. 오후 10:12:22 |
RabbitMQ 큐의 매개변수와 그 의미


/**
* 이름, 내구성 플래그, 자동 삭제 플래그, 그리고 인수를 부여한 새로운 큐를 구성합니다.
* @param 큐 이름은 null 번호가 되어서는 안 됩니다; 중개인이 이름을 생성하도록 ""로 설정하세요.
@param* durable true는 durable queue를 선언하는 경우(서버가 재시작되어도 큐가 살아남음)
* 독점 큐를 선언할 때 독점적 참(@param 진실입니다 (대기열은 선언자의 경우만 사용됩니다
* 연결)
* 서버가 더 이상 사용하지 않는 큐를 삭제해야 할 경우@param autoDelete true입니다
* @param 인수: 큐를 선언하는 데 사용된 인수들
*/
public Queue(String name, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) {
   Assert.notNull(name, "'name'은 null일 수 없다");
   this.name = 이름;
   this.actualName = StringUtils.hasText(name) ? 이름
         : (Base64UrlNamingStrategy.DEFAULT.generateName() + "_awaiting_declaration");
   this.durable = durable;
   this.exclusive = exclusive;
   this.autoDelete = autoDelete;
   this.arguments = arguments != null ? arguments : new HashMap<>();
}

매개변수 소개:
1. 이름: 대기열의 이름;
2. actualName: 큐의 실제 이름, 이름 매개변수가 기본적으로 사용되며, 이름이 비어 있으면 규칙에 따라 생성됩니다;
3. 내구성: 지속성 여부;
4. 독점적: 배타적인지 배타적인지;
5. 자동 삭제: 자동 삭제 여부;
6. 인자: 큐의 다른 속성 매개변수들은 다음과 같은 옵션을 가지며, 그림 2의 인수 참조:
(1) x-message-ttl: 메시지의 만료 시간(밀리초 단위);
(2) x-expires: 큐 만료 시간, 큐가 접근되지 않을 경우 삭제되는 시간, 단위: 밀리초;
(3) x-max-length: 큐의 최대 길이이며, 최대 값을 초과하면 큐 헤더에서 메시지가 삭제됩니다;
(4) x-max-length-bytes: 큐 메시지 내용은 메모리 크기에 의해 제한된 최대 공간을 차지하며, 이 임계값을 초과하면 큐 헤더에서 메시지가 삭제됩니다;
(5) x-overflow: 큐 오버플로우 동작을 설정합니다. 이 방법은 대기열의 최대 길이에 도달했을 때 메시지에 어떤 일이 일어날지 결정합니다. 유효한 값은 drop-head, reject-publish, 또는 reject-publish-dlx입니다. 쿼럼 큐 유형은 드롭헤드만 지원합니다;
(6) x-데드레터-교환: 데드레터 교환의 이름과 만료되었거나 삭제된 메시지(긴 대기열 길이 또는 임계값을 초과한 공간 등)를 교환기로 지정할 수 있습니다;
(7) x-데드-글자-라우팅-키: 죽음문자 메시지의 라우팅 키로, 메시지가 데드레터 교환기로 전송될 때 사용되며, 설정되지 않으면 메시지의 원래 라우팅 키 값이 사용됩니다
(8) x-single-active-consumer: 대기열이 단일 활성 소비자인지 여부를 나타내며, 참일 경우 등록된 소비자 그룹 내 한 소비자만 메시지를 소비하고, 나머지는 무시하며, 메시지가 모든 소비자에게 루프 내에 배포될 경우 false임을 나타냅니다(기본 false)
(9) x-max-priority: 큐가 지원할 최대 우선순위 수; 설정되지 않으면 큐는 메시지 우선순위를 지원하지 않습니다;
(10) x-queue-mode(게으른 모드): 큐를 지연 모드로 설정하고, RAM 사용량을 줄이기 위해 가능한 한 많은 메시지를 디스크에 보관합니다; 설정되지 않으면 큐는 메시지를 최대한 빠르게 전달하기 위해 메모리 캐시를 유지합니다;
(11) x-queue-master-locator: 클러스터 모드에서 미러 큐의 마스터 노드 정보를 설정합니다.


면책 조항:
Code Farmer Network에서 발행하는 모든 소프트웨어, 프로그래밍 자료 또는 기사는 학습 및 연구 목적으로만 사용됩니다; 위 내용은 상업적 또는 불법적인 목적으로 사용되지 않으며, 그렇지 않으면 모든 책임이 사용자에게 부담됩니다. 이 사이트의 정보는 인터넷에서 가져온 것이며, 저작권 분쟁은 이 사이트와는 관련이 없습니다. 위 내용은 다운로드 후 24시간 이내에 컴퓨터에서 완전히 삭제해야 합니다. 프로그램이 마음에 드신다면, 진짜 소프트웨어를 지원하고, 등록을 구매하며, 더 나은 진짜 서비스를 받아주세요. 침해가 있을 경우 이메일로 연락해 주시기 바랍니다.

Mail To:help@itsvse.com