실시간 이벤트 (SignalR)
라이브 업데이트는 **/hub/realtime**의 단일 SignalR 허브를 통해 전달됩니다. 인증은 REST API와
동일한 JWT를 사용하며, ?access_token=<jwt>(또는 Authorization 헤더)로 전달합니다.
구독 그룹
섹션 제목: “구독 그룹”고빈도 스트림은 그룹별로 선택 가입(opt-in)하며, 이를 소비하는 화면이 마운트된 동안에만 가입되고 재연결 시 자동으로 재가입됩니다:
| 그룹 | 전달 내용 | 소비 주체 |
|---|---|---|
sensors | 라이브 센서 판독 배치 | Realtime Monitor |
predictions | 새 예측 배치 | 대시보드 차트 |
logs | 전체 로그 스트림(모든 레벨) | LogViewer 페이지 전용 |
alerts | Warning/Error 로그 항목만 | 알림 벨, 앱 전역 |
alerts 그룹은 전체 logs 소방호스(firehose)를 모든 대시보드로 스트리밍하지 않고도 경고가
어디서나 표면화되도록 하기 위해 존재합니다.
이벤트 (서버 → 클라이언트)
섹션 제목: “이벤트 (서버 → 클라이언트)”| 이벤트 | 페이로드 하이라이트 |
|---|---|
SensorReading | channelIndex, value, timestamp |
NewPrediction | predictions, confidenceScores, modelId, inferenceTimeMs, 윈도우 타임스탬프(아래 참조) |
InferenceStateChanged | state ∈ idle · ready · running, 활성 데이터소스, 로드된 모델 — 모든 수명 주기 전환마다 방출 |
InferenceFaulted | reason, datasourceId — 차단성 장애 배너도 함께 표시 |
HealthMetricsUpdate | CPU/GPU/메모리, 가동 시간 |
ModelActivated | modelId, version, 형상, 파일 크기 |
ModelUploadProgress | 업로드/검증 단계, 실패 시 오류 메시지 |
OutputWriteFailed | 싱크별로 합쳐짐 — 즉각적인 첫 경고, 이후 30초 윈도우당 하나 |
LogEntryAdded | 로그 항목(레벨, 메시지, 로거, 메타데이터) |
예측 타임스탬프 의미
섹션 제목: “예측 타임스탬프 의미”예측은 입력의 과거 윈도우를 서술합니다. 모든 타임스탬프는 하나의 시계에서 나온 Unix epoch 밀리초입니다 — 백엔드가 판독 시점에 각 샘플을 한 번만 찍고, 그 값이 파이프라인 전체로 반향되며 결코 재생성되지 않습니다:
| 필드 | 의미 |
|---|---|
windowStartTimestamp | 윈도우에서 가장 오래된 입력 샘플 |
windowEndTimestamp | 가장 최신 입력 샘플 — 예측이 유효한 “기준 시점” |
timestamp | windowEndTimestamp를 미러링(호환성) |
emittedAt | 방출 시점의 백엔드 벽시계 — emittedAt − windowEndTimestamp ≈ 엔드투엔드 지연 시간 |
대시보드에서 예측 트레이스는 실제 파이프라인 지연 시간만큼 센서 트레이스보다 눈에 띄게 뒤따릅니다. 그 간격은 렌더링 결함이 아니라 의도된 운영 신호입니다.
전달 보장
섹션 제목: “전달 보장”느린 소비자가 추론을 결코 스로틀하지 않습니다: 대시보드 브로드캐스트는 발사 후 망각 방식이며,
따라잡지 못하는 클라이언트로 향하는 이벤트는 드롭되고 카운트됩니다(/api/inference/backpressure).
알림 대상 이벤트는 중복 제거되고 속도 제한되어 벨을 유용하게 유지합니다 —
알림을 참조하세요.