amqp_basic_consume 함수 설명

백엔드&인프라 추종자·2025년 11월 11일

좋아요, 정우님. 😄
rabbitmq-c 라이브러리의 amqp_basic_consume() 함수는 RabbitMQ 큐에서 메시지를 구독(consume)할 때 사용하는 핵심 함수입니다.
각 인자와 의미를 하나씩 자세히 설명드리겠습니다.


함수 시그니처

amqp_basic_consume(
    amqp_connection_state_t state, // 연결
    amqp_channel_t channel,        // 채널
    amqp_bytes_t queue,            // 큐 이름
    amqp_bytes_t consumer_tag,     // 컨슈머 태그
    amqp_boolean_t no_local,       // 다른 연결 메시지 제외 여부
    amqp_boolean_t no_ack,         // auto_ack 여부
    amqp_boolean_t exclusive,      // 큐 독점 여부
    amqp_table_t arguments         // 추가 옵션
);

1️⃣ state – 연결 객체

  • 타입: amqp_connection_state_t
  • 의미: RabbitMQ 서버와 연결된 상태 객체
  • 생성: amqp_new_connection() 이후 사용
  • 예:
amqp_connection_state_t conn = amqp_new_connection();

2️⃣ channel – 채널 번호

  • 타입: amqp_channel_t (보통 int)
  • 의미: TCP 연결 내 독립적인 통신 경로
  • 주의: 멀티스레드라면 채널을 공유하지 말고 각 스레드별로 생성
  • 서버와 번호를 맞출 필요 없음, 같은 연결 안에서 고유하면 됨

3️⃣ queue – 큐 이름

  • 타입: amqp_bytes_t
  • 의미: 구독할 큐 이름
  • 예:
amqp_bytes_t queue = amqp_cstring_bytes("test_queue");
  • 빈 문자열("") 주면 서버가 임시 큐 이름 생성

4️⃣ consumer_tag – 컨슈머 태그

  • 타입: amqp_bytes_t
  • 의미: 컨슈머 식별자
  • 예:
amqp_bytes_t consumer_tag = amqp_cstring_bytes("my_consumer");
  • 빈 문자열이면 서버가 자동 생성
  • 컨슈머 취소(basic.cancel) 시 사용

5️⃣ no_local – 다른 연결 메시지 제외

  • 타입: amqp_boolean_t

  • 의미: 자기 연결에서 publish한 메시지를 받지 않음

  • RabbitMQ 서버 대부분 구현에서는 0으로 설정, 잘 안 쓰임

  • 값:

    • 0 → 자기 메시지도 수신 가능
    • 1 → 자기 메시지는 제외

6️⃣ no_ack – auto_ack 설정

  • 타입: amqp_boolean_t

  • 의미: 메시지 수신 시 서버에서 자동으로 Ack 처리

  • 값:

    • 0 → 수동 ack 필요 (amqp_basic_ack() 호출)
    • 1 → auto ack, 메시지 받자마자 서버 ack 처리
  • 주의: auto_ack=true 상태에서 amqp_basic_ack() 호출하면 unknown delivery tag 오류 발생


7️⃣ exclusive – 큐 독점 여부

  • 타입: amqp_boolean_t

  • 의미: 컨슈머가 큐를 독점

  • 값:

    • 0 → 다른 컨슈머도 구독 가능
    • 1 → 해당 컨슈머만 큐 사용 가능, 다른 컨슈머는 연결 불가
  • 주로 RPC reply 큐임시 큐에서 사용


8️⃣ arguments – 추가 옵션

  • 타입: amqp_table_t
  • 의미: 큐 구독 시 추가 플래그/옵션 전달
  • 예: 메시지 TTL, max-length 등
  • 기본값: amqp_empty_table
amqp_table_t args = amqp_empty_table;

9️⃣ 예제 코드

amqp_basic_consume(
    conn,                       // 연결
    1,                          // 채널 1
    amqp_cstring_bytes("my_queue"), 
    amqp_empty_bytes,           // consumer_tag 자동 생성
    0,                          // no_local = false
    0,                          // no_ack = false -> 수동 ack
    0,                          // exclusive = false
    amqp_empty_table             // 추가 옵션 없음
);
  • 수동 ack 모드에서 메시지 처리 후:
amqp_basic_ack(conn, 1, delivery_tag, 0);

💡 정리

  • amqp_basic_consume()는 큐 구독 핵심 함수
  • no_ack = auto_ack
  • 채널과 delivery_tag는 서로 독립적
  • 멀티스레드 환경에서는 채널 별로 생성
  • 메시지 안정성을 위해 수동 ack(auto_ack=false) 추천

원하시면 제가 이걸 기반으로 ffmpegd C 데몬 + RabbitMQ consumer 예제를 만들어서

  • multi-channel 안전 처리
  • delivery_tag 관리
  • auto_ack 옵션 적용
  • stdout/stderr 로그 + signal 처리

모든 실전용 구조로 보여드릴 수도 있습니다.

만들어 드릴까요?

profile
AI 답변 글을 주로 올립니다.

0개의 댓글