Spring Boot 기반,
내구성 있는,
메시지 브로커
mmmq

Spring Boot 환경에서 간편하게 구축할 수 있습니다.
디스크 쓰기를 통해 메시지의 내구성을 보장합니다.
토픽 패턴 기반의 pub-sub 구조로, fan-out 방식으로 메시지를 분배합니다.

Producer

메시지 발행

producer는 토픽 이름과 함께 메시지를 broker로 보냅니다. broker의 응답을 받으면 발행이 완료되며, consumer의 처리를 기다리지 않습니다.

Producer
Message message = new Message(
    new Topic("order.created"),
    order
);
producer.produce(message);
Broker

보관과 라우팅

broker는 수신한 메시지를 디스크에 기록한 뒤 producer에게 응답합니다. 이후 토픽 패턴이 매칭되는 모든 Dispatcher가 각자의 ConsumerId를 실어 consumer에게 메시지를 전송합니다.

Broker
new Dispatcher(
    consumerHost,
    new ConsumerId("order-created"),
    new TopicPattern("order.created")
);
Consumer

수신과 처리

consumer는 메시지에 실린 ConsumerId로 해당 핸들러를 찾아 호출하고, 처리 결과를 즉시 broker에 응답합니다.

Consumer
@MMMQListener(id = "order-created")
public void handle(Order order) {
    // 처리 로직
}
01 / 03
WHY mmmq

왜 mmmq인가?

Spring Boot 환경에 메시지 브로커를 도입할 때 mmmq가 제공하는 이점입니다.

외부 인프라 없이 빠른 시작 Zero Infrastructure

메시지 브로커를 위한 별도 서버를 구축하거나 운영할 필요가 없습니다.
producer, broker, consumer를 각자의 Spring Boot 애플리케이션에서 바로 사용할 수 있습니다.
사용하기 쉬운 API Easy to Use

@MMMQListener 어노테이션만 사용하면 메시지를 처리할 수 있습니다.
핸들러에 부여한 id로 라우팅된 메시지가 인자 타입에 맞춰 전달됩니다.
높은 내구성 Durability

broker는 수신한 메시지를 디스크에 기록한 후 producer에게 응답합니다.
응답이 완료된 메시지는 예기치 못한 장애나 재시작 상황에서도 유실되지 않습니다.
CORE BEHAVIOR

특징

mmmq의 동작을 정의하는 네 가지 특성입니다.

발행과 구독 Pub-Sub

producer가 발행한 메시지는 토픽을 구독하는 모든 consumer에게 전달됩니다.
broker가 직접 consumer에게 메시지를 전송하는 push 모델로 동작합니다.
최소 한 번 전달 at-least-once

발행된 메시지는 consumer에게 최소 한 번 전달됩니다.
같은 메시지가 두 번 이상 전달될 수 있으므로, 소비 로직은 멱등하게 구현해야 합니다.
메시지 영속화 Persistence

발행된 메시지는 broker에 보존되어, 재시작 후에도 다시 소비할 수 있습니다.
새로 추가된 consumer도 토픽을 리플레이할 수 있습니다.
패턴 기반 라우팅 Pattern-Based Routing

order.*, alert.** 같은 토픽 패턴으로 메시지를 분배합니다.
메시지는 토픽을 기준으로 fan-out 방식으로 분배되며, 매칭되는 모든 핸들러가 동일한 메시지를 수신합니다.