👉 실무에서 가장 많이 쓰는 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

+ Recent posts