👉 실무에서 가장 많이 쓰는 MQTT + RabbitMQ + Kafka 중심으로 정리한 것입니다.
(개발자 관점, 바로 적용 가능한 코드 포함)
✅ 1) MQTT (ESP32 / IoT / 경량 MQ) ⭐ 가장 중요
ESP32에서 사실상 표준급
✅ 구조
ESP32 ↔ MQTT Broker ↔ C# / Node.js
✅ Broker 예시
- Mosquitto
- EMQX
- HiveMQ
✅ ESP32 (Arduino) - MQTT Publish / Subscribe
📌 라이브러리
- PubSubClient
#include <WiFi.h>
#include <PubSubClient.h>
const char* ssid = "WIFI_NAME";
const char* password = "WIFI_PASS";
const char* mqttServer = "192.168.0.10";
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
WiFi.begin(ssid, password);
client.setServer(mqttServer, 1883);
}
void loop() {
if (!client.connected()) {
client.connect("ESP32_CLIENT");
}
client.publish("sensor/temp", "25.3");
delay(2000);
}
✅ Node.js - MQTT Subscriber
npm install mqtt
const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://192.168.0.10:1883');
client.on('connect', () => {
client.subscribe('sensor/temp');
});
client.on('message', (topic, message) => {
console.log(topic, message.toString());
});
✅ C# - MQTT Subscriber (MQTTnet)
dotnet add package MQTTnet
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Options;
var factory = new MqttFactory();
var client = factory.CreateMqttClient();
var options = new MqttClientOptionsBuilder()
.WithTcpServer("192.168.0.10", 1883)
.Build();
await client.ConnectAsync(options);
client.UseApplicationMessageReceivedHandler(e =>
{
Console.WriteLine(e.ApplicationMessage.Topic + " : " +
System.Text.Encoding.UTF8.GetString(e.ApplicationMessage.Payload));
});
await client.SubscribeAsync("sensor/temp");
✅ 2) RabbitMQ (서버/백엔드 MQ)
👉 마이크로서비스, 비동기 처리
✅ 구조
Producer → RabbitMQ → Consumer
✅ RabbitMQ 설치 (Docker)
docker run -d --name rabbitmq \
-p 5672:5672 -p 15672:15672 rabbitmq:management
✅ C# - Producer
dotnet add package RabbitMQ.Client
using RabbitMQ.Client;
using System.Text;
var factory = new ConnectionFactory() { HostName = "localhost" };
using var connection = factory.CreateConnection();
using var channel = connection.CreateModel();
channel.QueueDeclare("test_queue");
var body = Encoding.UTF8.GetBytes("Hello MQ");
channel.BasicPublish("", "test_queue", null, body);
✅ C# - Consumer
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;
var factory = new ConnectionFactory() { HostName = "localhost" };
var connection = factory.CreateConnection();
var channel = connection.CreateModel();
channel.QueueDeclare("test_queue");
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
var msg = Encoding.UTF8.GetString(ea.Body.ToArray());
Console.WriteLine("Received: " + msg);
};
channel.BasicConsume("test_queue", true, consumer);
✅ Node.js - Producer / Consumer
npm install amqplib
Producer
const amqp = require('amqplib');
(async () => {
const conn = await amqp.connect('amqp://localhost');
const ch = await conn.createChannel();
const q = 'test_queue';
await ch.assertQueue(q);
ch.sendToQueue(q, Buffer.from('Hello MQ'));
})();
Consumer
const amqp = require('amqplib');
(async () => {
const conn = await amqp.connect('amqp://localhost');
const ch = await conn.createChannel();
const q = 'test_queue';
await ch.assertQueue(q);
ch.consume(q, msg => {
console.log(msg.content.toString());
ch.ack(msg);
});
})();
✅ 3) Kafka (대규모 이벤트/로그)
👉 RabbitMQ보다 더 “데이터 스트리밍”에 가까움
✅ 구조
Producer → Kafka Topic → Consumer Group
✅ Node.js - Kafka (kafkajs)
npm install kafkajs
Producer
const { Kafka } = require('kafkajs');
const kafka = new Kafka({ brokers: ['localhost:9092'] });
const producer = kafka.producer();
(async () => {
await producer.connect();
await producer.send({
topic: 'test-topic',
messages: [{ value: 'Hello Kafka' }],
});
})();
Consumer
const consumer = kafka.consumer({ groupId: 'group-1' });
(async () => {
await consumer.connect();
await consumer.subscribe({ topic: 'test-topic' });
await consumer.run({
eachMessage: async ({ message }) => {
console.log(message.value.toString());
},
});
})();
✅ C# - Kafka (Confluent.Kafka)
dotnet add package Confluent.Kafka
Producer
using Confluent.Kafka;
var config = new ProducerConfig { BootstrapServers = "localhost:9092" };
using var producer = new ProducerBuilder<Null, string>(config).Build();
await producer.ProduceAsync("test-topic", new Message<Null, string> { Value = "Hello Kafka" });
Consumer
using Confluent.Kafka;
var config = new ConsumerConfig {
BootstrapServers = "localhost:9092",
GroupId = "group-1",
AutoOffsetReset = AutoOffsetReset.Earliest
};
using var consumer = new ConsumerBuilder<Ignore, string>(config).Build();
consumer.Subscribe("test-topic");
while (true)
{
var msg = consumer.Consume();
Console.WriteLine(msg.Message.Value);
}
✅ 4) 실무 아키텍처 예시 (C# + Node + ESP32)
✅ IoT 시스템 (가장 흔함)
ESP32 → MQTT → Node.js API → RabbitMQ → C# 서비스 → DB
역할 분리
- ESP32: 센서 데이터 송신
- MQTT: IoT 메시징
- Node.js: API / Gateway
- RabbitMQ: 업무 큐
- C#: 비즈니스 로직
✅ 마이크로서비스
C# API → RabbitMQ → Node.js Worker
✅ 이벤트 기반 시스템
서비스들 → Kafka → 분석/로그/AI
✅ MQ 선택 기준 (개발자 기준)
| 상황 | 추천 MQ |
|---|---|
| ESP32 / IoT | ✅ MQTT |
| 일반 서버 비동기 | ✅ RabbitMQ |
| 대규모 로그/이벤트 | ✅ Kafka |
| 초경량 | Redis Stream |
| 클라우드 | SQS / Service Bus |
✅ 원하면 (진짜 중요)
원하시면 👇
제가 현업 수준으로 설명해 드립니다.
- ✅ MQ vs REST vs gRPC (아키텍처 비교)
- ✅ RabbitMQ vs Kafka vs MQTT (개발자 관점)
- ✅ C# + Node + ESP32 통합 설계도
- ✅ 실무에서 쓰는 MQ 패턴 (RPC, Saga, CQRS)
- ✅ 성능/확장성 설계
👉 “실무용으로 설명해줘” 라고 하면
진짜 깊게 파드립니다.
728x90
'ChatGPT 대답 > 소프트웨어 관련' 카테고리의 다른 글
| grok 시작하기 - JavaScript + 테트리스 (0) | 2026.02.10 |
|---|---|
| Web Serial API (0) | 2026.02.04 |
| MQ(Message Queue) #1 (0) | 2026.01.30 |
