내용으로 건너뛰기

ALB에서 WebSocket 연결 문제

0

Application Load Balancer 뒤에서 WebSocket 서비스를 운영 중입니다. 특정 시간대에 연결이 대량으로 끊어지는 현상이 발생합니다. 현재 약 10,000개의 동시 연결을 처리하고 있으며, Node.js 기반의 실시간 채팅 서비스입니다

질문됨 7달 전212회 조회
2개 답변
1
수락된 답변

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)
AWS
답변함 7달 전
0

WebSocket 연결이 특정 시간대에 대량으로 끊어지는 현상은 Application Load Balancer (ALB)의 기본 설정과 관련이 있을 가능성이 높습니다. 이 문제를 해결하기 위해 다음과 같은 조치를 취할 수 있습니다:

  1. ALB의 유휴 연결 타임아웃 값을 증가시키세요. 기본값은 60초로 설정되어 있어, 장기간 유휴 상태인 WebSocket 연결이 끊어질 수 있습니다. 이 값을 증가시키면 연결이 더 오래 유지될 수 있습니다.

  2. 대상 그룹에서 고정 세션(stickiness)을 활성화하세요. 이는 클라이언트의 연결이 항상 동일한 대상 인스턴스로 라우팅되도록 보장합니다.

  3. ALB 리스너 설정을 확인하세요. WebSocket 트래픽을 올바르게 처리하려면 'Connection' 헤더가 'Upgrade'로, 'Upgrade' 헤더가 'websocket'으로 설정되어 있는지 확인해야 합니다.

  4. ALB 액세스 로그를 활성화하고 분석하세요. 이를 통해 연결 문제의 원인을 더 자세히 파악할 수 있습니다.

  5. 대상 그룹의 상태 확인 설정을 최적화하세요. WebSocket 연결은 주로 I/O 작업에 의존하므로, 기본 상태 확인이 적합하지 않을 수 있습니다.

  6. 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

답변함 7달 전

로그인하지 않았습니다. 로그인해야 답변을 게시할 수 있습니다.

좋은 답변은 질문에 명확하게 답하고 건설적인 피드백을 제공하며 질문자의 전문적인 성장을 장려합니다.