Skip to content

Commit 1ba9e2a

Browse files
committed
conre: 분산 환경 로컬 테스트
1 parent 4e1c7d0 commit 1ba9e2a

File tree

6 files changed

+209
-5
lines changed

6 files changed

+209
-5
lines changed

.env.example

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ DB_PASSWORD=YOUR_DB_PASSWORD
1616
# Redis Configuration
1717
REDIS_CONNECTION_STRING=host.docker.internal:6380
1818

19+
# Distributed System Configuration
20+
DISTRIBUTED_MODE=false
21+
SERVER_ID=
22+
1923
# External Services
2024
LLM_BASE_URL=http://host.docker.internal:7930
2125
MEMORY_BASE_URL=http://host.docker.internal:7940

scripts/monitor-redis.ps1

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
# Redis 분산 시스템 모니터링 스크립트
2+
3+
Write-Host "📊 Redis 분산 시스템 모니터링" -ForegroundColor Green
4+
5+
function Show-RedisStatus {
6+
Write-Host "`n" + "="*50
7+
Write-Host "📊 Redis 상태 ($(Get-Date -Format 'HH:mm:ss'))" -ForegroundColor Green
8+
Write-Host "="*50
9+
10+
# 활성 서버 목록
11+
Write-Host "`n🖥️ 활성 서버 목록:"
12+
$activeServers = redis-cli -p 6380 SMEMBERS servers:active
13+
if ($activeServers) {
14+
foreach ($server in $activeServers) {
15+
if ($server) {
16+
Write-Host "$server" -ForegroundColor Green
17+
18+
# 서버 정보 조회
19+
$serverInfo = redis-cli -p 6380 GET "servers:active:$server"
20+
if ($serverInfo) {
21+
$serverData = $serverInfo | ConvertFrom-Json -ErrorAction SilentlyContinue
22+
if ($serverData) {
23+
Write-Host " 시작: $($serverData.StartedAt)"
24+
Write-Host " 마지막 헬스체크: $($serverData.LastHeartbeat)"
25+
Write-Host " 활성 연결: $($serverData.ActiveConnections)"
26+
}
27+
}
28+
}
29+
}
30+
} else {
31+
Write-Host " ❌ 활성 서버 없음" -ForegroundColor Red
32+
}
33+
34+
# 사용자 세션 목록
35+
Write-Host "`n👥 사용자 세션:"
36+
$userSessions = redis-cli -p 6380 KEYS "user:server:*"
37+
if ($userSessions) {
38+
foreach ($session in $userSessions) {
39+
if ($session) {
40+
$userId = $session -replace "user:server:", ""
41+
$serverId = redis-cli -p 6380 GET $session
42+
Write-Host " 👤 사용자 $userId -> 서버 $serverId" -ForegroundColor Yellow
43+
}
44+
}
45+
} else {
46+
Write-Host " ℹ️ 활성 사용자 세션 없음" -ForegroundColor Gray
47+
}
48+
49+
# Redis 메시지 채널
50+
Write-Host "`n📡 활성 채널:"
51+
$channels = redis-cli -p 6380 PUBSUB CHANNELS "*"
52+
if ($channels) {
53+
foreach ($channel in $channels) {
54+
if ($channel) {
55+
$subscribers = redis-cli -p 6380 PUBSUB NUMSUB $channel
56+
Write-Host " 📻 $channel (구독자: $($subscribers[1]))" -ForegroundColor Cyan
57+
}
58+
}
59+
} else {
60+
Write-Host " ℹ️ 활성 채널 없음" -ForegroundColor Gray
61+
}
62+
63+
# Redis 메모리 사용량
64+
Write-Host "`n💾 Redis 메모리:"
65+
$memoryInfo = redis-cli -p 6380 INFO memory
66+
$usedMemory = ($memoryInfo | Select-String "used_memory_human:").ToString().Split(":")[1]
67+
Write-Host " 사용 중: $usedMemory" -ForegroundColor Magenta
68+
}
69+
70+
function Show-LiveMessages {
71+
Write-Host "`n📡 실시간 메시지 모니터링 시작..." -ForegroundColor Yellow
72+
Write-Host " Ctrl+C로 중지"
73+
redis-cli -p 6380 MONITOR
74+
}
75+
76+
Write-Host "🎛️ Redis 모니터링 도구"
77+
Write-Host "1. 상태 모니터링 (5초마다 갱신)"
78+
Write-Host "2. 실시간 메시지 모니터링"
79+
Write-Host "3. 한 번만 상태 확인"
80+
81+
$choice = Read-Host "`n선택하세요 (1-3)"
82+
83+
switch ($choice) {
84+
"1" {
85+
Write-Host "`n🔄 상태 모니터링 시작 (Ctrl+C로 중지)..."
86+
while ($true) {
87+
Clear-Host
88+
Show-RedisStatus
89+
Start-Sleep -Seconds 5
90+
}
91+
}
92+
"2" {
93+
Show-LiveMessages
94+
}
95+
"3" {
96+
Show-RedisStatus
97+
Write-Host "`n✅ 상태 확인 완료"
98+
}
99+
default {
100+
Show-RedisStatus
101+
}
102+
}

