consumer

Consumer

broker가 보낸 메시지를 받아 패턴에 맞는 핸들러로 라우팅하는 모듈입니다. 어노테이션과 인터페이스 두 가지 등록 방식, 그리고 자동 ACK/NACK 응답을 제공합니다.

개요

consumer는 broker가 보낸 메시지를 POST /messages로 받고, 등록된 핸들러 중 토픽 패턴이 매칭되는 것을 호출합니다.

내부에서는 FrontHandlerArrayBlockingQueue(1000)ThreadPoolExecutor(2-5)를 활용해 메시지를 비동기로 처리하고, 핸들러 호출 결과에 따라 ACK 또는 NACK를 broker에 돌려줍니다.

참고
같은 메시지에 매칭되는 핸들러가 여러 개라면 모두 호출됩니다. 패턴은 Ant 스타일이며 order.*, ** 같은 표현을 사용할 수 있습니다.

기능

  • 두 가지 등록 방식@MMMQListener 어노테이션 또는 MMMQListener<T> 인터페이스 구현
  • 패턴 매칭 라우팅 — 토픽이 패턴에 매칭되는 핸들러로 자동 분배
  • 자동 ACK/NACK — 핸들러 정상 종료 시 ACK, 예외 시 NACK 응답
  • 비동기 처리 — BlockingQueue + ThreadPoolExecutor 기반
  • POJO 매핑 — Jackson을 통한 JSON ↔ POJO 자동 변환

설치

JitPack 저장소와 consumer 아티팩트를 추가합니다.

build.gradle

build.gradle
repositories {
    mavenCentral()
    maven { url "https://jitpack.io" }
}

dependencies {
    implementation "org.springframework.boot:spring-boot-starter-web"
    implementation "com.github.moko-meringue.mmmq:consumer:0.0.2"
}

설정

consumer는 broker가 호출하는 HTTP 엔드포인트(POST /messages)를 자동으로 노출합니다. mmmq.consumer.* 같은 별도 키는 없고, Spring Boot의 server.port가 곧 consumer의 수신 포트입니다.

application.yml

application.yml
server:
  port: 8081           # broker가 이 포트로 메시지를 보냅니다
주의
broker의 Dispatcher 빈에 등록한 consumer Host(포트)가 여기서 띄운 server.port와 일치해야 합니다.

사용 예제

방식 1 — 어노테이션 (가장 간단)

일반 Spring Bean 메서드에 @MMMQListener를 붙이면 자동으로 등록됩니다.

Java · @MMMQListener
@Service
public class OrderService {

    @MMMQListener("order.*")
    public void handleOrder(Order order) {
        // JSON 페이로드가 Order로 자동 역직렬화
    }

    @MMMQListener("payment.*")
    public void handlePayment(Map<String, Object> payment) {
        // Map으로 받아도 OK
    }

    @MMMQListener  // 패턴 생략 시 "**" (전체 토픽)
    public void handleAll(Object content) { }
}

방식 2 — 인터페이스 구현 (타입 안전)

제네릭 타입 정보를 컴파일 타임에 보존하고 싶을 때 사용합니다.

Java · MMMQListener<T>
@Service
public class PaymentService implements MMMQListener<PaymentEvent> {

    @Override
    public TopicPattern listens() {
        return new TopicPattern("payment.*");
    }

    @Override
    public void handle(PaymentEvent event) {
        // 런타임 제네릭 해석으로 PaymentEvent 그대로 받음
    }
}

API 레퍼런스

핵심 클래스/어노테이션

요소 설명
@MMMQListener(String pattern) 메서드를 메시지 핸들러로 등록. 패턴 생략 시 **.
MMMQListener<T> 인터페이스 등록 방식. listens() + handle(T).
FrontHandler 수신 큐 + 스레드 풀로 메시지를 비동기 처리.
HandlerExecutions 등록된 핸들러 레지스트리. 패턴 매칭 + 캐싱.

패턴 매칭 표

패턴 매칭 예
order.* order.created, order.shipped
payment.kakao.* payment.kakao.success
** 모든 토픽