1. 컨슈머 병렬 처리
동일 큐를 선언한 컨슈머 여러 개 실행할 경우 병렬 처리됨
- 네이버 체크아웃 컨슈머 NaverQueue 10개 실행되고 있는 현재 상황이랑 같음
- NaverQueue 에 메시지가 100개 쌓여 있다면
- 컨슈머 10개가 각각 알아서 처리함
이러한 방법은 작업 시간이 아주 오래 걸리는 작업 일 때 평균적으로 모든 컨슈머는 동일한 수의 메시지를 받습니다.
이러한 메시지 배포 방식을 라운드 로빈이라고 합니다.
# 쉘 3 (프로듀서)
php send.php 첫 번째 메시지.
php send.php 두 번째 메시지..
php send.php 세 번째 메시지...
php send.php 네 번째 메시지....
php send.php 다섯 번째 메시지.....
# 쉘 1 (컨슈머)
PHP worker.php
# => [*] 메시지를 기다리고 있습니다. 종료하려면 Ctrl+C를 누르십시오.
# => [x] '첫 번째 메시지'를 받았습니다.
# => [x] '세 번째 메시지...'를 받았습니다.
# => [x] '다섯번째 메시지.....'를 받았습니다.
# 쉘 2 (컨슈머)
PHP worker.php
# => [*] 메시지를 기다리고 있습니다. 종료하려면 Ctrl+C를 누르십시오.
# => [x] '두 번째 메시지..' 수신
# => [x] '네 번째 메시지....'를 받았습니다.
위처럼 아름답게 번갈아가면서 되지는 않음
하나의 프로세스에다 몰빵 하지 않고 골고루 처리하도록 하는 메소드
$channel->basic_qos(null, 1, null);
메시지를 처리하고 승인할 때까지 작업자에게 새 메시지를 발송하지 않고 대신 아직 사용 중이 아닌 다음 작업자에게 전달

2. 메세지 손실 방지
2.1. ack
작업은 처리 했는데 unacked 임

정상적으로 처리 완료 되었어요 하고 RabbitMQ에 알려주는 것
$msg→ack()
만약 컨슈머가 강제 종료 되었을 경우 ack() 호출하지 않은 메세지는
다시 ready 로 넘어가서 컨슈머 재 실행 시 메세지 재 발송 처리함

컨슈머가 사망하더라도 작업이 손실 되지 않도록 하는 방법 (ack)
하지만 RabbitMQ 서버가 중지되면 작업은 계속 손실 된다
2.2. 큐 손실 방지 처리
$channel->queue_declare( ‘hello' , false , true , false , false );
RabbitMQ가 종료되거나 충돌하면 사용자가 지시하지 않는 한 큐와 메시지를 잊어버립니다. 메시지가 손실 되지 않도록 하려면 두 가지가 필요합니다. 큐과 메시지를 모두 내구성 있는 것으로 표시해야 합니다
큐가 RabbitMQ 노드를 다시 시작해도 살아남을 수 있는지 확인해야 합니다. 그렇게 하려면 이를 내구성 으로 선언
hello 라는 큐를 이미 정의했기 때문에 hello 큐를 지우거나 아니면 새로운 큐 이름으로 선언해야 함
true 로 설정된 이 플래그 는 프로듀서 및 컨슈머 코드 모두에 적용되어야 합니다.
2.3. 메세지를 지속성으로 표시
delivery_mode = 2
'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT
RabbitMQ에 메시지를 디스크에 저장하도록 지시
참고 : 메시지를 지속적으로 표시한다고 해서 메시지가 손실 되지 않는다는 보장은 없음
'기술, 개발 > RabbitMQ' 카테고리의 다른 글
| 로키리눅스 래빗앰큐 설치 (1) | 2025.09.10 |
|---|---|
| Dead Letter Exchange (메세지 만료) (0) | 2025.09.10 |
| Queue and Exchange (0) | 2025.09.10 |
| RabbitMQ 개념 (0) | 2025.09.10 |
| RabbitMQ 최신 버전 우분투 설치 (0) | 2025.09.10 |