Message Queue(MQ)는 비동기 메시지 기반 통신을 제공하는 시스템으로, 데이터를 생산자(Producer)가 생성하여 큐(Queue)에 저장하고, 소비자(Consumer)가 필요할 때 메시지를 가져가 처리하는 방식으로 동작한다.
일반적으로 마이크로 서비스, 이벤트 기반 아키텍처, 비동기 처리 등에 활용된다.
메시지는 FIFO(First In, First Out) 방식으로 처리되지만, 일부 메시지 큐 시스템에서는 우선순위(priority), 지연(delayed), 라우팅(routing) 등의 기능도 제공함.
| 특징 | Kafka | RabbitMQ |
|---|---|---|
| 기능 | 메시지 스트리밍, 로그 저장 | 고급 라우팅, 메시지 브로커 |
| 처리 방식 | Pull 방식 (Consumer가 메시지를 가져감) | Push 방식 (Broker가 Consumer에게 메시지 전달) |
| 성능 | 높은 처리량 (Throughput) | 낮은 지연 시간 (Low Latency) |
| 메시지 보존 | 디스크에 저장 (오래 유지 가능) | 큐에서 소비되면 삭제 |
| 사용 사례 | 실시간 데이터 처리, 이벤트 스트리밍 | 금융, 주문 시스템, IoT 메시징 |
Kafka 관련 설정을 추가한다.
spring:
kafka:
bootstrap-servers: localhost:9092 # Kafka 브로커 주소
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
group-id: my-group # Consumer 그룹 ID
auto-offset-reset: earliest # 가장 처음부터 메시지 읽기
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
Kafka에 메시지를 전송하는 Producer를 생성한다.
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
@Service
public class KafkaProducer {
private final KafkaTemplate<String, String> kafkaTemplate;
public KafkaProducer(KafkaTemplate<String, String> kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
public void sendMessage(String message) {
kafkaTemplate.send("test-topic", message); // "test-topic"으로 메시지 전송
System.out.println("Sent: " + message);
}
}
Kafka에서 메시지를 읽어오는 Consumer를 생성한다.
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;
@Service
public class KafkaConsumer {
@KafkaListener(topics = "test-topic", groupId = "my-group")
public void listen(ConsumerRecord<String, String> record) {
System.out.println("Received: " + record.value());
}
}
비동기 처리 & 마이크로서비스 구축 시 Message Queue 사용을 고려해 보자.