scripts/start-server-2.ps1

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# 서버 2 시작 스크립트 (분산 모드)
2+
3+
Write-Host "🚀 API 서버 2 시작 (분산 모드)" -ForegroundColor Yellow
4+
5+
# 분산 시스템 환경 변수 설정
6+
$env:DISTRIBUTED_MODE = "true"
7+
$env:SERVER_ID = "api-server-002"
8+
$env:REDIS_CONNECTION_STRING = "localhost:6380"
9+
10+
Write-Host "`n🔧 환경 변수:"
11+
Write-Host " DISTRIBUTED_MODE: $env:DISTRIBUTED_MODE"
12+
Write-Host " SERVER_ID: $env:SERVER_ID"
13+
Write-Host " REDIS_CONNECTION_STRING: $env:REDIS_CONNECTION_STRING"
14+
Write-Host " 포트: 7911"
15+
16+
Write-Host "`n📡 서버 2 시작 중..."
17+
dotnet run --project ProjectVG.Api --urls "http://localhost:7911"

scripts/start-server-3.ps1

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# 서버 3 시작 스크립트 (분산 모드)
2+
3+
Write-Host "🚀 API 서버 3 시작 (분산 모드)" -ForegroundColor Cyan
4+
5+
# 분산 시스템 환경 변수 설정
6+
$env:DISTRIBUTED_MODE = "true"
7+
$env:SERVER_ID = "api-server-003"
8+
$env:REDIS_CONNECTION_STRING = "localhost:6380"
9+
10+
Write-Host "`n🔧 환경 변수:"
11+
Write-Host " DISTRIBUTED_MODE: $env:DISTRIBUTED_MODE"
12+
Write-Host " SERVER_ID: $env:SERVER_ID"
13+
Write-Host " REDIS_CONNECTION_STRING: $env:REDIS_CONNECTION_STRING"
14+
Write-Host " 포트: 7912"
15+
16+
Write-Host "`n📡 서버 3 시작 중..."
17+
dotnet run --project ProjectVG.Api --urls "http://localhost:7912"
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# 분산 시스템 테스트 스크립트
2+
3+
Write-Host "🚀 분산 서버 시스템 테스트 시작" -ForegroundColor Green
4+
5+
# Redis 연결 확인
6+
Write-Host "`n📡 Redis 연결 확인..."
7+
try {
8+
$redisTest = redis-cli -p 6380 ping
9+
if ($redisTest -eq "PONG") {
10+
Write-Host "✅ Redis 연결 성공" -ForegroundColor Green
11+
} else {
12+
Write-Host "❌ Redis 연결 실패" -ForegroundColor Red
13+
exit 1
14+
}
15+
} catch {
16+
Write-Host "❌ Redis 연결 오류: $_" -ForegroundColor Red
17+
exit 1
18+
}
19+
20+
# 기존 Redis 데이터 정리
21+
Write-Host "`n🧹 기존 Redis 데이터 정리..."
22+
redis-cli -p 6380 FLUSHALL
23+
24+
# 분산 시스템 환경 변수 설정
25+
$env:DISTRIBUTED_MODE = "true"
26+
$env:REDIS_CONNECTION_STRING = "localhost:6380"
27+
28+
Write-Host "`n🔧 환경 변수 설정:"
29+
Write-Host " DISTRIBUTED_MODE: $env:DISTRIBUTED_MODE"
30+
Write-Host " REDIS_CONNECTION_STRING: $env:REDIS_CONNECTION_STRING"
31+
32+
# 테스트 시나리오 안내
33+
Write-Host "`n📋 테스트 시나리오:"
34+
Write-Host "1. 서버 1 시작 (포트 7910)"
35+
Write-Host "2. 서버 2 시작 (포트 7911) - 새 터미널 필요"
36+
Write-Host "3. 서버 3 시작 (포트 7912) - 새 터미널 필요"
37+
Write-Host "4. Redis 상태 모니터링"
38+
Write-Host "5. 클라이언트 테스트"
39+
40+
Write-Host "`n📝 추가 터미널에서 실행할 명령어:"
41+
Write-Host "터미널 2: .\scripts\start-server-2.ps1"
42+
Write-Host "터미널 3: .\scripts\start-server-3.ps1"
43+
Write-Host "터미널 4: .\scripts\monitor-redis.ps1"
44+
45+
Write-Host "`n🚀 서버 1 시작..."
46+
$env:SERVER_ID = "api-server-001"
47+
Write-Host " SERVER_ID: $env:SERVER_ID"
48+
49+
dotnet run --project ProjectVG.Api --urls "http://localhost:7910"

