- 최신
- 최다 투표
- 가장 많은 댓글
application Load Balancer(ALB)는 WebSocket 프로토콜을 기본적으로 지원하지만, 대규모 연결 처리 시 세심한 설정이 필요합니다.
1. 문제 진단 및 분석:
a) 주요 확인 포인트
- ALB 타임아웃 설정
- 대상 그룹 설정
- 애플리케이션 서버 설정
- 클라이언트 연결 관리
b) 로그 분석
# CloudWatch Logs Insights 쿼리 예시
fields @timestamp, client_ip, target_status_code, request_processing_time
| filter type = 'WebSocket'
| sort @timestamp desc
| limit 100
2. 상세 해결 방안:
a) ALB 설정 최적화
# AWS CLI를 사용한 ALB 속성 수정
aws elbv2 modify-load-balancer-attributes \
--load-balancer-arn arn:aws:elasticloadbalancing:region:account-id:loadbalancer/app/your-alb/abc \
--attributes Key=idle_timeout.timeout_seconds,Value=300
# 대상 그룹 속성 수정
aws elbv2 modify-target-group-attributes \
--target-group-arn arn:aws:elasticloadbalancing:region:account-id:targetgroup/your-target-group/abc \
--attributes Key=deregistration_delay.timeout_seconds,Value=300
b) 애플리케이션 서버 설정
// Node.js WebSocket 서버 설정 예시
const WebSocket = require('ws');
const server = new WebSocket.Server({
port: 8080,
perMessageDeflate: {
zlibDeflateOptions: {
level: 6,
memLevel: 8,
windowBits: 15,
},
zlibInflateOptions: {
windowBits: 15,
},
clientNoContextTakeover: true,
serverNoContextTakeover: true,
serverMaxWindowBits: 10,
concurrencyLimit: 10,
threshold: 1024
}
});
// 연결 상태 모니터링
setInterval(() => {
server.clients.forEach((client) => {
if (!client.isAlive) {
return client.terminate();
}
client.isAlive = false;
client.ping(() => {});
});
}, 30000);
c) 오토스케일링 설정
{
"AutoScalingGroups": [{
"AutoScalingGroupName": "websocket-asg",
"HealthCheckType": "ELB",
"HealthCheckGracePeriod": 300,
"MaxSize": 10,
"MinSize": 2,
"DesiredCapacity": 4,
"TargetGroupARNs": ["arn:aws:elasticloadbalancing:region:account-id:targetgroup/your-target-group/abc"]
}]
}
3. 모니터링 및 알림 설정:
a) CloudWatch 대시보드 설정
Dashboards:
WebSocketMonitoring:
Widgets:
- type: metric
properties:
metrics:
- [ "AWS/ApplicationELB", "ActiveConnectionCount", "LoadBalancer", "your-alb" ]
- [ "AWS/ApplicationELB", "ClientTLS_NegotiationErrorCount", "LoadBalancer", "your-alb" ]
- [ "AWS/ApplicationELB", "ProcessedBytes", "LoadBalancer", "your-alb" ]
period: 60
stat: "Sum"
b) 알림 설정
# CloudWatch 경보 생성
aws cloudwatch put-metric-alarm \
--alarm-name WebSocketConnectionDrop \
--alarm-description "Alert when WebSocket connections drop suddenly" \
--metric-name ActiveConnectionCount \
--namespace AWS/ApplicationELB \
--statistic Average \
--period 60 \
--threshold 1000 \
--comparison-operator LessThanThreshold \
--evaluation-periods 2 \
--alarm-actions arn:aws:sns:region:account-id:your-topic
참고 문서: ALB WebSocket 지원 가이드
[WebSocket 연결 모니터링](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-monitoring.html)
[Node.js WebSocket 최적화](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/application-load-balancers.html#connection-idle-timeout)
WebSocket 연결이 특정 시간대에 대량으로 끊어지는 현상은 Application Load Balancer (ALB)의 기본 설정과 관련이 있을 가능성이 높습니다. 이 문제를 해결하기 위해 다음과 같은 조치를 취할 수 있습니다:
-
ALB의 유휴 연결 타임아웃 값을 증가시키세요. 기본값은 60초로 설정되어 있어, 장기간 유휴 상태인 WebSocket 연결이 끊어질 수 있습니다. 이 값을 증가시키면 연결이 더 오래 유지될 수 있습니다.
-
대상 그룹에서 고정 세션(stickiness)을 활성화하세요. 이는 클라이언트의 연결이 항상 동일한 대상 인스턴스로 라우팅되도록 보장합니다.
-
ALB 리스너 설정을 확인하세요. WebSocket 트래픽을 올바르게 처리하려면 'Connection' 헤더가 'Upgrade'로, 'Upgrade' 헤더가 'websocket'으로 설정되어 있는지 확인해야 합니다.
-
ALB 액세스 로그를 활성화하고 분석하세요. 이를 통해 연결 문제의 원인을 더 자세히 파악할 수 있습니다.
-
대상 그룹의 상태 확인 설정을 최적화하세요. WebSocket 연결은 주로 I/O 작업에 의존하므로, 기본 상태 확인이 적합하지 않을 수 있습니다.
-
ALB의 최대 연결 제한에 도달하지 않았는지 확인하세요. CloudWatch 메트릭을 통해 NewConnectionCount와 RejectedConnectionCount를 모니터링할 수 있습니다.
이러한 조치들을 통해 WebSocket 연결의 안정성을 개선하고 대규모 연결 끊김 현상을 줄일 수 있을 것입니다.
Sources
Socket connection reset every 2min - Application load balancer | AWS re:Post
AWS ALB returns 464 for wss:// requests. | AWS re:Post
Best practices for websocket deployment | AWS re:Post
