728x90
반응형
SMALL
db 업데이트 작업의 의존성 분리
db 서버에 대한 쓰기 작업 수를 제한함으로써 확장 문제를 해결하는 동시에 새로운 사이트 추가로 인해 발생하는 부하를 제어
db에 부하가 생기면 시스템 성능에 문제를 준다.
애플리케이션의 의존성 제거
mq를 사용해 느슨하게 결합된 설계로 변경함으로써 애플리케이션 아키텍처는 어디상 db 쓰기 성능에 영향을 받지 않으며 핵심 애플리케이션의 코드를 수정하지 않고도 데이터를 처리하는 새로운 애플리케이션을 쉽게 추가
db쓰기 의존성 제거
db와 강결합된 구조는 동기/비동기 애플리케이션 모두에서 성능상의 병목이 발생할 가능성이 있다.
RABBITMQ 심화속성 정보
- Properties의 expiration 값이나 큐 정의시 x-message-ttl 값으로 데이터 만료기능을 설정할 수 있다. 물론 만료되면 mq가 메시지를 `자동으로 삭제`한다.
- Properties의 priority 설정으로 우선순위 큐로서 사용할 수 있다.(0~9)
- Properties의 delivery mode 로 메시지를 메모리(1),디스크(2) 사용할지 선택할 수 있다.
- 절대 잃어버려서는 안되는 메시지일 경우`exchange`가 존재하지 않는곳으로 메시지를 전송한다면 mq는 메시지를 손실한다. 때문에 이를 방지하고자 `alternative exchange`를 설정하면된다.보통 `unroutable-message` 라는 이름의 큐를 alternative exchange랑 연결해둔다.
- `x-dead-letter-exchange` 를 통해서 만약에 큐에서 잘못된 데이터를 소비할경우 requeue가 되지 않도록
- `x-dead-letter-exchange`를 사용해서 오류전용 큐에 전송하는것이다.
**예시코드**
@Bean
public Queue mainQueue() {
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange", DEAD_LETTER_EXCHANGE);
args.put("x-dead-letter-routing-key", DEAD_LETTER_ROUTING_KEY);
return new Queue(QUEUE_NAME, true, false, false, args);
}
@Bean
SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
DeadLetterMessageListener listener) {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.setQueues(deadLetterQueue());
container.setMessageListener(listener);
return container;
}
@RabbitmqListener(qname="test1")
public void sendMessageToMainQueue(Object message) {
try {
amqpTemplate.convertAndSend(rabbitConfig.myQueue().getName(), message);
} catch (Exception e) {
amqpTemplate.convertAndSend(rabbitConfig.deadLetterExchange().getName(), rabbitConfig.deadLetterBinding().getRoutingKey(), message);
}
}
큐 제어하기
임시 큐
- 자동 삭제 큐
- auto-delete 옵션 true 주면 consume 시 자동삭제
- 큐 독점 설정
- 큐를 선언한 연결과 채널에서만 사용된다. 채널이 닫히면 자동 삭제된다. 쉽게 말해 소비자가 더 이상 구독하지 않으면 자동 삭제된다.
- 자동 만료 큐
- 큐 정의시 `x-expires` 인수로 자동 만료 큐를 선언한다.이후 변경은 불가하다.(원하면 큐를 삭제하고 재정의해야한다.)
- 소비자가 없으면 `만료`, 연결된 소비자가 있는경우 `연결 해제` 또는 `Basic.Cancel` 신호를 보내야 `자동 제거`된다
- TTL 지속시간 동안 Basic.Get 요청이 없으면` 만료`된다.
- `만료된 큐`로 메시지가 전송되면 `만료 설정이 초기화`되고 큐는 `자동으로 삭제되지 않는다.`
- Rabbitmq는 큐가 만료될 때 즉시 제거되는 것을 보장하지 않는다
- 큐 정의시 `x-expires` 인수로 자동 만료 큐를 선언한다.이후 변경은 불가하다.(원하면 큐를 삭제하고 재정의해야한다.)
@Bean
public Queue mainQueue() {
Map<String, Object> args = new HashMap<String, Object>();
args.put("x-expires", 1800000);
return new Queue(QUEUE_NAME, true, false, false, args);
}
영구적인 큐
- 내구성 큐
- durable=true,로 내구성 큐라고 선언하고, delivery-mode =2 로 설정하면 디스크에 저장된다.
- 큐에서 메시지의 자동 만료
- 메시지 마다 적용되는 Properties의 expiration과 달리 Properties의 x-message-ttl은 큐에 있는 모든 메시지의 최대수명에 적용된다.이후 변경은 불가하다.(원하면 큐를 삭제하고 재정의해야한다.)
- 만료 메시지는 `dead-letter로 간주`되며 `자동삭제`되거나` x-dead-letter-exchange가 정의`되어있으면 그곳으로 전송된다.
<!-- expiration에 관한 코드 -->
MessageProperties props = new MessageProperties();
props.setExpiration(Long.toString(expiration));
Message toSend = new Message(message.toString().getBytes(), props);
rabbit.send(toSend);
<!-- x-message-ttl 관한 코드 -->
@Bean
@Qualifier("retry")
Queue retryQueue() {
return QueueBuilder
.durable(retryQueue)
.withArgument("x-message-ttl", 30000)
.build();
}
- 제한된 메시지 수 보관
- 큐의 `x-max-length` 인수로 대기 중인 메시지의 최대 크기를 정의할 수 있다. 이후 변경은 불가하다.(원하면 큐를 삭제하고 재정의해야한다.)
728x90
반응형
LIST
'나의 주니어 개발 일기 > RabbitMQ' 카테고리의 다른 글
RABBITMQ 에서 Queue에서 Consume 하고 있는 대상을 명확히 식별하고 싶을때 (0) | 2024.03.18 |
---|---|
RABBITMQ HA,클러스터 구성방법 (0) | 2024.03.05 |
Rabbit MQ Queue 정보를 다른 Rabbit MQ 서버로 이전하는 방법 (0) | 2024.02.20 |
NGINX 로 RabbitMQ 로드밸런싱 하기 (0) | 2023.07.12 |
haproxy 로 RabbitMQ서버 로드밸런싱 하기 (0) | 2023.07.11 |