test-clients/ai-chat-client/script.js

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,11 @@ let totalHistoryPages = 1;
111111
let selectedHistoryCharacterId = null;
112112

113113
// 서버 정보 표시
114-
serverInfo.textContent = ENDPOINT;
114+
function updateServerInfo() {
115+
serverInfo.textContent = `${ENDPOINT} (디버그 모드)`;
116+
}
117+
118+
updateServerInfo();
115119

116120
// 서버 설정 확인
117121
async function checkServerConfig() {
@@ -331,7 +335,11 @@ function connectWebSocket() {
331335
if (typeof event.data === "string") {
332336
try {
333337
const data = JSON.parse(event.data);
334-
console.log("수신된 메시지:", data);
338+
console.log("📥 수신된 메시지:", data);
339+
340+
// 디버깅: 메시지 수신 정보 표시
341+
const timestamp = new Date().toLocaleTimeString();
342+
appendLog(`<span style="color: #888; font-size: 0.9em;">[${timestamp}] 📥 메시지 수신: ${data.type || '타입없음'}</span>`);
335343

336344
// 새로운 WebSocket 메시지 구조 처리 (우선순위)
337345
if (data.type && data.data !== undefined) {
@@ -545,7 +553,10 @@ function tryReconnect() {
545553
function sendChat() {
546554
const msg = userInput.value.trim();
547555
if (!msg) return;
556+
557+
const timestamp = new Date().toLocaleTimeString();
548558
appendLog(`<b>나:</b> ${msg}`);
559+
appendLog(`<span style="color: #888; font-size: 0.9em;">[${timestamp}] 📤 서버로 메시지 전송 중...</span>`);
549560
userInput.value = "";
550561

551562
const payload = {
@@ -556,7 +567,7 @@ function sendChat() {
556567
request_at: new Date().toISOString()
557568
};
558569

559-
console.log(includeAudioCheckbox.checked)
570+
console.log("📤 전송할 페이로드:", payload);
560571

561572
const headers = { "Content-Type": "application/json" };
562573
if (authToken) {
@@ -569,14 +580,18 @@ function sendChat() {
569580
body: JSON.stringify(payload)
570581
})
571582
.then(res => {
583+
const responseTimestamp = new Date().toLocaleTimeString();
572584
if (!res.ok) {
573-
appendLog(`<span style='color:red'>[HTTP 오류] 상태코드: ${res.status}</span>`);
585+
appendLog(`<span style='color:red'>[${responseTimestamp}] ❌ HTTP 오류] 상태코드: ${res.status}</span>`);
574586
console.error("HTTP 오류", res);
587+
} else {
588+
appendLog(`<span style="color: #888; font-size: 0.9em;">[${responseTimestamp}] ✅ HTTP 응답 수신: ${res.status}</span>`);
575589
}
576590
return res.json();
577591
})
578592
.catch(err => {
579-
appendLog(`<span style='color:red'>[HTTP 오류] ${err}</span>`);
593+
const errorTimestamp = new Date().toLocaleTimeString();
594+
appendLog(`<span style='color:red'>[${errorTimestamp}] ❌ HTTP 오류: ${err}</span>`);
580595
console.error(err);
581596
});
582597
}

0 commit comments

Comments
 (0)