LEVEL 54 QUEST
실시간 데이터 모니터링
SSE와 Polling을 활용한 실시간 API 모니터링, 시스템 상태 감시, 알림 임계치 설정을 구현합니다.
실시간 API 사용량 모니터링
실시간 모니터링이 필요한 이유
SaaS 서비스에서 API 사용량을 실시간으로 모니터링하면 비정상 트래픽 감지, 서비스 장애 예방, 고객 사용 패턴 파악이 가능합니다. 실시간 대시보드는 운영팀의 핵심 도구입니다.
// api/realtime_stats.php - 실시간 통계 API
<?php
header('Content-Type: application/json');
require_once '../config/database.php';
function getRealtimeStats($pdo) {
// 최근 1분간 API 호출수
$stmt = $pdo->query("
SELECT COUNT(*) as calls_per_minute
FROM api_logs
WHERE called_at >= DATE_SUB(NOW(), INTERVAL 1 MINUTE)
");
$rpm = $stmt->fetch()['calls_per_minute'];
// 최근 1분간 에러 수
$stmt = $pdo->query("
SELECT COUNT(*) as errors
FROM api_logs
WHERE called_at >= DATE_SUB(NOW(), INTERVAL 1 MINUTE)
AND status_code >= 400
");
$errors = $stmt->fetch()['errors'];
// 평균 응답 시간 (ms)
$stmt = $pdo->query("
SELECT AVG(response_time_ms) as avg_response
FROM api_logs
WHERE called_at >= DATE_SUB(NOW(), INTERVAL 5 MINUTE)
");
$avgResponse = round($stmt->fetch()['avg_response'], 1);
// 현재 활성 세션 수
$stmt = $pdo->query("
SELECT COUNT(DISTINCT session_id) as active_sessions
FROM api_logs
WHERE called_at >= DATE_SUB(NOW(), INTERVAL 5 MINUTE)
");
$sessions = $stmt->fetch()['active_sessions'];
return [
'rpm' => $rpm,
'errors' => $errors,
'error_rate' => $rpm > 0 ? round($errors / $rpm * 100, 2) : 0,
'avg_response' => $avgResponse,
'active_sessions' => $sessions,
'timestamp' => date('H:i:s'),
];
}
echo json_encode(['success' => true, 'data' => getRealtimeStats($pdo)]);
WebSocket 대안: SSE (Server-Sent Events)
SSE vs WebSocket vs Polling
WebSocket은 양방향 통신이 가능하지만 PHP에서 구현이 복잡합니다. SSE(Server-Sent Events)는 서버에서 클라이언트로의 단방향 스트리밍으로, PHP에서 간단하게 구현할 수 있어 모니터링에 적합합니다.
| 방식 | 방향 | 연결 | PHP 구현 | 적합한 용도 |
|---|---|---|---|---|
| Polling | 단방향 | 매번 새 연결 | 매우 쉬움 | 간단한 대시보드 |
| SSE | 서버 -> 클라이언트 | 지속 연결 | 쉬움 | 실시간 모니터링 |
| WebSocket | 양방향 | 지속 연결 | 복잡 | 채팅, 협업 |
// api/sse_monitor.php - SSE 스트리밍 엔드포인트
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
header('Connection: keep-alive');
header('X-Accel-Buffering: no'); // Nginx 버퍼링 비활성화
require_once '../config/database.php';
$maxTime = 300; // 최대 5분 연결 유지
$startTime = time();
while (time() - $startTime $maxTime) {
if (connection_aborted()) break;
$stats = getRealtimeStats($pdo);
// SSE 형식으로 데이터 전송
echo "event: stats\n";
echo "data: " . json_encode($stats) . "\n\n";
ob_flush();
flush();
sleep(3); // 3초마다 전송
}
// 클라이언트: SSE 수신
const eventSource = new EventSource('/api/sse_monitor.php');
eventSource.addEventListener('stats', (event) => {
const data = JSON.parse(event.data);
// UI 업데이트
document.getElementById('rpm').textContent = data.rpm;
document.getElementById('errors').textContent = data.errors;
document.getElementById('avg-response').textContent = data.avg_response + 'ms';
document.getElementById('sessions').textContent = data.active_sessions;
// 에러율이 높으면 경고 표시
if (data.error_rate > 5) {
showAlert('에러율 경고', `에러율이 ${data.error_rate}%입니다!`);
}
});
eventSource.onerror = () => {
console.log('SSE 연결 끊김, 5초 후 재연결...');
setTimeout(() => {
eventSource = new EventSource('/api/sse_monitor.php');
}, 5000);
};
🔒
여기까지는 미리보기입니다
실시간 데이터 모니터링
무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.
Google로 3초 만에 시작 →🧵 Threads로 시작무료 공개 강의 둘러보기 (Lv.1~3)무료 가입하면 이어서 볼 수 있고, 강의를 완료할 때마다 XP와 레벨이 쌓입니다.