rabbitmq queue type: classic, quorum, stream -> amqplib 적용 [에러내용]: in vhost '/': received none but current is the value 'quorum' of type 'longstr'"

치즈말랑이·2023년 2월 17일
0
post-thumbnail

rabbitmq 3.8 버전 - quorum
rabbitmq 3.9 버전 - stream
queue type 이 추가되었다.
기존에 사용하던 queuesms classic type 이다

즉, 쿼럼 큐는 더 안전한 방식, 스트림 큐는 카프카와 비슷한 방식이라고 할 수 있겠다.
스트림 큐에 대한 다른 설명: https://news.hada.io/topic?id=4613

큐 타입을 지정하는 것은 exchange와는 별개이기때문에, app을 사용할 때 publisher에는 아무 처리 안하고 consumer에만 큐 타입을 지정하면 된다.
그런데 amqplib 공식문서는 물론이고 검색을 해도 큐 타입을 어떻게 지정하는지 안나온다. 중요한 arguments 타입이 any로 나와있어 알 수가 없다.

그래서 이런 에러가 자꾸 떴다.

Error: Channel closed by server: 406 (PRECONDITION-FAILED) with message "PRECONDITION_FAILED - inequivalent arg 'x-queue-type' for queue 'sysQuorumQueue' in vhost '/': received none but current is the value 'quorum' of type 'longstr'"

그래서 에러를 검색해서 자바에서 사용하는 방식을 참고하여 설정했더니 된다.

참고한것은 다음 두 링크이다.
https://github.com/spring-projects/spring-amqp/issues/1150 이것으로 영감을 얻고,
https://github.com/Graylog2/graylog2-server/issues/6827 이것으로 알게 되었다.

amqplib의 기본 사용방법은 적지않겠다.
assertQueue 할 때, 두번째 인자로 Options.AssertQueue 타입에 해당하는 객체를 넣어주는데, 이 때 다음과 같이 적으면 된다.

  const queueName: QueueNameType = '큐이름'
  const queueOptions: amqplib.Options.AssertQueue = {
    arguments: { 'x-queue-type': 'stream' }
  }
  const { queue }: amqplib.Replies.AssertQueue = await channel.assertQueue(queueName, queueOptions)

stream 말고 quorum을 적어도 적용된다. classic은 default라서 따로 안적어도 된다.

Options.AssertQueue 타입을 보면 다음과 같다.

    interface AssertQueue {
        exclusive?: boolean | undefined;
        durable?: boolean | undefined;
        autoDelete?: boolean | undefined;
        arguments?: any;
        messageTtl?: number | undefined;
        expires?: number | undefined;
        deadLetterExchange?: string | undefined;
        deadLetterRoutingKey?: string | undefined;
        maxLength?: number | undefined;
        maxPriority?: number | undefined;
    }

여기서 arguments에 해당하는 값인데, 공식문서에도 안나와있고 타입도 any로 나와있다;

공식문서에는 이렇게 나와있다.
https://amqp-node.github.io/amqplib/channel_api.html#channel_bindQueue

args는 https://www.rabbitmq.com/documentation.html 여기서 확인하라..

쨋든 위에 올린 코드처럼 하면 큐 타입을 지정할 수 있다.

profile
공부일기

0개의 댓글