Producer
broker로 메시지를 발행하는 모듈입니다.
개요
사용자 애플리케이션에서 broker로 메시지를 보낼 때 사용하는 모듈입니다.
요구사항
mmmq를 사용하려면 다음 환경이 필요합니다.
| 항목 | 최소 버전 |
|---|---|
| Java | 17 |
| Spring Boot | 3.2.0 |
설치
producer는 JitPack으로 배포됩니다.
build.gradle에 의존성을 추가해 주세요.
build.gradle (Groovy DSL)
repositories { mavenCentral() maven { url "https://jitpack.io" } } dependencies { implementation "com.github.moko-meringue.mmmq:producer:0.0.2" }
build.gradle.kts (Kotlin DSL)
repositories { mavenCentral() maven("https://jitpack.io") } dependencies { implementation("com.github.moko-meringue.mmmq:producer:0.0.2") }
Producer 생성
Producer Bean을 등록합니다.
옵션은 생성자에서 지정합니다.
Spring Bean 등록
@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 재시도 참고 |
메시지 발행
Producer의 produce(Message) 메서드를 통해 broker로 메시지를 전달합니다.
가벼운 키–값은 Map으로 즉석에서 만들고, 도메인 객체는 POJO를 그대로 전송합니다.
@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)는 동기로 동작하며 다음 순서로 처리됩니다.
Message를 요청 바디에 담아 broker의/messages엔드포인트로 POST 요청을 전송합니다.- 응답이
ACK이면 메시지 발행이 완료된 것으로, 종료합니다. - 응답이
NACK이면 재전송합니다 (자세한 내용은 NACK 재시도 참고). - 네트워크 예외가 발생하면
ProduceException이 발생합니다.
전송 포맷
broker로 보내는 요청과 받는 응답은 모두 JSON입니다.
{
"topic": { "name": "order.created" },
"content": { "id": 1, "customer": "meringue" }
}
{ "acknowledgement": "ACK" }
NACK 재시도
broker가 NACK을 반환하면 produce(Message)는 메시지를 재전송합니다.
NACK이 발생하는 경우
NACK은 broker가 메시지를 정상적으로 처리하지 못했을 때 돌려주는 응답입니다.
broker가 메시지를 영속화하는 과정에서 오류가 발생했을 때 NACK이 반환됩니다.
재시도 메커니즘
NACK응답을 받으면 동일한Message를 즉시 재전송합니다.maxRetryCount(기본3)까지 반복합니다. 초기 시도까지 합치면 최대1 + maxRetryCount번 요청 전송됩니다.- 중간에 broker가
ACK을 돌려주면 그 자리에서 정상 반환합니다. - 마지막 시도까지
NACK이 이어지면ProduceException이 발생합니다.
재시도 횟수 변경
기본 재시도 횟수(maxRetryCount)는 3으로, Producer 생성자 인자를 통해 값을 설정할 수
있습니다.
Producer producer = new Producer(brokerHost, 5); // 5번 재시도