RabbitMQμ κ³ κΈ λΌμ°ν μ λ΅μ νμνμ¬ μ μΈκ³ λΆμ° μμ€ν μμ ν¨μ¨μ μ΄κ³ μ μ°ν λ©μμ§ μ²λ¦¬λ₯Ό κ°λ₯νκ² ν©λλ€. Exchange, Binding λ° μ€μ μ¬μ© μ¬λ‘μ λν΄ μμ보μΈμ.
RabbitMQ κ³ κΈ λΌμ°ν μ λ΅: μ’ ν© κ°μ΄λ
RabbitMQλ μ μΈκ³ μλ§μ μ ν리μΌμ΄μ μμ λΉλκΈ° ν΅μ μ μ§μνλ λ리 μ±νλ μ€νμμ€ λ©μμ§ λΈλ‘컀μ λλ€. κ²¬κ³ ν μν€ν μ²μ μ μ°ν λΌμ°ν κΈ°λ₯μ ν΅ν΄ νΉν λ§μ΄ν¬λ‘μλΉμ€ μν€ν μ²μ κ°μ νκ²½μμ μ΅μ λΆμ° μμ€ν μ μ΄μμ΄ λ©λλ€. μ΄ κ°μ΄λμμλ RabbitMQμ κ³ κΈ λΌμ°ν μ λ΅μ μ¬μΈ΅μ μΌλ‘ λ€λ£¨λ©°, μ ν리μΌμ΄μ λ΄μμ λ©μμ§λ₯Ό ν¨μ¨μ μΌλ‘ κ΄λ¦¬νκ³ μ λ¬νλ λ°©λ²μ λν μμΈν μ΄ν΄λ₯Ό μ 곡ν©λλ€.
κΈ°λ³Έ κ°λ μ΄ν΄: μ΅μ€μ²΄μΈμ§, λ°μΈλ©, ν
κ³ κΈ λΌμ°ν μ λν΄ μμ보기 μ μ RabbitMQμ ν΅μ¬ κ°λ μΈ μ΅μ€μ²΄μΈμ§(Exchanges), λ°μΈλ©(Bindings), ν(Queues)λ₯Ό μ΄ν΄νλ κ²μ΄ μ€μν©λλ€.
- μ΅μ€μ²΄μΈμ§(Exchanges): μ΅μ€μ²΄μΈμ§λ λ°νμ(publisher)λ‘λΆν° λ©μμ§λ₯Ό μμ νκ³ λΌμ°ν ν€μ λ°μΈλ©μ κΈ°λ°μΌλ‘ νλ‘ λ©μμ§λ₯Ό λΌμ°ν ν©λλ€. RabbitMQλ κ°κ° κ³ μ ν λΌμ°ν λμμ κ°μ§ μ¬λ¬ μ΅μ€μ²΄μΈμ§ μ νμ μ 곡ν©λλ€.
- λ°μΈλ©(Bindings): λ°μΈλ©μ μ΅μ€μ²΄μΈμ§μ ν κ°μ κ΄κ³λ₯Ό μ μν©λλ€. μ΄λ μ΅μ€μ²΄μΈμ§μ μ΄λ€ λ©μμ§κ° νΉμ νλ‘ μ λ¬λμ΄μΌ νλμ§ λ§€μΉμ μν λΌμ°ν ν€λ₯Ό μ¬μ©νμ¬ μ§μ ν©λλ€.
- ν(Queues): νλ μλΉμ(consumer) μ ν리μΌμ΄μ μ΄ λ©μμ§λ₯Ό μλΉν λκΉμ§ λ©μμ§λ₯Ό μ μ₯ν©λλ€. μλΉμλ νμ μ°κ²°νμ¬ κ΅¬λ κΈ°μ€μ λ°λΌ λ©μμ§λ₯Ό μμ ν©λλ€.
μ΄λ₯Ό μ°νΈ μμ€ν μ²λΌ μκ°ν΄λ³΄μΈμ. μ΅μ€μ²΄μΈμ§λ μ°νΈ λΆλ₯ μ¬λ¬΄μμ κ°κ³ , νλ μ°νΈ μ¬μν¨κ³Ό κ°μΌλ©°, λ°μΈλ©μ μ£Όμ(λΌμ°ν ν€)λ₯Ό κΈ°λ°μΌλ‘ λΆλ₯ μ¬λ¬΄μμ νΈμ§λ₯Ό μ΄λλ‘ λ°°λ¬ν μ§ μλ €μ£Όλ μ§μΉ¨μ λλ€.
μ΅μ€μ²΄μΈμ§ μ ν: μ¬λ°λ₯Έ μ λ΅ μ ν
RabbitMQλ λ€μν λΌμ°ν μλ리μ€μ μ ν©ν μ¬λ¬ μ΅μ€μ²΄μΈμ§ μ νμ μ 곡ν©λλ€. μ ν리μΌμ΄μ μ μ±λ₯κ³Ό λ©μμ§ μ λ¬ μ νλλ₯Ό μν΄ μ μ ν μ΅μ€μ²΄μΈμ§ μ νμ μ ννλ κ²μ΄ μ€μν©λλ€. λ€μμ κ°μ₯ μΌλ°μ μΈ μ νμ λν μμΈν μ€λͺ μ λλ€.
1. λ€μ΄λ νΈ μ΅μ€μ²΄μΈμ§ (Direct Exchange)
λ€μ΄λ νΈ μ΅μ€μ²΄μΈμ§λ κ°μ₯ κ°λ¨ν λΌμ°ν μ λ΅μ λλ€. λ°μΈλ© ν€κ° λ©μμ§μ λΌμ°ν ν€μ μ νν μΌμΉνλ νλ‘ λ©μμ§λ₯Ό μ λ¬ν©λλ€. νΉμ κΈ°μ€μ λ°λΌ νΉμ νλ‘ λ©μμ§λ₯Ό 보λ΄μΌ ν λ μ΄μμ μ λλ€.
μ¬μ© μ¬λ‘:
- μμ λΌμ°ν : νΉμ μμ μμκ² μμ λ°°ν¬ (μ: μ μ© μ΄λ―Έμ§ μ²λ¦¬ μλ²λ₯Ό ν΅ν μ΄λ―Έμ§ μ²λ¦¬).
- μλ¦Ό μμ€ν : νΉμ μ¬μ©μ λλ μ₯μΉμ μλ¦Ό μ μ‘.
μμ: μ£Όλ¬Έ νμΈμ μ²λ¦¬ν΄μΌ νλ μμ€ν μ μμν΄ λ³΄μΈμ. κ° μ£Όλ¬Έ νμΈμλ "order.confirmation.12345"μ κ°μ λΌμ°ν ν€κ° μμ μ μμ΅λλ€. λ§μ½ νκ° "order.confirmation.12345" λ°μΈλ© ν€λ‘ λ€μ΄λ νΈ μ΅μ€μ²΄μΈμ§μ λ°μΈλ©λμ΄ μλ€λ©΄, ν΄λΉ λΌμ°ν ν€λ₯Ό κ°μ§ μ£Όλ¬Έ νμΈ λ©μμ§λ§ νλ‘ μ λ¬λ©λλ€.
2. ν¬μμ μ΅μ€μ²΄μΈμ§ (Fanout Exchange)
ν¬μμ μ΅μ€μ²΄μΈμ§λ λΌμ°ν ν€λ₯Ό 무μνκ³ μμ μκ² λ°μΈλ©λ λͺ¨λ νλ‘ λ©μμ§λ₯Ό λΈλ‘λμΊμ€νΈν©λλ€. λμΌν λ©μμ§λ₯Ό μ¬λ¬ μλΉμμκ² λ°°ν¬ν΄μΌ νλ μλ리μ€μ μ ν©ν©λλ€.
μ¬μ© μ¬λ‘:
- μλ¦Ό λΈλ‘λμΊμ€ν : λμΌν μλ¦Όμ μ¬λ¬ ꡬλ μμκ² μ μ‘ (μ: μ°κ²°λ λͺ¨λ ν΄λΌμ΄μΈνΈμκ² λ΄μ€ μ λ°μ΄νΈ λ°ν).
- λ‘κΉ : μ¬λ¬ λ‘κΉ μλΉμ€λ‘ λ‘κ·Έ λ©μμ§ μ μ‘.
μμ: λ΄μ€ μΉμ¬μ΄νΈμμ μ κΈ°μ¬λ₯Ό λ°νν©λλ€. ν¬μμ μ΅μ€μ²΄μΈμ§λ μ΄ κΈ°μ¬ μλ¦Όμ μ΄λ©μΌ μλ¦Ό, SMS μλ¦Ό, λͺ¨λ°μΌ μ± νΈμ μλ¦Όκ³Ό κ°μ΄ λ€μν ꡬλ μλ₯Ό λνλ΄λ νλ‘ λ³΄λΌ μ μμ΅λλ€.
3. ν ν½ μ΅μ€μ²΄μΈμ§ (Topic Exchange)
ν ν½ μ΅μ€μ²΄μΈμ§λ λΌμ°ν ν€μ μμΌλμΉ΄λ λ§€μΉμ κΈ°λ°μΌλ‘ λΌμ°ν μ κ°λ₯νκ² νλ κ°μ₯ μ μ°ν μ νμ λλ€. λ°μΈλ© ν€μ λΌμ°ν ν€λ μ μΌλ‘ ꡬλΆλ λ¨μ΄λ€λ‘ ꡬμ±λ λ¬Έμμ΄μ λλ€. λΌμ°ν ν€λ λ€μ κ·μΉμ μ¬μ©ν©λλ€:
#μ 0κ° μ΄μμ λ¨μ΄μ μΌμΉν©λλ€.*μ μ νν νλμ λ¨μ΄μ μΌμΉν©λλ€.
μ¬μ© μ¬λ‘:
- μ΄λ²€νΈ κΈ°λ° μν€ν μ²: μ΄λ²€νΈ μ ν λ° μΉ΄ν κ³ λ¦¬λ₯Ό κΈ°λ°μΌλ‘ μ΄λ²€νΈ λΌμ°ν (μ: "stock.us.ny.ibm", "order.created.20230718").
- 볡μ‘ν νν°λ§: λ¨μΌ μμ€ν λ΄μμ λ€μν μ νμ λ©μμ§λ₯Ό μ²λ¦¬νκ³ μλΉμκ° νΉμ κ΄μ¬ ν ν½μ ꡬλ ν μ μλλ‘ νμ©.
μμ: μμ₯ λ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ λ©μμ§λ₯Ό λΌμ°ν ν΄μΌ νλ κΈμ΅ μμ€ν μ κ³ λ €ν΄ λ³΄μΈμ. ν ν½ μ΅μ€μ²΄μΈμ§λ "stock.*.ibm" (λͺ¨λ IBM μ£Όμ μ λ°μ΄νΈ) λλ "*.us.ny.#" (λ΄μμ λͺ¨λ μ΄λ²€νΈ)μ κ°μ λΌμ°ν ν€λ₯Ό κ°μ§ λ©μμ§λ₯Ό λΌμ°ν ν μ μμ΅λλ€. "stock.#.ibm" λ°μΈλ© ν€λ‘ ꡬλ λ νλ μ§μκ³Ό μκ΄μμ΄ λͺ¨λ IBM μ£Όμμ λν μ λ°μ΄νΈλ₯Ό μμ ν©λλ€.
4. ν€λ μ΅μ€μ²΄μΈμ§ (Header Exchange)
ν€λ μ΅μ€μ²΄μΈμ§λ ν€λ κ°μ κΈ°λ°μΌλ‘ λ©μμ§λ₯Ό λΌμ°ν ν©λλ€. λΌμ°ν ν€μ λ§€μΉνλ λμ λ©μμ§ ν€λλ₯Ό κ²μ¬ν©λλ€. λ°μΈλ©μ λ©μμ§ ν€λμ ν€-κ° μμ κΈ°λ°μΌλ‘ μ μλλ©°, ν ν½ μ΅μ€μ²΄μΈμ§λ³΄λ€ λ 볡μ‘ν νν°λ§ λ©μ»€λμ¦μ μ 곡ν©λλ€.
μ¬μ© μ¬λ‘:
- μ½ν μΈ κΈ°λ° λΌμ°ν : μ½ν μΈ μ ν, μ°μ μμ λλ κΈ°ν λ©μμ§ λ©νλ°μ΄ν°λ₯Ό κΈ°λ°μΌλ‘ λ©μμ§ λΌμ°ν .
- λ©μμ§ λ³΄κ°(Message Enrichment): λ©μμ§ μλ³Έ λλ λͺ©μ μ λ°λΌ λ©μμ§λ₯Ό μ²λ¦¬νκΈ° μν΄ λ€λ₯Έ λ©μμ§ λ³νκ³Ό ν¨κ» μ¬μ©.
μμ: μ½ν μΈ μ ν(μ: text/plain, application/json)μ κΈ°λ°μΌλ‘ λ©μμ§λ₯Ό μ²λ¦¬ν΄μΌ νλ μμ€ν μ κ°μ ν΄ λ³΄μΈμ. ν€λ μ΅μ€μ²΄μΈμ§λ βContent-Typeβ ν€λκ° "application/json"μΌλ‘ μ€μ λ λ©μμ§λ₯Ό JSON μ²λ¦¬λ₯Ό μν΄ μ§μ λ νλ‘ λΌμ°ν ν μ μμ΅λλ€. μ΄λ λ°μ΄ν° μ νμ κΈ°λ°μΌλ‘ λ©μμ§λ₯Ό λΌμ°ν νλ λ체 λ°©λ²μ μ 곡ν©λλ€.
κ³ κΈ λΌμ°ν ꡬν: μ€μ μμ
μ΄λ¬ν λΌμ°ν μ λ΅μ΄ μ΄λ»κ² ꡬνλλμ§ λ³΄μ¬μ£Όλ λͺ κ°μ§ μ€μ μμλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
λ€μ΄λ νΈ μ΅μ€μ²΄μΈμ§ μμ (Python)
λ€μμ λ€μ΄λ νΈ μ΅μ€μ²΄μΈμ§λ₯Ό μμ°νλ κΈ°λ³Έμ μΈ Python μμμ λλ€.
import pika
# Connection parameters
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
# Declare the exchange
channel.exchange_declare(exchange='direct_exchange', exchange_type='direct')
# Declare a queue
channel.queue_declare(queue='direct_queue_1')
# Bind the queue to the exchange with a specific routing key
channel.queue_bind(exchange='direct_exchange', queue='direct_queue_1', routing_key='routing.key.1')
# Publish a message
channel.basic_publish(exchange='direct_exchange', routing_key='routing.key.1', body='Hello, Direct Exchange!')
print(" [x] Sent 'Hello, Direct Exchange!'")
connection.close()
μ΄ μ½λλ λΌμ°ν ν€ 'routing.key.1'μ κ°μ§ λ©μμ§λ₯Ό λ°νν©λλ€. μ΄ νΉμ ν€λ‘ λ°μΈλ©λ νλ§ λ©μμ§λ₯Ό μμ ν©λλ€. κΈμ΅ κ±°λλ₯Ό μ²λ¦¬νλ μμ€ν μ μκ°ν΄ 보μΈμ. κ³ μ±λ₯ λ©μμ§ λΆλ°°λ₯Ό μν΄ λ€μν κ±°λ μν λλ μ΅μ€μ²΄μΈμ§μ ν΄λΉνλ κ³ μ ν λΌμ°ν ν€λ‘ λ€μν νλ₯Ό λ°μΈλ©ν μ μμ΅λλ€.
ν¬μμ μ΅μ€μ²΄μΈμ§ μμ (Java)
λ€μμ ν¬μμ μ΅μ€μ²΄μΈμ§λ₯Ό 보μ¬μ£Όλ Java μμμ λλ€.
import com.rabbitmq.client.*;
public class FanoutExample {
private final static String EXCHANGE_NAME = "fanout_exchange";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
// Publish a message
String message = "Hello, Fanout Exchange!";
channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
channel.close();
connection.close();
}
}
μ΄ Java μμλ ν¬μμ μ΅μ€μ²΄μΈμ§λ‘ λ©μμ§λ₯Ό 보λ΄κ³ , μ΄ μ΅μ€μ²΄μΈμ§λ λͺ¨λ λ°μΈλ©λ νλ‘ λ©μμ§λ₯Ό λΈλ‘λμΊμ€νΈν©λλ€. ν ν½κ³Ό μκ΄μμ΄ λμΌν λ΄μ€ μ λ°μ΄νΈκ° λͺ¨λ ꡬλ μμκ² μ μ‘λμ΄μΌ νλ λ΄μ€νΌλ μ ν리μΌμ΄μ μ μκ°ν΄ 보μΈμ.
ν ν½ μ΅μ€μ²΄μΈμ§ μμ (Node.js)
μ΄ Node.js μμλ ν ν½ μ΅μ€μ²΄μΈμ§ κΈ°λ₯μ μμ°ν©λλ€.
const amqp = require('amqplib/callback_api');
amqp.connect('amqp://localhost', function(err, connection) {
if (err) {
throw err;
}
connection.createChannel(function(err, channel) {
if (err) {
throw err;
}
const exchangeName = 'topic_exchange';
const routingKey = 'stock.us.ny.ibm';
const message = 'IBM stock update - new data!';
channel.assertExchange(exchangeName, 'topic', {durable: false});
channel.publish(exchangeName, routingKey, Buffer.from(message));
console.log(" [x] Sent %s:'%s'", routingKey, message);
setTimeout(function() {
connection.close();
}, 500);
});
});
μ΄ μ½λλ "stock.us.ny.ibm" λΌμ°ν ν€λ₯Ό κ°μ§ λ©μμ§λ₯Ό λ°νν©λλ€. μΌμΉνλ λΌμ°ν ν€ ν¨ν΄μΌλ‘ λ°μΈλ©λ λͺ¨λ νκ° λ©μμ§λ₯Ό μμ ν©λλ€. νλ "stock.*.ibm"μ λ°μΈλ©νμ¬ μμΉμ κ΄κ³μμ΄ IBMμ λͺ¨λ μ£Όμ μ λ°μ΄νΈλ₯Ό μμ ν μ μμ΅λλ€. μ΄ μμ€ν μ κ°λ¨ν ν€-κ° μ‘°ν μ΄μμΌλ‘ 볡μ‘ν μ΄λ²€νΈ λΌμ°ν μ μ μ©ν©λλ€.
κ³ κΈ κ΅¬μ± λ° λͺ¨λ² μ¬λ‘
ν΅μ¬ λΌμ°ν μ ν μΈμλ RabbitMQ μ±λ₯κ³Ό 볡μλ ₯μ μ΅μ νν μ μλ λͺ κ°μ§ κ³ κΈ κ΅¬μ±μ΄ μμ΅λλ€.
1. λ°λ λ ν° μ΅μ€μ²΄μΈμ§ (DLX)
λ°λ λ ν° μ΅μ€μ²΄μΈμ§(DLX)λ νλ‘ μ λ¬λ μ μλ λ©μμ§λ₯Ό μ²λ¦¬ν©λλ€. μλ₯Ό λ€μ΄, λ©μμ§κ° λ§λ£λκ±°λ, κ±°λΆλκ±°λ, μ¬λ¬ λ²μ μ¬μλ νμλ μ²λ¦¬λμ§ λͺ»ν μ μμ΅λλ€. RabbitMQλ μ΄λ¬ν λ©μμ§λ₯Ό λ²λ¦¬λ λμ DLXλ‘ λΌμ°ν νμ¬ μΆκ° μ²λ¦¬, λΆμ λλ μ€λ₯ μ²λ¦¬λ₯Ό ν μ μμ΅λλ€. μ΄λ λ©μμ§κ° μꡬμ μΌλ‘ μμ€λμ§ μλλ‘ λ³΄μ₯νλ λ° λμμ΄ λ©λλ€.
ꡬμ±:
νλ₯Ό μ μΈν λ x-dead-letter-exchange μΈμλ₯Ό μ€μ νμ¬ νμ λν DLXλ₯Ό ꡬμ±ν©λλ€. λν DLXλ‘ μ μ‘λλ λ©μμ§μ λΌμ°ν
ν€λ₯Ό μ§μ νκΈ° μν΄ x-dead-letter-routing-keyλ₯Ό μ μν μ μμ΅λλ€. μλ₯Ό λ€μ΄, κ²°μ κ²μ΄νΈμ¨μ΄ λ¬Έμ λ‘ μΈν΄ μ£Όλ¬Έ λ©μμ§κ° μ²λ¦¬λ μ μλ κ²½μ°, λμ€μ μλ μ‘°μ¬λ₯Ό μν΄ DLXλ‘ λΌμ°ν
λ μ μμ΅λλ€.
2. λ©μμ§ λ΄κ΅¬μ±
λ©μμ§ λ΄κ΅¬μ±μ 보μ₯νλ κ²μ μ λ’°ν μ μλ μμ€ν
μ ꡬμΆνλ λ° μ€μν©λλ€. μ¬κΈ°μλ μ΅μ€μ²΄μΈμ§μ νλ₯Ό durable (durable: true)λ‘ μ μΈνκ³ , persistent delivery mode (delivery_mode=2)λ‘ λ©μμ§λ₯Ό λ°ννλ κ²μ΄ ν¬ν¨λ©λλ€. μ΄λ¬ν μ€μ μ μλ²κ° μΆ©λν΄λ λ©μμ§κ° μμ€λμ§ μλλ‘ λ³΄μ₯ν©λλ€.
3. λ©μμ§ νμΈ λ° μ¬μλ
μλΉμκ° λ©μμ§λ₯Ό μ±κ³΅μ μΌλ‘ μ²λ¦¬νμμ νμΈνκΈ° μν΄ λ©μμ§ νμΈ(acknowledgements)μ ꡬννμΈμ. μλΉμκ° λ©μμ§λ₯Ό νμΈνμ§ λͺ»νλ©΄ RabbitMQλ λ©μμ§λ₯Ό λ€μ νμ λ£μ΅λλ€. νΉμ μλ리μ€μμλ μμ μ€λ₯λ₯Ό μ°μνκ² μ²λ¦¬νκΈ° μν΄ μ§μ λ°±μ€ν(exponential backoff)μ λ°λ λ ν° ν(dead-letter queues)λ₯Ό μ¬μ©ν μ¬μλ λ©μ»€λμ¦μ ꡬννλ κ²μ΄ κ°λ ₯ν κΆμ₯λ©λλ€. λ©μμ§μ μλͺ
(time-to-live)μ μ€μ νκΈ° μν΄ x-message-ttlμ μ€μ ν μ μμΌλ©°, μ΄λ₯Ό ν΅ν΄ μλΉμκ° ν©λ¦¬μ μΈ μκ° λ΄μ λ©μμ§λ₯Ό νμΈνμ§ λͺ»νλ©΄ λ©μμ§κ° λ°λ λ ν° νλ‘ μ΄λλ©λλ€.
4. ν리νμΉ λ° μλΉμ ν¨μ¨μ±
ν리νμΉ(Prefetching)μ ν΅ν΄ μλΉμλ νμμ λ©μμ§λ₯Ό 미리 κ°μ Έμ μ²λ¦¬λμ ν₯μμν¬ μ μμ΅λλ€. νμ§λ§ λμ ν리νμΉ μΉ΄μ΄νΈλ λΆκ· λ±ν λΆν λΆλ°°λ‘ μ΄μ΄μ§ μ μμ΅λλ€. μλΉμ μμ μ²λ¦¬ λ₯λ ₯μ λ°λΌ μλΉμ ν리νμΉ μΉ΄μ΄νΈλ₯Ό μ μ νκ² κ΅¬μ±νμΈμ. λ³λͺ© νμμ λ°©μ§νκΈ° μν΄ μλΉμκ° λ©μμ§ μ²λ¦¬μ ν¨μ¨μ μΈμ§ νμΈνμΈμ. λ©μμ§ λ³Όλ₯¨ λ³λμ μ²λ¦¬νκΈ° μν΄ μλΉμλ₯Ό μν μ€ν μ€μΌμΌλ§ κ·Έλ£Ή μ¬μ©μ κ³ λ €νμΈμ. `channel.basicQos(prefetchCount=1)` μ€μ μ μ¬μ©νμ¬ μμ μλ λ©μμ§ μ λ¬(ν λ²μ νλμ λ©μμ§)μ 보μ₯ν μ μμ΅λλ€.
5. λͺ¨λν°λ§ λ° λ©νΈλ¦
RabbitMQ μλ² λ° μ ν리μΌμ΄μ λ©νΈλ¦μ μ κΈ°μ μΌλ‘ λͺ¨λν°λ§νμΈμ. RabbitMQλ μΉ UIλ₯Ό μ 곡νκ³ λ€μν νλ¬κ·ΈμΈμ ν΅ν΄ λ©νΈλ¦μ λ ΈμΆν©λλ€. ν κΈΈμ΄, λ©μμ§ μ μ‘λ₯ , μλΉμ νλ, 리μμ€ μ¬μ©λ₯ (CPU, λ©λͺ¨λ¦¬, λμ€ν¬ I/O)μ λͺ¨λν°λ§νμΈμ. μ ν리μΌμ΄μ μ±λ₯μ μν₯μ λ―ΈμΉκΈ° μ μ λ¬Έμ λ₯Ό μ¬μ μ ν΄κ²°νκΈ° μν΄ μλ¦Όμ μ€μ νμΈμ. ν¬κ΄μ μΈ λͺ¨λν°λ§ λ° μκ°νλ₯Ό μν΄ Prometheus λ° Grafanaμ κ°μ λꡬ μ¬μ©μ κ³ λ €νμΈμ.
6. 보μ κ³ λ € μ¬ν
κ°λ ₯ν μΈμ¦(μ: μ¬μ©μ μ΄λ¦/λΉλ°λ²νΈ, TLS/SSL) λ° μ κ·Ό μ μ΄ λͺ©λ‘(ACL)μ μ¬μ©νμ¬ RabbitMQ λ°°ν¬λ₯Ό 보νΈνμΈμ. μ¬μ©μ μν λ° κΆνμ λ°λΌ μ΅μ€μ²΄μΈμ§ λ° νμ λν μ κ·Όμ μ ννμΈμ. λ¬΄λ¨ μ κ·Ό λλ λ°μ΄ν° μΉ¨ν΄λ‘λΆν° 보νΈνκΈ° μν΄ λ³΄μ ꡬμ±μ μ κΈ°μ μΌλ‘ κ²ν νκ³ μ λ°μ΄νΈνμΈμ. λ¨μΌ RabbitMQ μΈμ€ν΄μ€ λ΄μμ λ€λ₯Έ μ ν리μΌμ΄μ μ 격리νκΈ° μν΄ κ°μ νΈμ€νΈ(virtual host) μ¬μ©μ κ³ λ €νμΈμ.
μ¬μ© μ¬λ‘ λ° μ€μ μ ν리μΌμ΄μ
RabbitMQμ κ³ κΈ λΌμ°ν μ λ΅μ λ€μν μ°μ λ° μ¬μ© μ¬λ‘μμ μ μ©λ©λλ€. λͺ κ°μ§ μμλ₯Ό μ΄ν΄λ³΄κ² μ΅λλ€.
- μ μμκ±°λ νλ«νΌ:
- μ£Όλ¬Έ μ²λ¦¬: λ€μ΄λ νΈ μ΅μ€μ²΄μΈμ§λ μ£Όλ¬Έ νμΈ, κ²°μ μλ¦Ό λ° λ°°μ‘ μ λ°μ΄νΈλ₯Ό λ€μν λ§μ΄ν¬λ‘μλΉμ€ λλ μ ν리μΌμ΄μ μΌλ‘ λΌμ°ν νλ λ° μ¬μ©λ μ μμ΅λλ€.
- μ ν μ λ°μ΄νΈ: ν ν½ μ΅μ€μ²΄μΈμ§λ μ ν κ°μ©μ± λ³κ²½ λλ κ°κ²© μΈνλ₯Ό λ€μν μλΉμ μ ν리μΌμ΄μ (μ: μΉμ¬μ΄νΈ, λͺ¨λ°μΌ μ±, μ΄λ©μΌ μλ¦Ό)μΌλ‘ λ°°ν¬ν μ μμ΅λλ€.
- κΈμ΅ μλΉμ€:
- μμ₯ λ°μ΄ν° νΌλ: ν ν½ μ΅μ€μ²΄μΈμ§λ νΉμ κΈμ΅ μν λλ μ΅μ€μ²΄μΈμ§μ λ°λΌ μ€μκ° μμ₯ λ°μ΄ν° μ λ°μ΄νΈλ₯Ό λ€μν κ±°λ μ ν리μΌμ΄μ λ° λΆμ μλΉμ€λ‘ λ°°ν¬νλ λ° μ΄μμ μ λλ€.
- κ±°λ μ²λ¦¬: λ€μ΄λ νΈ μ΅μ€μ²΄μΈμ§λ μ¬κΈ° νμ§, μν κ΄λ¦¬ λ° κ²°μ μμ€ν κ³Ό κ°μ λ€μν κ΅¬μ± μμλ‘ κ±°λ μλ¦Όμ λΌμ°ν ν μ μμ΅λλ€.
- μλ£ μμ€ν
:
- νμ λͺ¨λν°λ§: ν ν½ μ΅μ€μ²΄μΈμ§λ μ¬κ°λ λλ νμ μνμ λ°λΌ νμμ νλ ₯ μ§ν λλ κ²½κ³ λ₯Ό κ΄λ ¨ μλ£ μ λ¬Έκ°μκ² λΌμ°ν ν μ μμ΅λλ€.
- μμ½ μλ¦Ό: λ€μ΄λ νΈ μ΅μ€μ²΄μΈμ§ λλ ν¬μμ μ΅μ€μ²΄μΈμ§λ SMS λλ μ΄λ©μΌμ ν΅ν΄ νμμκ² μμ½ μλ¦Όμ λ³΄λ΄ νμ μ€μμ¨μ λμ΄κ³ λ ΈμΌλ₯Ό μ€μΌ μ μμ΅λλ€.
- IoT νλ«νΌ:
- μΌμ λ°μ΄ν° μμ§: ν ν½ μ΅μ€μ²΄μΈμ§λ λ€μν μ₯μΉμμ λ°μ΄ν° λΆμ νλ«νΌ λ° λμ보λλ‘ μΌμ λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ λΌμ°ν ν©λλ€.
- μ₯μΉ μ μ΄: λ€μ΄λ νΈ μ΅μ€μ²΄μΈμ§λ κ°λ³ μ₯μΉμ ν΅μ νμ¬ μ€μ μ μ μ΄νκ±°λ μμ μ μμνλ κ²μ μ©μ΄νκ² ν μ μμ΅λλ€.
μ΄λ¬ν μ€μ μ¬λ‘λ νλ μ ν리μΌμ΄μ μν€ν μ²μμ RabbitMQμ λ€μ©μ±μ κ°μ‘°ν©λλ€. λ€μν λ©μμ§ ν¨ν΄μ μ²λ¦¬νλ λ₯λ ₯μ 볡μλ ₯ μκ³ νμ₯ κ°λ₯ν μμ€ν μ ꡬμΆνλ λ° μ μ©ν λκ΅¬λ‘ λ§λλλ€.
μ¬λ°λ₯Έ λΌμ°ν μ λ΅ μ ν: μμ¬κ²°μ κ°μ΄λ
μ΅μ μ λΌμ°ν μ λ΅μ μ ννλ κ²μ μμ€ν μ ν¨μ¨μ±κ³Ό μ μ§λ³΄μμ±μ λ§€μ° μ€μν©λλ€. λ€μμ μμ¬κ²°μ κ°μ΄λμ λλ€.
- λ€μ΄λ νΈ μ΅μ€μ²΄μΈμ§λ λ€μ κ²½μ°μ μ¬μ©ν©λλ€: μ νν λΌμ°ν ν€ μΌμΉλ₯Ό κΈ°λ°μΌλ‘ νΉμ νλ‘ λ©μμ§λ₯Ό 보λ΄μΌ ν λ. νΉμ IDλ₯Ό κ°μ§ μμ μ νμλ‘ νλ μμ νλ₯Ό μκ°ν΄λ³΄μΈμ. κ° μμ μλ κ³ μ ν νμ ꡬλ λμ΄ μμ΅λλ€.
- ν¬μμ μ΅μ€μ²΄μΈμ§λ λ€μ κ²½μ°μ μ¬μ©ν©λλ€: νν°λ§ μμ΄ μ°κ²°λ λͺ¨λ νλ‘ λ©μμ§λ₯Ό λΈλ‘λμΊμ€νΈν΄μΌ ν λ (μ: λͺ¨λ ꡬλ μμκ² μλ¦Ό μ μ‘).
- ν ν½ μ΅μ€μ²΄μΈμ§λ λ€μ κ²½μ°μ μ¬μ©ν©λλ€: λΌμ°ν ν€μ ν¨ν΄μ κΈ°λ°μΌλ‘ μ μ°νκ³ λ³΅μ‘ν λΌμ°ν μ΄ νμν λ (μ: μ΄λ²€νΈ μ ν λλ μΉ΄ν κ³ λ¦¬λ₯Ό κΈ°λ°μΌλ‘ λΌμ°ν , ν ν½μ κΈ°λ°μΌλ‘ λ΄μ€ νν°λ§). μ΄λ μ¬λ¬ μλΉμκ° λ©μμ§μ λν΄ μμμΌ νλ μ΄λ²€νΈ κΈ°λ° μν€ν μ²μ κ°μ₯ μ ν©ν©λλ€.
- ν€λ μ΅μ€μ²΄μΈμ§λ λ€μ κ²½μ°μ μ¬μ©ν©λλ€: λ©μμ§ ν€λλ₯Ό κΈ°λ°μΌλ‘ λΌμ°ν μ΄ νμν λ (μ: μ½ν μΈ μ ν λλ μ°μ μμμ λ°λΌ λ©μμ§ νν°λ§). μ΄λ 볡μ‘ν λΌμ°ν μꡬ μ¬νμ μ μ©ν©λλ€.
μ ν μ λ€μ μμλ₯Ό κ³ λ €νμΈμ:
- νμ₯μ±: μμλλ λ©μμ§ λ³Όλ₯¨κ³Ό μλΉμ μλ₯Ό κ³ λ €νμΈμ.
- 볡μ‘μ±: μꡬ μ¬νμ μΆ©μ‘±νλ κ°μ₯ κ°λ¨ν λΌμ°ν μ λ΅μ μ ννμΈμ. κ³Όλν μ€κ³λ₯Ό νΌνμΈμ.
- μ μ§λ³΄μμ±: μ΄ν΄νκ³ ν μ€νΈνκ³ μ μ§λ³΄μνκΈ° μ¬μ΄ λΌμ°ν ꡬμ±μ μ€κ³νμΈμ.
- μ±λ₯: λΌμ°ν ꡬμ±μ΄ λ©μμ§ μ²λ¦¬λ λ° μ§μ° μκ°μ λ―ΈμΉλ μν₯μ μ μ€νκ² νκ°νμΈμ.
μΌλ°μ μΈ RabbitMQ λ¬Έμ ν΄κ²°
RabbitMQλ₯Ό μ¬μ©ν λ λͺ κ°μ§ μΌλ°μ μΈ λ¬Έμ μ μ§λ©΄ν μ μμ΅λλ€. λ€μμ λ¬Έμ ν΄κ²° κ°μ΄λμ λλ€.
- λ©μμ§κ° μ λ¬λμ§ μμ:
- μλͺ»λ λ°μΈλ©: νκ° μ μ ν λΌμ°ν ν€ λλ ν€λ μΌμΉλ‘ μ΅μ€μ²΄μΈμ§μ μ¬λ°λ₯΄κ² λ°μΈλ©λμλμ§ νμΈνμΈμ.
- λΌμ°ν ν€ λΆμΌμΉ: λ©μμ§λ₯Ό λ°νν λ μ¬μ©λ λΌμ°ν ν€κ° νμ ꡬμ±λ λ°μΈλ© ν€μ μΌμΉνλμ§ λ€μ νμΈνμΈμ.
- μ΅μ€μ²΄μΈμ§ μ ν λΆμΌμΉ: μλν λΌμ°ν μ λ΅μ λ§λ μ¬λ°λ₯Έ μ΅μ€μ²΄μΈμ§ μ νμ μ¬μ©νκ³ μλμ§ νμΈνμΈμ (μ: ν ν½ μ΅μ€μ²΄μΈμ§λ‘ λ©μμ§λ₯Ό 보λ΄λλ° λ°μΈλ© ν€κ° λΌμ°ν ν€μ μΌμΉνμ§ μλ κ²½μ°).
- μλΉμ λ¬Έμ : μλΉμκ° νμ μ°κ²°λμ΄ μκ³ λ©μμ§λ₯Ό νλ°νκ² μλΉνκ³ μλμ§ νμΈνμΈμ. μλΉμ λ‘κ·Έμμ μ€λ₯λ₯Ό νμΈνμΈμ.
- λλ¦° λ©μμ§ μ λ¬:
- λ€νΈμν¬ λ¬Έμ : λ€νΈμν¬ μ§μ° μκ°κ³Ό λμν μ νμ μ‘°μ¬νμΈμ.
- μλΉμ λ³λͺ© νμ: μλΉμ λ΄μ μ±λ₯ λ¬Έμ (μ: λλ¦° λ°μ΄ν°λ² μ΄μ€ 쿼리, λΉν¨μ¨μ μΈ μ²λ¦¬ λ‘μ§)λ₯Ό μλ³νκ³ ν΄κ²°νμΈμ.
- ν λ°±λ‘κ·Έ: ν κΈΈμ΄λ₯Ό λͺ¨λν°λ§νκ³ μ±λ₯ μ νλ‘ μ΄μ΄μ§ μ μλ λ©μμ§ λ°±λ‘κ·Έλ₯Ό ν΄κ²°νμΈμ. λΌμ΄λ λ‘λΉ λΆλ°° μ λ΅μ μ¬μ©νλ μ¬λ¬ ν μ¬μ©μ κ³ λ €νμΈμ.
- λμ€ν¬ I/O: RabbitMQ μλ²μ μΆ©λΆν λμ€ν¬ I/O μ±λ₯μ΄ μλμ§ νμΈνμΈμ.
- λμ CPU/λ©λͺ¨λ¦¬ μ¬μ©λ:
- 리μμ€ μ μ½: μλ²μ CPU, λ©λͺ¨λ¦¬ λ° λμ€ν¬ μ¬μ©λμ νμΈνμΈμ. RabbitMQ μλ²μ μ μ ν 리μμ€κ° ν λΉλμλμ§ νμΈνμΈμ.
- μλΉμ κ³ΌλΆν: κ³Όλν 리μμ€ μλΉλ₯Ό νΌνλλ‘ μλΉμλ₯Ό μ΅μ ννμΈμ.
- λ©μμ§ ν¬κΈ°: CPU λ° λ©λͺ¨λ¦¬ μ€λ²ν€λλ₯Ό μ€μ΄κΈ° μν΄ λ©μμ§ ν¬κΈ°λ₯Ό μ΅μννμΈμ.
- λ°λ λ ν°λ§ 루ν: λ©μμ§κ° 무ν 루νλ₯Ό μμ±ν μ μμΌλ―λ‘ λ°λ λ ν°λ§μ μ£ΌμνμΈμ. μ΄λ μ μ€νκ² λͺ¨λν°λ§ν΄μΌ ν©λλ€.
- μ°κ²° λ¬Έμ :
- λ°©νλ²½: λ°©νλ²½μ΄ μ μ ν ν¬νΈ (AMQPμ κΈ°λ³Έκ°μ 5672, κ΄λ¦¬ UIλ 15672)μμ RabbitMQ μλ²λ‘μ μ°κ²°μ νμ©νλμ§ νμΈνμΈμ.
- μΈμ¦: μ¬μ©μ μ΄λ¦κ³Ό λΉλ°λ²νΈ λλ SSL μΈμ¦μ λ° μ€μ μ νμΈνμΈμ.
- λ€νΈμν¬ μ°κ²°: μλ²κ° RabbitMQ μλ²μ μ°κ²°ν μ μλμ§ νμΈνμΈμ.
κ²°λ‘ : κΈλ‘λ² λΉλκΈ° λ©μμ§μ μν RabbitMQ λ§μ€ν°νκΈ°
RabbitMQμ κ³ κΈ λΌμ°ν μ λ΅μ λΉλκΈ° λ©μμ§ μμ€ν μ μ€κ³νκ³ κ΄λ¦¬νκΈ° μν κ°λ ₯ν κΈ°λ₯μ μ 곡ν©λλ€. λ€μν μ΅μ€μ²΄μΈμ§ μ νμ μ΄ν΄νκ³ , λͺ¨λ² μ¬λ‘λ₯Ό ꡬννλ©°, μ€μ μμλ₯Ό κ³ λ €ν¨μΌλ‘μ¨ νμ₯ κ°λ₯νκ³ λ³΅μλ ₯ μμΌλ©° ν¨μ¨μ μΈ μ ν리μΌμ΄μ μ λ§λ€ μ μμ΅λλ€. μ μμκ±°λ νλ«νΌμμ IoT μ ν리μΌμ΄μ λ° κΈμ΅ μλΉμ€μ μ΄λ₯΄κΈ°κΉμ§ RabbitMQμ μ μ°μ±κ³Ό κ²¬κ³ μ±μ κΈλ‘λ² λΆμ° μμ€ν μ ꡬμΆνλ λ° κ·μ€ν μμ°μ λλ€. μ΄ κ°μ΄λλ RabbitMQμ κ³ κΈ λΌμ°ν κΈ°λ₯μ ν¨κ³Όμ μΌλ‘ νμ©νκ³ λ©μμ§ κΈ°λ° μν€ν μ²λ₯Ό μ΅μ ννμ¬ κΈλ‘λ² μ ν리μΌμ΄μ μ νμ κ³Ό ν¨μ¨μ±μ μΆμ§νλ λ° νμν κΈ°μ΄ μ§μμ μ 곡νμ΅λλ€.