## 들어가며
분산 시스템에서 여러 워커(Worker)가 동시에 작동할 때, 각 워커의 상태를 실시간으로 파악하고 관리하는 것은 필수적입니다. 특히 크롤링, 데이터 처리, 배치 작업 등을 수행하는 원격 워커들을 중앙에서 모니터링하려면 체계적인 통합 설계가 필요합니다.
이 글에서는 대시보드와 원격 워커를 통합하여 실시간 모니터링 시스템을 구축하는 방법을 소개합니다.
## 워커 식별 체계 설계
### 워커 ID 포맷 정의
각 워커를 고유하게 식별하기 위해 다음과 같은 ID 포맷을 사용할 수 있습니다:
```
WORKER_TYPE_PID
```
- **WORKER_TYPE**: 워커의 역할 (예: crawler, processor, scheduler)
- **PID**: 프로세스 ID 또는 고유 식별자
예시:
- `crawler_12345`
- `processor_67890`
- `scheduler_54321`
이러한 명명 규칙은 로그 분석과 디버깅 시 워커를 빠르게 식별할 수 있게 해줍니다.
## Heartbeat 기반 상태 관리
### 데이터베이스 스키마 설계
워커의 상태를 추적하기 위해 Heartbeat 테이블을 구성합니다:
```sql
CREATE TABLE worker_heartbeat (
worker_id VARCHAR(100) PRIMARY KEY,
worker_type VARCHAR(50) NOT NULL,
status VARCHAR(20) NOT NULL,
last_heartbeat TIMESTAMP NOT NULL,
started_at TIMESTAMP,
metadata JSONB,
INDEX idx_status (status),
INDEX idx_last_heartbeat (last_heartbeat)
);
```
### 상태 조회 쿼리
활성 워커 목록 조회:
```sql
SELECT worker_id, worker_type, status, last_heartbeat
FROM worker_heartbeat
WHERE last_heartbeat > NOW() - INTERVAL '5 minutes'
ORDER BY last_heartbeat DESC;
```
비정상 워커 감지:
```sql
SELECT worker_id, worker_type,
EXTRACT(EPOCH FROM (NOW() - last_heartbeat)) as seconds_since_last_beat
FROM worker_heartbeat
WHERE last_heartbeat < NOW() - INTERVAL '5 minutes'
AND status != 'stopped';
```
## API 엔드포인트 설계
대시보드와 워커 간 통신을 위한 RESTful API 구조:
### 1. 워커 등록
```
POST /api/workers/register
Body: { worker_id, worker_type, metadata }
```
### 2. Heartbeat 전송
```
POST /api/workers/{worker_id}/heartbeat
Body: { status, metrics }
```
### 3. 워커 목록 조회
```
GET /api/workers?status=active&type=crawler
```
### 4. 워커 제어
```
POST /api/workers/{worker_id}/control
Body: { action: "stop" | "restart" | "pause" }
```
## 워커 클라이언트 구현 예시
```python
import requests
import time
import os
class WorkerClient:
def __init__(self, base_url, worker_type):
self.base_url = base_url
self.worker_id = f"{worker_type}_{os.getpid()}"
self.worker_type = worker_type
self.register()
def register(self):
requests.post(f"{self.base_url}/api/workers/register", json={
"worker_id": self.worker_id,
"worker_type": self.worker_type
})
def send_heartbeat(self, status="running", metrics=None):
requests.post(
f"{self.base_url}/api/workers/{self.worker_id}/heartbeat",
json={"status": status, "metrics": metrics or {}}
)
def run_with_heartbeat(self, task_func, interval=30):
while True:
try:
task_func()
self.send_heartbeat("running")
except Exception as e:
self.send_heartbeat("error", {"error": str(e)})
time.sleep(interval)
```
## 모니터링 대시보드 구현 팁
### 1. 실시간 상태 표시
- WebSocket을 활용한 실시간 업데이트
- 워커별 색상 코딩 (정상: 녹색, 경고: 노란색, 오류: 빨간색)
### 2. 알림 시스템
- Heartbeat 타임아웃 시 자동 알림
- Slack, 이메일 등 다중 채널 지원
### 3. 성능 메트릭
- 처리량, CPU/메모리 사용률 그래프
- 시간대별 워커 활동 히트맵
## 결론
분산 워커 모니터링 시스템은 다음 핵심 요소로 구성됩니다:
1. **명확한 워커 식별 체계**: 타입과 ID를 조합한 고유 식별자
2. **Heartbeat 메커니즘**: 주기적인 상태 보고로 실시간 모니터링
3. **RESTful API**: 표준화된 통신 인터페이스
4. **데이터베이스 스키마**: 효율적인 상태 조회를 위한 인덱싱
이러한 아키텍처를 기반으로 하면 수십~수백 개의 원격 워커를 안정적으로 관리할 수 있습니다. 프로젝트 규모에 맞게 Redis를 활용한 캐싱, Kubernetes를 통한 오토스케일링 등으로 확장할 수 있습니다.
ai-automation
분산 워커 모니터링 대시보드 통합 가이드: 원격 작업자 관리 시스템 구축하기
대시보드에서 여러 원격 워커를 효과적으로 모니터링하고 관리하는 아키텍처 설계 방법
SpacePlanning · SpacePlanning AI Team2026년 3월 28일조회 241