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 여기서 확인하라..
쨋든 위에 올린 코드처럼 하면 큐 타입을 지정할 수 있다.