[IoT] MQTT -> Kafka를 이용한 데이터 파이프라인 구축하기 #1
IoT 데이터 파이프라인 구축 시리즈
인트로를 포함해 총 4편으로 나누어 상세히 다룹니다. 각 단계를 클릭하면 해당 포스팅으로 이동하실 수 있습니다.
- EMQX 브로커 설정 및 데이터 수집
- 핵심: 수만 대의 IoT 기기를 안정적으로 연결할 인프라 구축
- 주요 내용: EMQX 설치, MQTT 프로토콜 이해, 기기 연결 테스트 및 데이터 수집 확인
- EMQX와 Kafka 연동
- 핵심: 수집된 데이터를 손실 없이 메시지 큐(Kafka)로 전달하는 전송로 구축
- 주요 내용: Kafka Resource 생성, 데이터 유실 방지를 위한 브로커 및 토픽 최적화(Partition/Replication)
- Kafka Consumer를 활용한 데이터 소비
- 핵심: 전송된 데이터를 실제 비즈니스 로직에 맞게 처리 및 저장
- 주요 내용: Kafka Consumer Group 구성, 실시간 데이터 처리 로직 구현 및 모니터링
🤔 MQTT와 Consumer 사이에 왜 Kafka를 두는가
MQTT 브로커는 메시지를 전달하는 역할이지 오래 보관하는 역할이 아닙니다.
기기가 보낸 데이터를 Consumer가 바로 구독해서 저장하면, Consumer가 재배포되거나 DB가 잠깐 멈추는 동안 들어온 메시지는 그대로 사라집니다.
중간에 Kafka를 두면 메시지가 디스크에 먼저 쌓이고, Consumer는 다시 살아난 뒤 멈췄던 위치(offset)부터 이어서 읽습니다.
수집 속도와 처리 속도를 분리할 수 있다는 점이 가장 큰 이유입니다.
📊 데이터 파이프라인 흐름 (Data Pipeline Steps)
전체 데이터 흐름은 아래 5단계를 거치며 유연하고 안정적으로 처리됩니다.
| 단계 | 주체 (역할) | 핵심 동작 | 비고 |
|---|---|---|---|
| 1단계 | IoT 기기 (Producer) | Publish (게시) | MQTT 프로토콜로 메시지를 EMQX로 전송 |
| 2단계 | EMQX (MQTT Broker) | Routing (분류) | 수만 개의 클라이언트 연결 관리 및 메시지 중계 |
| 3단계 | Kafka Connector (Producer) | Bridging (연결) | EMQX 데이터를 읽어 Kafka 브로커로 전달(Write) (MQTT Consumer & Kafka Producer 역할) |
| 4단계 | Kafka Cluster (Broker) | Persistence (저장) | 데이터를 토픽별로 디스크에 안전하게 보관 (순서는 파티션 안에서만 보장) |
| 5단계 | App Consumer (Consumer) | Pull (가져오기) | 가공 속도에 맞춰 Kafka에서 데이터를 당겨옴(Fetch) |
🏗️ 시스템 구성 요소 (Architecture Components)
- Nginx Upstream: 인입 트래픽 로드밸런싱 및 고가용성(HA) 게이트웨이 역할.
- EMQX Cluster: 대규모 동시 접속을 처리하는 분산 MQTT 브로커.
- Kafka Connector: 분산 모드(Distributed Mode) 구성을 통한 무중단 데이터 전송.
- Kafka Cluster: 메시지 영속화(Persistence)를 통한 데이터 완충지대 역할.
- Consumer (Spring Boot): 비즈니스 로직 처리 및 가공 후 최종 저장소 적재.
Kafka의 순서 보장은 파티션 단위입니다. 파티션이 3개이고 메시지 키가 없으면 같은 기기의 메시지도 여러 파티션에 나뉘어 들어가므로, 기기별 순서가 필요하다면 기기 ID를 메시지 키로 지정하거나 저장 후 시각 필드로 정렬해야 합니다.
댓글남기기