Skip to content

architecture data read models

JJong-03 edited this page Jun 17, 2026 · 2 revisions

아키텍처 — 데이터 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 Window 분기

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에서는 급락과 최소값이 중요하다.


FACTORY Read Models

LATEST

pk = FACTORY#{factory_id}
sk = LATEST

생성/갱신 주체:

  • DataProcessor: factory_state, infra_state, image_snapshot 수신 시 부분 갱신
  • DataProcessorRefresh1m: 새 메시지가 없어도 freshness, pipeline_status, risk 재계산

주요 필드:

  • factory_state
  • infra_state
  • risk
  • pipeline_status
  • latest_image_snapshot
  • last_factory_state_at
  • last_infra_state_at
  • last_image_snapshot_at

HISTORY#STATE

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/이 담당한다.

GRAPH#5M

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 Read Models

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을 읽는다.


ALERT# State

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 대상이다.


S3와 DynamoDB의 역할 분리

질문 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 크기에 비례하지 않게 제한한다.


관련 문서

Aegis-Pi Wiki

· 대표 문서 목록은 홈의 문서 탐색 표 참조

시작하기

요구사항

핵심 개념

아키텍처

컴포넌트 (Edge → Cloud → Dashboard)

Dashboard & 운영

시나리오 · 사례 · 참조

Clone this wiki locally