해결된 질문
작성
·
125
1
채팅 실서비스 환경 관련 문의 드립니다.
웹소켓은 커넥션을 유지하는데 서비스가 인기가 있어 동시접속자가 많아지면 커넥션 고갈이 생길 것 같습니다. 이런 문제를 방지하기 위해 실 운영 환경에서는 어떻게 모니터링하고 대응하는지 궁금합니다.
실 운영 환경에선 멀티 서버 멀티 인스턴스로 동작하게 해야 할 것 같은데 이런 경우에도 @SendTo 애노테이션을 활용할 수 있나요? 없을 것 같아 질문드립니다.
실 운영환경에선 엔진엑스같은 웹서버를 거쳐 들어올 것 같은데 이럴 때 주의해야할 사항이 있을까요?
답변 2
0
1번 질문
일단 제 경험상 아직까지 풀이 가득 차는 문제로 인해서 발생하는 이슈는 없었습니다.
이러한 풀에 대한 부분은 기본적인 클라이언트 설정을 통해서도 할 수가 있지만, 여러개의 인스턴스를 통해서 로드밸런싱 처리가 들어가기 때문에 적절한 정책이 주어진다면 큰 걱정은 안하셔도 된다고 생각합니다.
2번 질문
소켓 컨트롤러에 있는 SendTo 어노테이션을 의미하시는걸로 이해를 하였습니다.
해당 어느테이션은 단순히 어떤 경로로 요청을 내려줄지에 대한 부분인데, 결국 다중 인스턴스에 접근을 하는게 아니라 최종적으로 하나의 인스턴스에서 내려주는 결과값을 사용할텐데, 어떤 부분에서 문제가 생길 수 있는지 좀 더 자세한 설명 부탁드립니다. 저는 아직 어떤 문제점이 발생가능한지 크게 느끼지 못했습니다. 자세한 설명 추가해주시면 그에 맞춰서 대답해드리도록 하겠습니다.
3번 질문
실 운영환경을 어떻게 구성하냐에 따라 다릅니다. 결국 WAF같은 부분을 말씀하시는거 같아요.
앞단에서 무언가를 필터링 해주는 것은 들어가게 됩니다. 저는 실무에서 NGINX는 사용하지 않고 AWS의 서비스를 활용하는 것으로 알고 있습니다.
음 주의해야 하는 부분은 롤링이 동작할 떄 주의하셔야 합니다.
기본적으로 커넥션을 물고 있는 형태이기 떄문에, 해당 커넥션과 연결이 끊기게 되면 그에 따른 문제가 발생 할 수가 있습니다.
이 처리를 Front에서 후속 조치를 할 수도 있습니다. 저는 개인적으로 Front에서 일부 처리하는것을 지향하는 편입니다.
왜냐하면 서버에서 이러한 커넥션들을 지속적으로 기록하고, Connection 문제에 따라서 다른 Connection으로 옮겨줘야 하는 과정은 꽤나 복잡하고 리소스도 많이 잡아먹는 작업입니다. 구현을 하게 된다면 Kafka같은 이벤트 스트리밍 툴을 활용해서 간단하게라도 구현을 할 수는 있겠지요.
이래서 제가 간단하게 생각을 해보았을떄는 이런 Connection이 끊기는 상황에 대해서 주의해야한다고 생각을 합니다. 저는 실무에서 Connection이 끊기면 그냥 retry하는 방향으로 동작을 하는데, 이는 작성하는 방법에 따라 다르겠죠.
회사에 따라 다르겠지만 WAF에 대한 구체적인 설정은 사실 서버 엔지니어가 다루지 않고, DevOps엔지니어가 주로 다루게 됩니다. 해당 부분은 제가 추후 실무를 처리하고 계시는 엔지니어 분께 한번 물어봐서 추가적으로 아는 부분이 생긴다면 공유해 드리도록 하겠습니다.
아 그리고 아셔야 하는 부분이 있다면, Wss 통신도 결국 HTTP에 헤더를 추가한 형태 입니다. NGINX에서도 이러한 처리가 되는걸로 알고 있는데, 해당 부분을 알아보시는것도 한가지 방법일꺼같네요.
3번의 경우에는 객체를 직렬화 한다기 보다는, Connection을 이동시켜주는 작업을 진행하다고 보시면 됩니다.
이런 경우에는 보통 Front도 함께들어가야해요. 예를들면 일종의 컨트롤 타워 역할을 수행하는 서버를 사용하며, 이용가능한 서버들 리스트를 내려주면서, Front에서는 이용가능한 서버들 중에서 알고리즘을 적용해서 서버들을 활용을 하는 것이죠.
이 떄, Kafka를 사용해서 서버가 죽기전에, 연결된 Connection들을 기록하거나 이런 방향성을 의미합니다. 이거는 일종의 하나의 방법 일 뿐, 방향성이나 좀 더 좋은 방향으로 개선도 가능합니다.
2번의 경우에는 인스턴스에 직접적으로 붙는다고 생각을 하시면 안됩니다.
실제 실무에서는 인스턴스들에게 적절하게 분배해주는 주체가 있습니다. 내부 인스턴스들은 모두 Private하게 관리가 되어야 하기 떄문에죠. 이걸 FrontDoor라고 했는지 정확하게 용어는 기억이 나지 않네요.
그래서 결국 하나의 인스턴스와 통신하는 것처럼 동작 할 수 있기 떄문에, 그러한 부분에 대해서는 큰 문제점이 없을 꺼 같아요!!
근무로 인해서 답변이 늦었는데 ㅠㅠ 죄송합니다. 추가적인 궁금증 있다면 말씀해주세요.
0
안녕하세요, 인프런 AI 인턴입니다. 김경민님.
채팅 실 서비스 환경에서 발생할 수 있는 문제와 해결 방안에 대해 문의 주셨네요. 다음은 유사한 질문과 답변을 찾았습니다.
질문에 대한 간략한 설명:
1. 웹소켓 모니터링 및 대응:
- 동시 접속자가 많아지는 경우를 대비하여 웹소켓 커넥션을 제거 및 제어할 수 있는 모니터링 툴(예: Prometheus, Grafana 등)을 사용합니다.
- 커넥션 수를 관리하기 위해 분산 서버와 로드밸런싱을 통해 여러 서버로 분산 처리합니다.
- 관련 문서 링크
멀티 서버 환경에서 @SendTo 애노테이션 사용:
@SendTo
애노테이션은 해당 브로커를 통해 다른 인스턴스로 메시지를 전송할 수 있도록 설정합니다.Nginx 서버 설정 시 주의사항:
proxy_set_header
와 proxy_pass
등의 설정을 추가합니다.저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
빠르고 자세한 답변 감사합니다.
2번 질문은 제가 웹소켓을 사용해보지 못해서 이해도가 낮아 잘못생각하는 것일 수 있는데, 예를 들어 하나의 오픈채팅방이 있을 때 참여자가 200명이고 A 인스턴스에 100명이 웹소켓이 연결되고 B 인스턴스에 100명이 연결된 상태에서 A 인스턴스에 붙은 참여자가 메시지를 보냈을 때 99명의 A 인스턴스 참여자는 @SendTo를 애노테이션을 통해 sub하여 메시지를 받을 수 있지만 B 인스턴스 참여자들은 받을 수 없을 것 같다는 생각이 들어 여쭤봤습니다. 이런 멀티 인스턴스에서는 메시지큐를 통해 동기화 작업이 필요할 것 같은데 단순히 @SendTo에 그런 기능까지는 추상화되어있지 않을 것 같아 여쭙습니다.
3번 답변에서 커넥션이 끊기게 될 경우 kafka를 통해 커넥션을 옮겨주는 것을 고려할 수 있다고 하셨는데 Connection 객체를 시리얼라이즈할 수 있는 건가요? 전에 sse emiter 객체를 시리얼라이즈 할 수 없어 메시지 큐를 이용하지 못한 경험이 있어 여쭙습니다.