6.1 RabbitMQ๋?
- ์ ์: ๋ฉ์์ง๋ฅผ ์ก์ ์(ํ๋ก๋์)๋ก๋ถํฐ ์์ ์(์ปจ์๋จธ)์๊ฒ ์ ๋ฌํ๋ ๋ฉ์์ง ๋ธ๋ก์ปค(Message Broker)
- ์๋ ์๋ฆฌ: ๋ฐ์ดํฐ๋ฅผ ์ฆ์ ์ ๋ฌํ์ง ์๊ณ ํ(Queue)์ ์์ ํ๊ฒ ์ ์ฅํ๋ค๊ฐ, ์ ์ ํ ์์ ์ ์ปจ์๋จธ์๊ฒ ์ ๋ฌํจ.
- ํต์ฌ ์ญํ :
- ๋น๋๊ธฐ ์ฒ๋ฆฌ: ์์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ์ง ์๊ณ ๋ฉ์์ง๋ง ๋์ง๋ฏ๋ก ์์คํ ์๋ต์ฑ์ด ๋์์ง.
- ๋ถํ ๋ถ์ฐ: ์ฌ๋ฌ ์ปจ์๋จธ๊ฐ ํ๋ฅผ ๋๋์ด ์ฒ๋ฆฌํ์ฌ ์์คํ ๋ถํ๋ฅผ ๊ท ํ ์๊ฒ ์กฐ์ ํจ.
- ๋ด๊ฒฐํจ์ฑ: ๋ฉ์์ง ์ง์์ฑ์ ํตํด ์ฅ์ ๋ฐ์ ์์๋ ๋ฐ์ดํฐ ์์ค์ ๋ฐฉ์งํจ.
6.1.2 RabbitMQ์ ์ฅ๋จ์
| ๊ตฌ๋ถ | ์ฃผ์ ๋ด์ฉ |
| ์ฅ์ | ์ ๋ขฐ์ฑ: ๋์คํฌ ์ ์ฅ ๋ฐ ACK(ํ์ธ ์๋ต) ๋ฉ์ปค๋์ฆ์ ์ ๊ณต. ์ ์ฐ์ฑ: ๋ค์ํ ๋ฉ์์ง ํจํด๊ณผ AMQP, MQTT ๋ฑ ๋ค์ค ํ๋กํ ์ฝ์ ์ง์ํจ. ํ์ฅ์ฑ: ํด๋ฌ์คํฐ๋ง ๋ฐ ํ๋๋ ์ด์ ์ ํตํ ๊ณ ๊ฐ์ฉ์ฑ ๊ตฌํ ๊ฐ๋ฅํจ. ๊ด๋ฆฌ ์ฉ์ด: ์ง๊ด์ ์ธ ์น UI ๋์๋ณด๋์ ํ๋ฌ๊ทธ์ธ ์์คํ ์ ์ ๊ณตํจ. |
| ๋จ์ | ์ด์ ๋ณต์ก์ฑ: ์ด๊ธฐ ์ค์ ๋ฐ ํด๋ฌ์คํฐ ๊ด๋ฆฌ์ ๋
ธ๋ ฅ์ด ํ์ํจ. ์ค๋ฒํค๋: ์ค์ ๋ธ๋ก์ปค ๋ฐฉ์์ด๋ฏ๋ก ํธ๋ํฝ ํญ์ฃผ ์ ๋ธ๋ก์ปค ์์ฒด๊ฐ ๋ณ๋ชฉ์ด ๋ ์ ์์. ๋ฆฌ์์ค ์๋น: ๋ฉ๋ชจ๋ฆฌ์ CPU ์ฌ์ฉ๋์ด ๋์ ํธ์. ๋ฉ์์ง ํฌ๊ธฐ: ๋์ฉ๋ ํ์ผ ์ ์ก์๋ ์ ํฉํ์ง ์์. |
6.2 RabbitMQ์ ๊ธฐ๋ณธ ๊ตฌ์ฑ ์์
- ๋ฉ์์ง(Message): ์ ๋ฌํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ์ ์ต์ ๋จ์ (์: ์ฃผ๋ฌธ ๋ด์ญ)
- ํ๋ก๋์(Producer): ๋ฉ์์ง๋ฅผ ์์ฑํ์ฌ ๋ฐ์กํ๋ ์ฃผ์ฒด
- ํ(Queue): ๋ฉ์์ง๊ฐ ๋จธ๋ฌด๋ฅด๋ ์ ์ฅ์๋ก, FIFO(์ ์ ์ ์ถ) ๋ฐฉ์์ผ๋ก ๋์ํจ.
- ์ปจ์๋จธ(Consumer): ํ์์ ๋ฉ์์ง๋ฅผ ๊ฐ์ ธ์ ์ค์ ๋น์ฆ๋์ค ๋ก์ง(์: ์ด๋ฉ์ผ ๋ฐ์ก)์ ์ฒ๋ฆฌํจ.
- ์ต์ค์ฒด์ธ์ง(Exchange): ํ๋ก๋์๋ก๋ถํฐ ๋ฐ์ ๋ฉ์์ง๋ฅผ ์ด๋ค ํ๋ก ๋ณด๋ผ์ง ๊ฒฐ์ ํ๋ ๋ผ์ฐํฐ ์ญํ
6.3 RabbitMQ์ AMQP ํ๋กํ ์ฝ
- AMQP (Advanced Message Queuing Protocol): ๋ฉ์์ง ์งํฅ ๋ฏธ๋ค์จ์ด๋ฅผ ์ํ ํ์ค ํ๋กํ ์ฝ
- ์ฃผ์ ๊ฐ๋
:
- ๋ฐ์ธ๋ฉ(Binding): ์ต์ค์ฒด์ธ์ง์ ํ ์ฌ์ด์ ์ฐ๊ฒฐ ๊ณ ๋ฆฌ
- ์ต์ค์ฒด์ธ์ง ์ ํ:
- Direct: ๋ผ์ฐํ
ํค๊ฐ ์ ํํ ์ผ์นํ๋ ํ๋ก ์ ๋ฌํจ
* ์๋ฅผ ๋ค์ด, ๋ผ์ฐํ ํค๊ฐ error์ธ ๋ฉ์์ง๋ error๋ผ๋ ๋ฐ์ธ๋ฉ ํค๋ฅผ ๊ฐ์ง ํ๋ก ์ ๋ฌ๋จ - Topic: ํจํด(*, #)์ ์ฌ์ฉํ์ฌ ๋ผ์ฐํ ํค์ ๋งค์นญ๋๋ ํ๋ค๋ก ์ ๋ฌํจ.
- Fanout: ๋ผ์ฐํ ํค๋ฅผ ๋ฌด์ํ๊ณ ์ฐ๊ฒฐ๋ ๋ชจ๋ ํ์ ๋ธ๋ก๋์บ์คํธํจ.
- Headers: ๋ผ์ฐํ ํค ๋์ ๋ฉ์์ง ํค๋ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ผ์ฐํ ํจ.
- Direct: ๋ผ์ฐํ
ํค๊ฐ ์ ํํ ์ผ์นํ๋ ํ๋ก ์ ๋ฌํจ
๋๋ณด๊ธฐ
(๊ทธ๋ฅ ์ค์ตํ ๋ ์ ์ด๋๊ฑฐ๋ผ ์ ๋ณด์
๋ ๋ฉ๋๋ค)
๋์ปค ์คํ ํhttp://localhost:15672/ ์ด๊ธฐ ๋ก๊ทธ์ธ์์ ๋ฑํ ์ค์ ํ ๊ฒ ์์ผ๋ฉด guest guest |
6.4 ์ค์ต 1 : ์ธํ๋ผ ๊ตฌ์ถ (Docker)
๋์ปค๋ฅผ ์ฌ์ฉํ์ฌ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ด ํฌํจ๋ RabbitMQ๋ฅผ ์คํํจ.
# -d: ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ
# -p: 5672(ํต์ ์ฉ), 15672(๊ด๋ฆฌ UI์ฉ) ํฌํธ ํฌ์๋ฉ
# rabbitmq:management: ๊ด๋ฆฌ ๋๊ตฌ๊ฐ ํฌํจ๋ ์ด๋ฏธ์ง ์ฌ์ฉ
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 --restart=unless-stopped rabbitmq:management
- ์ ์: localhost:15672
- ์ด๊ธฐ ๋ก๊ทธ์ธ์์ ๋ฑํ ์ค์ ํ ๊ฒ ์์ผ๋ฉด (ID/PW: guest / guest)
6.5 ์ค์ต 2 : Order Application ๊ตฌํ
1) build.gradle ์ค์
dependencies {
// RabbitMQ ์ฐ๋์ ์ํ ์คํํฐ
implementation 'org.springframework.boot:spring-boot-starter-amqp'
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// ํ
์คํธ์ฉ RabbitMQ ์ ํธ๋ฆฌํฐ
testImplementation 'org.springframework.amqp:spring-rabbit-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
2) application.properties ์ค์
spring.application.name=order
# ์ปค์คํ
์ค์ : ์ต์ค์ฒด์ธ์ง ๋ฐ ํ ์ด๋ฆ ์ ์
message.exchange=market
message.queue.product=market.product
message.queue.payment=market.payment
# RabbitMQ ์ฐ๊ฒฐ ์ ๋ณด
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
3) OrderApplicationQueueConfig.java (์ค์ ์ ๋ณด)
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class OrderApplicationQueueConfig {
@Value("${message.exchange}")
private String exchange;
@Value("${message.queue.product}")
private String queueProduct;
@Value("${message.queue.payment}")
private String queuePayment;
// 1. ์ต์ค์ฒด์ธ์ง ๋น ๋ฑ๋ก (Topic ๋ฐฉ์)
@Bean public TopicExchange exchange() { return new TopicExchange(exchange); }
// 2. ๋ฉ์์ง๋ฅผ ๋ด์ ํ ๋น ๋ฑ๋ก
@Bean public Queue queueProduct() { return new Queue(queueProduct); }
@Bean public Queue queuePayment() { return new Queue(queuePayment); }
// 3. ๋ฐ์ธ๋ฉ: ์ต์ค์ฒด์ธ์ง์ ํ๋ฅผ ์ฐ๊ฒฐ (๋ผ์ฐํ
ํค ์ค์ )
@Bean public Binding bindingProduct() {
return BindingBuilder.bind(queueProduct()).to(exchange()).with(queueProduct);
}
@Bean public Binding bindingPayment() {
return BindingBuilder.bind(queuePayment()).to(exchange()).with(queuePayment);
}
}
4) OrderController.java & OrderService.java
// Controller: ์ฌ์ฉ์ ์์ฒญ์ ๋ฐ๋ ์ง์
์
@RestController
@RequiredArgsConstructor
public class OrderController {
private final OrderService orderService;
@GetMapping("/order/{id}")
public String order(@PathVariable String id) {
orderService.createOrder(id); // ์ฃผ๋ฌธ ์์ฑ ๋ก์ง ํธ์ถ
return "Order complete";
}
}
// Service: ๋ฉ์์ง ๋ฐํ ๋ก์ง ๋ด๋น
@Service
@RequiredArgsConstructor
public class OrderService {
@Value("${message.queue.product}")
private String productQueue;
@Value("${message.queue.payment}")
private String paymentQueue;
private final RabbitTemplate rabbitTemplate; // ์คํ๋ง์ด ์ ๊ณตํ๋ RabbitMQ ์ก์ ํ
ํ๋ฆฟ
public void createOrder(String orderId) {
// convertAndSend(๋ผ์ฐํ
ํค, ๋ฉ์์ง๊ฐ์ฒด) ํํ๋ก ์ ์กํจ
// ์ฌ๊ธฐ์๋ ๊ฐ๊ฐ ์ํ ์ ๋ณด ํ์ ๊ฒฐ์ ์ ๋ณด ํ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋
rabbitTemplate.convertAndSend(productQueue, orderId);
rabbitTemplate.convertAndSend(paymentQueue, orderId);
}
}
6.6 ์คํ ๋ฐ ํ์ธ ๊ฒฐ๊ณผ
- ์ ํ๋ฆฌ์ผ์ด์ ์คํ: /order/1 ๊ฒฝ๋ก๋ก GET ์์ฒญ์ ๋ณด๋.
- ๋์๋ณด๋ ํ์ธ: localhost:15672 ์ ์ ์ market ์ต์ค์ฒด์ธ์ง์ 2๊ฐ์ ํ(market.product, market.payment)๊ฐ ์๋ ์์ฑ๋ ๊ฒ์ ๋ณผ ์ ์์.
- ๋ฉ์์ง ํ์ธ:
- ํ ์์ธ ํ์ด์ง์ 'Get Messages' ์น์ ์ ํตํด ์ค์ ์ ๋ฌ๋ 1 ์ด๋ผ๋ ์ฃผ๋ฌธ ID ๊ฐ์ ์ง์ ํ์ธํ ์ ์์.
- ํ์ฌ ์ปจ์๋จธ(์์ ์)๋ฅผ ๋ง๋ค์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฉ์์ง๋ ์ฒ๋ฆฌ๋์ง ์๊ณ ํ์ Total ํญ๋ชฉ์ ์์ฌ ์๊ฒ ๋จ.
๐ก ์ถ๊ฐ ์ค๋ช : ์ค๋ฌด์์๋ ๋ฉ์์ง ์ ์ค์ ๋ง๊ธฐ ์ํด ํ ์์ฑ ์ durable=true ์ต์ ์ ์ฃผ๊ฑฐ๋, ์ปจ์๋จธ์์ ๋ฉ์์ง ์ฒ๋ฆฌ ์ค ์๋ฌ๊ฐ ๋๋ฉด ํ๋ก ๋ค์ ๋๋ ค๋ณด๋ด๋(Redeliver) ์ ๋ต์ ์ธ๋ฐํ๊ฒ ๊ตฌ์ฑํด์ผ ํจ.
'Kafka' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| 5. ๊ณ ๋ํ๋ ์ํคํ ์ฒ์ ์ด์ ์ ๋ต - 2PC๋ฅผ ์ฌ์ฉํ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ถํฐ (0) | 2026.03.23 |
|---|---|
| 4. ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง (2) (0) | 2026.03.23 |
| 3. ๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง (1) (0) | 2026.03.23 |