TLS 설정을 마치고 재배포 후에 생긴 새로운 이슈와 해결방법에 대해 작성한다.
1. 이슈
TLS 설정 이후 Socket.IO 가 정상적으로 작동하는가 싶었지만, 간헐적으로 연결이 끊겼다가 다시 붙는 이슈가 발생했다. 발생할 수 있는 원인은 크게 다음과 같다.
1.1 네트워크 및 환경적 요인
- WebSocket 업그레이드 확인 : HTTP → WebSocket 프로토콜 업그레이드가 정상적으로 이루어지는지 확인
- 네트워크 안정성 : 클라이언트와 서버 간 네트워크에서 패킷 손실이나 지연이 발생하지 않는지 확인
- 방화벽 및 NAT 설정 : WebSocket 트래픽 방화벽이나 NAT 에서 차단되거나 변조되지 않았는지 확인
- 리소스 문제 : 서버의 cpu, ram 등의 리소스 문제가 없는지 확인
Kafka 연결 전 기본 Sockekt.IO 의 통신은 정상적으로 작동하였기 때문에 네트워크에서는 문제가 없다고 판단하였다. 또, 서버 리소스도 충분하게 설정하였기 때문에 문제가 없다고 판단하였다.
1.2 Socket.IO 설정 및 서버 문제
- Ping/Pong 설정 확인 : 클라이언트-서버 간의 Ping/Pong 신호가 환경에 적합하게 설정되었는지 확인
- 버전 호환성 : 클라이언트와 서버의 Socket.IO 버전이 서로 호환되어있는지 확인
- 동시 연결 처리 : 서버가 처리할 수 있는 동시 연결 수를 초과하여 연결이 불안정해지지 않았는지 확인
클라이언트와 서버 간의 Ping/Pong 신호를 주고 받는 과정에서 pingInterval 과 pingTimeout 값이 너무 짧아 연결이 끊길 수 있는데, 필자는 default 값을 사용하고 있었고, 해당 default 값은 25초로 설정되어 있음에도 불구하고 짧게는 1초 길게는 5초 안에 연결이 끊겼기 때문에 해당 문제가 아니라고 판단하였다. 또한 Socket.IO 연결시에, Hoppscotch 에서 Socket.IO 의 버전을 v4 로 정상적으로 맞추었기 때문에 이 또한 문제가 아니었고, 현재 하나의 Socket 연결에도 해당 문제를 보였으니 동시 연결 처리에도 문제가 없다고 판단하였다.
1.3 배포 환경 문제
- 로드 밸런서 설정 문제 : WebSocket 트래픽을 지원하지 않는 로드 밸런서가 있는지 확인
- 프록시 문제 : 프록시가 WebSocket 업그레이드를 처리할 수 있도록 설정되었는지 확인
- API Gateway 문제 : Gateway 가 WebSocket 프로토콜 업그레이드를 지원하지 않는지 확인
만약 로드밸런서나 프록시에서 문제가 생겼을 경우 Kafka 연결 전 간단한 클라이언트 통신에서도 문제가 발생했어야 했으나 그렇지 않았기 때문에 문제가 아니라고 판단하였다. 또한 이전 배포환경에서 정상적으로 통신이 가능했기 때문에 API Gateway 의 문제도 아니라고 판단하였다.
2. 원인 및 해결 과정
하지만 원인은 API Gateway 였다. 서버에서 설정한 http 가 배포환경에서는 https 이기 때문에 혹시 SSL 인증 문제일까 싶어 배포서버를 담당하고 있는 팀원이 직접 내부 IP 로 연결을 시도하였으나 똑같은 현상은 계속되었고, 혹시 API Gateway 의 문제이지 않을까 싶어 API Gateway 를 변경해보도록 하였다. 현재 사용하고 있는 API Gateway 는 APISIX 이고, KONG 으로 변경하여 시도해본 결과 성공적으로 연결 되는 것을 확인하였다. 하지만 여기서 드는 의문점은 APISIX 도 WebSocket 을 정상적으로 지원하고 있으며, 해당 관련된 설정 모두 해주었는데 오류가 발생하였다. 따라서 추후 원인에 대해서는 조금 더 생각하고 찾아봐야 할 것 같다.
3. 마치며
이로써 Socket.IO 와 Kakfa 간의 통신이 모두 정상적으로 작동하는 것이 확인되었으며, 다음 글에서는 Kafka Connect 를 설정하여 DB에 데이터가 쌓이는 것과, Socket 간 양방향 통신에 관하여 작성하도록 하겠다.
'Project > ST00CK' 카테고리의 다른 글
Socket.IO TLS 설정 및 배포 (1) | 2025.01.16 |
---|---|
node.js 에서 Kafka 설정하기 (0) | 2025.01.12 |
node.js 에서 gRPC 설정하기 (0) | 2025.01.08 |
ScyllaDB 연결 및 채팅방 API 구현 (1) | 2025.01.01 |
ScyllaDB ERD 작성, API 명세서 작성 (1차) (0) | 2024.12.31 |