210 lines
6.9 KiB
Markdown
210 lines
6.9 KiB
Markdown
# 디지털트윈 아키텍처 v4
|
|
|
|
## 변경사항 (v3 → v4)
|
|
|
|
| 구분 | v3 | v4 |
|
|
| :--- | :--- | :--- |
|
|
| OTA 업데이트 | 개념만 존재 | Fleet Manager + MQTT 구현 |
|
|
| 디바이스 관리 | 없음 | Device Registry 추가 |
|
|
| 상태 모니터링 | 없음 | Heartbeat + Metrics 추가 |
|
|
| 원격 제어 | 없음 | MQTT 기반 명령 추가 |
|
|
| Agent | 없음 | Fleet Agent 추가 |
|
|
|
|
---
|
|
|
|
## Mermaid 다이어그램
|
|
|
|
```mermaid
|
|
---
|
|
config:
|
|
layout: dagre
|
|
---
|
|
flowchart BT
|
|
subgraph Global_Platform["☁️ Vexplor 글로벌 플랫폼"]
|
|
direction TB
|
|
AAS_Dashboard["<b>💻 AAS 통합 대시보드</b><br>(React/Next.js)<br>• 중앙 모니터링<br>• Fleet 관리 UI"]
|
|
Global_API["<b>🌐 글로벌 API 게이트웨이</b><br>• 사용자 인증 (Auth)<br>• 고객사 라우팅<br>• Fleet API"]
|
|
|
|
subgraph Fleet_System["🎛️ Fleet Management"]
|
|
Fleet_Manager["<b>📊 Fleet Manager</b><br>• Device Registry<br>• 배포 오케스트레이션<br>• 상태 모니터링"]
|
|
MQTT_Broker["<b>📡 MQTT Broker</b><br>(Mosquitto/EMQX)<br>• 실시간 통신<br>• 10,000+ 연결"]
|
|
Monitoring["<b>📈 Monitoring</b><br>(Prometheus/Grafana)<br>• 메트릭 수집<br>• 알림"]
|
|
end
|
|
|
|
Update_Server["<b>🚀 배포/업데이트 매니저</b><br>• Docker 이미지 레지스트리 (Harbor)<br>• 버전 관리<br>• Canary 배포"]
|
|
end
|
|
|
|
subgraph Local_Server["스피폭스 사내 서버 (Local Server)"]
|
|
Fleet_Agent_A["<b>🤖 Fleet Agent</b><br>• MQTT 연결<br>• Heartbeat (30초)<br>• 원격 명령 실행<br>• Docker 관리"]
|
|
VEX_Engine["<b>VEX Flow 엔진</b><br>데이터 수집/처리"]
|
|
Customer_DB[("<b>사내 통합 DB</b><br>(모든 데이터 보유)")]
|
|
Watchtower_A["<b>🐋 Watchtower</b><br>이미지 자동 업데이트"]
|
|
end
|
|
|
|
subgraph Edge_Internals["🖥️ 엣지 디바이스 (Store & Forward)"]
|
|
Edge_Collector["<b>수집/가공</b><br>(Python)"]
|
|
Edge_Buffer[("<b>💾 로컬 버퍼</b><br>(TimescaleDB)<br>단절 시 임시 저장")]
|
|
Edge_Sender["<b>📤 전송 매니저</b><br>(Priority Queue)"]
|
|
Edge_Retry_Queue[("<b>🕒 재전송 큐</b><br>(SQLite/File)")]
|
|
end
|
|
|
|
subgraph Factory_A["🏭 스피폭스 공장 현장 (Factory Floor)"]
|
|
Edge_Internals
|
|
PLC_A["PLC / 센서"]
|
|
end
|
|
|
|
subgraph Customer_A["🏢 고객사 A: 스피폭스 (사내망)"]
|
|
Local_Server
|
|
Factory_A
|
|
end
|
|
|
|
subgraph Local_Server_B["고객사 B 사내 서버"]
|
|
Fleet_Agent_B["<b>🤖 Fleet Agent</b>"]
|
|
Watchtower_B["<b>🐋 Watchtower</b>"]
|
|
end
|
|
|
|
subgraph Customer_B["🏭 고객사 B (확장 예정)"]
|
|
Local_Server_B
|
|
end
|
|
|
|
subgraph Local_Server_N["고객사 N 사내 서버"]
|
|
Fleet_Agent_N["<b>🤖 Fleet Agent</b>"]
|
|
end
|
|
|
|
subgraph Customer_N["🏭 고객사 N (10,000개)"]
|
|
Local_Server_N
|
|
end
|
|
|
|
%% 대시보드 연결
|
|
AAS_Dashboard <--> Global_API
|
|
AAS_Dashboard <--> Fleet_Manager
|
|
|
|
%% Fleet System 내부 연결
|
|
Fleet_Manager <--> MQTT_Broker
|
|
Fleet_Manager <--> Monitoring
|
|
Fleet_Manager <--> Update_Server
|
|
|
|
%% 공장 내부 연결
|
|
PLC_A <--> Edge_Collector
|
|
Edge_Collector --> Edge_Buffer
|
|
Edge_Buffer --> Edge_Sender
|
|
Edge_Sender -- ① 정상 전송 --> VEX_Engine
|
|
Edge_Sender -- ② 전송 실패 시 --> Edge_Retry_Queue
|
|
Edge_Retry_Queue -. ③ 네트워크 복구 시 재전송 .-> Edge_Sender
|
|
VEX_Engine <--> Customer_DB
|
|
|
|
%% Fleet Agent 연결 (MQTT - Outbound Only)
|
|
Fleet_Agent_A == 📡 MQTT (Heartbeat/명령) ==> MQTT_Broker
|
|
Fleet_Agent_B == 📡 MQTT ==> MQTT_Broker
|
|
Fleet_Agent_N == 📡 MQTT ==> MQTT_Broker
|
|
|
|
%% Agent ↔ 로컬 컴포넌트
|
|
Fleet_Agent_A <--> VEX_Engine
|
|
Fleet_Agent_A <--> Watchtower_A
|
|
Fleet_Agent_A <--> Customer_DB
|
|
|
|
%% OTA 업데이트 (Pull 방식)
|
|
Update_Server -. 이미지 배포 .-> Watchtower_A
|
|
Update_Server -. 이미지 배포 .-> Watchtower_B
|
|
Watchtower_A -. 컨테이너 업데이트 .-> VEX_Engine
|
|
|
|
%% 엣지 업데이트
|
|
VEX_Engine -. 엣지 업데이트 .-> Edge_Collector
|
|
|
|
%% 스타일
|
|
AAS_Dashboard:::user
|
|
Global_API:::global
|
|
Update_Server:::global
|
|
Fleet_Manager:::fleet
|
|
MQTT_Broker:::fleet
|
|
Monitoring:::fleet
|
|
VEX_Engine:::localServer
|
|
Customer_DB:::localServer
|
|
Fleet_Agent_A:::agent
|
|
Fleet_Agent_B:::agent
|
|
Fleet_Agent_N:::agent
|
|
Watchtower_A:::agent
|
|
Watchtower_B:::agent
|
|
Edge_Collector:::edge
|
|
Edge_Buffer:::edgedb
|
|
Edge_Sender:::edge
|
|
Edge_Retry_Queue:::fail
|
|
PLC_A:::factory
|
|
|
|
classDef factory fill:#e1f5fe,stroke:#01579b,stroke-width:2px
|
|
classDef edge fill:#fff9c4,stroke:#fbc02d,stroke-width:2px
|
|
classDef edgedb fill:#fff9c4,stroke:#fbc02d,stroke-width:2px,stroke-dasharray: 5 5
|
|
classDef localServer fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px
|
|
classDef global fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
|
|
classDef user fill:#ffebee,stroke:#c62828,stroke-width:2px
|
|
classDef fleet fill:#e3f2fd,stroke:#1565c0,stroke-width:2px
|
|
classDef agent fill:#fff3e0,stroke:#ef6c00,stroke-width:2px
|
|
classDef fail fill:#ffebee,stroke:#c62828,stroke-width:2px,stroke-dasharray: 5 5
|
|
|
|
linkStyle 8 stroke:#2e7d32,stroke-width:2px,fill:none
|
|
linkStyle 9 stroke:#c62828,stroke-width:2px,fill:none
|
|
linkStyle 10 stroke:#fbc02d,stroke-width:2px,stroke-dasharray: 5 5,fill:none
|
|
```
|
|
|
|
---
|
|
|
|
## 추가된 컴포넌트 설명
|
|
|
|
### 1. Fleet Management (신규)
|
|
|
|
| 컴포넌트 | 역할 |
|
|
| :--- | :--- |
|
|
| **Fleet Manager** | 10,000개 디바이스 등록/관리, 배포 오케스트레이션 |
|
|
| **MQTT Broker** | 실시간 양방향 통신 (Outbound Only 유지) |
|
|
| **Monitoring** | Prometheus + Grafana, 메트릭 수집 & 알림 |
|
|
|
|
### 2. Fleet Agent (각 공장 서버에 설치)
|
|
|
|
| 기능 | 설명 |
|
|
| :--- | :--- |
|
|
| **MQTT 연결** | 글로벌 플랫폼과 상시 연결 (Outbound) |
|
|
| **Heartbeat** | 30초마다 상태 보고 |
|
|
| **원격 명령** | 업데이트, 재시작, 설정 변경 수신 |
|
|
| **Docker 관리** | 컨테이너 상태 모니터링 & 제어 |
|
|
|
|
### 3. Watchtower (기존 유지)
|
|
|
|
- Harbor에서 새 이미지 자동 Pull
|
|
- Fleet Agent의 명령으로 즉시 업데이트 가능
|
|
|
|
---
|
|
|
|
## 통신 흐름 비교
|
|
|
|
### v3 (기존)
|
|
```
|
|
보안 커넥터 ←→ 글로벌 API (양방향 터널)
|
|
```
|
|
|
|
### v4 (신규)
|
|
```
|
|
Fleet Agent ──→ MQTT Broker (Outbound Only)
|
|
←── 명령 수신 (Subscribe)
|
|
──→ 상태 보고 (Publish)
|
|
|
|
Watchtower ──→ Harbor (Pull Only)
|
|
```
|
|
|
|
**장점:**
|
|
- 방화벽 Inbound 규칙 불필요
|
|
- 10,000개 동시 연결 가능
|
|
- 실시간 명령 전달
|
|
|
|
---
|
|
|
|
## 데이터 흐름
|
|
|
|
```
|
|
[공장 → 글로벌]
|
|
PLC → 엣지 → VEX Flow → Fleet Agent → MQTT → Fleet Manager → Dashboard
|
|
|
|
[글로벌 → 공장]
|
|
Dashboard → Fleet Manager → MQTT → Fleet Agent → Docker/VEX Flow
|
|
```
|
|
|