producer

Producer

broker로 메시지를 발행하는 모듈입니다.

개요

사용자 애플리케이션에서 broker로 메시지를 보낼 때 사용하는 모듈입니다.

요구사항

mmmq를 사용하려면 다음 환경이 필요합니다.

항목 최소 버전
Java 17
Spring Boot 3.2.0

설치

producer는 JitPack으로 배포됩니다.
build.gradle에 의존성을 추가해 주세요.

build.gradle (Groovy DSL)

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

dependencies {
    implementation "com.github.moko-meringue.mmmq:producer:0.0.2"
}

build.gradle.kts (Kotlin DSL)

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

dependencies {
    implementation("com.github.moko-meringue.mmmq:producer:0.0.2")
}

Producer 생성

Producer Bean을 등록합니다.
옵션은 생성자에서 지정합니다.

Spring Bean 등록

ProducerConfig.Java
@Configuration
public class ProducerConfig {

    @Bean
    public Producer producer() {
        Host brokerHost = new Host(WebProtocol.HTTP, "localhost", 8080);
        return new Producer(brokerHost);
    }
}

생성자 매개변수

매개변수 타입 기본값 설명
host Host 필수 broker의 Host
maxRetryCount int 3 NACK 응답에 대한 최대 재시도 횟수. 자세한 내용은 NACK 재시도 참고

메시지 발행

Producerproduce(Message) 메서드를 통해 broker로 메시지를 전달합니다.

가벼운 키–값은 Map으로 즉석에서 만들고, 도메인 객체는 POJO를 그대로 전송합니다.

OrderEventPublisher.Java
@Service
public class OrderEventPublisher {

    private final Producer producer;

    public OrderEventPublisher(Producer producer) {
        this.producer = producer;
    }

    // Map
    public void publishOrderCancelled(long orderId, String reason) {
        Message message = new Message(
            new Topic("order.cancelled"),
            Map.of("id", orderId, "reason", reason)
        );
        producer.produce(message);
    }

    // Object
    public void publishOrderCreated(OrderCreatedEvent event) {
        Message message = new Message(
            new Topic("order.created"),
            event
        );
        producer.produce(message);
    }
}

발행 과정

produce(Message)동기로 동작하며 다음 순서로 처리됩니다.

  1. Message를 요청 바디에 담아 broker의 /messages 엔드포인트로 POST 요청을 전송합니다.
  2. 응답이 ACK이면 메시지 발행이 완료된 것으로, 종료합니다.
  3. 응답이 NACK이면 재전송합니다 (자세한 내용은 NACK 재시도 참고).
  4. 네트워크 예외가 발생하면 ProduceException이 발생합니다.

전송 포맷

broker로 보내는 요청과 받는 응답은 모두 JSON입니다.

요청
{
    "topic": { "name": "order.created" },
    "content": { "id": 1, "customer": "meringue" }
}
응답
{ "acknowledgement": "ACK" }

NACK 재시도

broker가 NACK을 반환하면 produce(Message)는 메시지를 재전송합니다.

NACK이 발생하는 경우

NACK은 broker가 메시지를 정상적으로 처리하지 못했을 때 돌려주는 응답입니다.
broker가 메시지를 영속화하는 과정에서 오류가 발생했을 때 NACK이 반환됩니다.

재시도 메커니즘

  1. NACK 응답을 받으면 동일한 Message를 즉시 재전송합니다.
  2. maxRetryCount(기본 3)까지 반복합니다. 초기 시도까지 합치면 최대 1 + maxRetryCount번 요청 전송됩니다.
  3. 중간에 broker가 ACK을 돌려주면 그 자리에서 정상 반환합니다.
  4. 마지막 시도까지 NACK이 이어지면 ProduceException이 발생합니다.

재시도 횟수 변경

기본 재시도 횟수(maxRetryCount)는 3으로, Producer 생성자 인자를 통해 값을 설정할 수 있습니다.

Java
Producer producer = new Producer(brokerHost, 5);   // 5번 재시도