-
Notifications
You must be signed in to change notification settings - Fork 0
architecture data read models
Dashboard와 alert/report pipeline은 원본 S3 object를 매번 대량 조회하지 않는다. 현재 상태와 최근 그래프는 DynamoDB read model을 먼저 읽고, S3는 원본/장기 이력/보고서 근거로 사용한다.
초기에는 state history를 장시간 보관하고 Dashboard가 1h/6h/24h window 모두 같은 prefix를 조회했다. 3초 주기 factory_state, 20초 주기 infra_state, 3개 factory가 겹치면 window=24h 조회가 수만 개 item으로 커진다.
운영 중 확인된 문제:
/history?window=24h x 3 factory
-> DynamoDB Query 페이지 50개 이상
-> Backend asyncio semaphore 포화
-> API 응답 지연
-> 504 Gateway Timeout cascade
max_items=500 같은 cap은 timeout은 줄일 수 있지만, 위험 score 급락 같은 spike를 차트에서 누락시킨다. 그래서 원본 해상도 이력과 집계 read model을 분리했다.
| 계층 | 저장 위치 | 해상도 | TTL / 보존 | 주 용도 |
|---|---|---|---|---|
| 원본 | S3 raw/
|
source payload 그대로 | 90일 후 Glacier IR | 감사, 재처리 |
| 현재 | DynamoDB LATEST
|
factory/cloud별 1건 | TTL 없음 | Dashboard current state |
| 단기 raw-resolution | DynamoDB HISTORY#STATE
|
메시지/refresh snapshot 단위 | 목표 2시간, 마지막 문서화된 운영값 48시간 | 1h chart, graph input |
| 단기 집계 | DynamoDB GRAPH#5M
|
5분 bucket | 48시간 | 6h/12h/24h chart |
| cloud 현재 | DynamoDB CLOUD#infra/LATEST
|
fast/slow 현재 상태 | TTL 없음 | Cloud infra dashboard |
| cloud history | DynamoDB HISTORY#FAST, HISTORY#SLOW
|
1분 / 5분 snapshot | 6시간 / 24시간 | cloud infra 최근 추이 |
| alert state | DynamoDB ALERT#
|
alert fingerprint | 7일 | cooldown/dedupe |
| 장기 처리 이력 | S3 processed/, processed_agg/
|
처리 결과와 5분 aggregate | S3 lifecycle/장기 보존 | 보고서, audit |
| 보고서 | S3 reports/daily/
|
일 단위 | 별도 만료 없음 | Reports API, 운영 검토 |
| Dashboard 요청 | 조회 대상 | 예상 item 수 | 설명 |
|---|---|---|---|
| current factory status | FACTORY#{factory_id}/LATEST |
1 | card, node 상태, risk 현재값 |
| current cloud infra | CLOUD#infra/LATEST |
1 | backend/data pipeline/EKS/S3 freshness |
history?window=1h |
HISTORY#STATE# |
원본 snapshot 수 | 짧은 구간은 raw-resolution 유지 |
history?window=6h |
GRAPH#5M# |
72/factory | 5분 bucket |
history?window=12h |
GRAPH#5M# |
144/factory | 5분 bucket |
history?window=24h |
GRAPH#5M# |
288/factory | 5분 bucket |
| report list/detail | S3 reports/daily/
|
날짜/target별 |
report.md 직접 조회 |
GRAPH#5M은 5분 window의 평균, 최소, 최대, first/last, sample quality를 포함한다. Risk score는 100이 가장 안전하고 0이 가장 위험하므로 chart에서는 급락과 최소값이 중요하다.
pk = FACTORY#{factory_id}
sk = LATEST
생성/갱신 주체:
- DataProcessor:
factory_state,infra_state,image_snapshot수신 시 부분 갱신 - DataProcessorRefresh1m: 새 메시지가 없어도 freshness, pipeline_status, risk 재계산
주요 필드:
factory_stateinfra_stateriskpipeline_statuslatest_image_snapshotlast_factory_state_atlast_infra_state_atlast_image_snapshot_at
pk = FACTORY#{factory_id}
sk = HISTORY#STATE#{updated_at}
ttl = now + HISTORY_TTL_HOURS
LATEST와 같은 구조의 snapshot이다. TTL은 DynamoDB hot store 비용과 query 폭증을 줄이기 위한 정책이다. ADR 목표는 2시간이지만 마지막 문서화된 운영값은 48시간이며, 2시간 적용은 data-pipeline 환경변수 재배포가 필요하다. 장기 보존은 S3 processed/{factory_id}/state_snapshot/이 담당한다.
pk = FACTORY#{factory_id}
sk = GRAPH#5M#{bucket_start}
ttl = created_at + 48h
GraphAggregator5m은 완료된 5분 bucket을 기준으로 HISTORY#STATE를 query하고 다음 값을 집계한다.
- sensor: temperature, humidity, pressure
- risk: score
- AI: fire/fall/bend score와 threshold 초과 count
- infra: node별 CPU/memory/disk
- quality: expected/actual sample count
같은 결과는 S3 processed_agg/{factory_id}/metrics_5m/...에도 ttl 없이 저장한다.
Cloud infra는 factory별 partition과 분리된 partition을 사용한다.
pk = CLOUD#infra
| SK | 갱신 주기 | TTL | 주요 내용 |
|---|---|---|---|
LATEST |
fast 1분, slow 5분 | 없음 |
fast, slow, overall_status
|
HISTORY#FAST#{updated_at} |
1분 | 6시간 | ECS/ALB/CloudFront/Redis/RDS/Lambda/DynamoDB/Scheduler/SQS DLQ/factory freshness |
HISTORY#SLOW#{updated_at} |
5분 | 24시간 | EKS/Kubernetes/ArgoCD/S3 freshness |
S3 장기 사본:
processed/cloud_infra/fast/yyyy=YYYY/mm=MM/dd=DD/hh=HH/{updated_at}.json
processed/cloud_infra/slow/yyyy=YYYY/mm=MM/dd=DD/hh=HH/{updated_at}.json
Cloud infra Dashboard는 AWS API를 직접 반복 조회하지 않는다. collector가 만든 read model을 읽는다.
pk = ALERT#{scope}
sk = {severity}#{reason}#{status}
sk = OBSERVATION#{severity}#{reason}#{status}
ttl = now + 604800
ALERT#는 장기 알림 이력 테이블이 아니다.
역할:
- 같은 source snapshot 재처리 방지
- cooldown 전 Slack 재전송 방지
- cloud warning의 연속 관측 확인
- Slack 전송 상태/오류 기록
scope는 cloud-infra, factory-a, factory-b, factory-c 같은 alert 대상이다.
| 질문 | 1차 조회 |
|---|---|
| 현재 factory 상태는? | DynamoDB LATEST
|
| 현재 cloud infra 상태는? | DynamoDB CLOUD#infra/LATEST
|
| 최근 1시간 raw-resolution chart는? | DynamoDB HISTORY#STATE
|
| 최근 6/12/24시간 chart는? | DynamoDB GRAPH#5M
|
| 원본 payload가 필요하면? | S3 raw/
|
| 처리 결과 장기 근거가 필요하면? | S3 processed/, processed_agg/
|
| 일일 운영 보고서는? | S3 reports/daily/
|
| image bytes는? | S3 image_snapshot/
|
이 분리는 504 cascade를 막고, Dashboard 조회 비용을 window 크기에 비례하지 않게 제한한다.
- 시스템 아키텍처
- 제어 & 데이터 플레인
- Dashboard VPC 설계
- 하드웨어 배치
- Hub EKS 네임스페이스
- Tailscale Mesh VPN
- 데이터 생명주기
- 데이터 조회 모델
- 실시간 갱신 구조
- IoT 데이터 계약
- Reporting Pipeline
- 로컬 스토리지
- 클라우드 스토리지
- Edge Agent
- Edge AI 탐지
- Factory-A Log Adapter
- Dummy Sensor
- Edge IoT Publisher
- Lambda Data Processor
- Risk Normalizer
- Risk Score Engine
- Pipeline Status Aggregator
- Graph Aggregator 5m
- Cloud Infra Collector
- Daily Report Generator
- Risk Alert Dispatcher
- Image Snapshot Pipeline
- Dashboard Backend
- Dashboard Web
- AI 채팅 어시스턴트