소켓연결 후, 채팅을 초당 5회정도로 도배를 해보았다.
근데, 아래와 같이 소켓연결이 끊어짐과 동시에 다른 get요청이나 post요청도 일시적으로 막히는 현상이 일어났다.
아무래도 기존의 방식과는 다르게, 실시간으로 이루어지기 때문에 서버에 부하가 걸려 일어나는 현상이라 생각했다.
그래서 구글링을 하여, nginx에서 upstream을 설정하라는 게시글을 보게 되었다.
upstream은 무엇일까?
위에서 Upstream서버는 가장 오른쪽 PHP-FPM이 설치된 서버이다.
Upstream 서버는 다른 말로 Origin 서버라고도 부른다. 여러대의 컴퓨터가 순차적으로 어떤 일을 처리할 때 어떤 서비스를 받는 서버를 의미한다.
하여튼 , 아래 코드와 같이 설정을 해주니 서버의 부하가 조금 줄어들었다.
upstream was {
server express:3000;
keepalive 64;
}
keepalive는 무슨 기능을 하는가?
http는 state less이며 connection less이다.
즉 계속 연결되어 있는 상태가 아니라 하고싶은 말만하고 연결을 끊는다.
이 방식을 채택하게된데는 바로 "여러 클라이언트의 접속"을 원활히 하기 위해서이다.
하지만 당연히 비연결 지향이라는것은 단점역시 가지고 있다.
인터넷에서 모든 데이터는 보내는데 생각보다 많은 비용을 지불한다.
그래서 추가한 기능이 바로 keep alive이다.
왼쪽의 경우를 보면 데이터를 주고 받을 때 열고 닫고를 반복한다.
그러나 keep alive를 설정하면 데이터를 계속 주고 받을 수 있다. 바로 우리가 지정한 시간 내에서 말이다.
데이터를 빈번하게 주고받아야한다면 좋은 선택이 될 수 있다.
단 무조건 좋은 기능은 아니다.
사실 keepalive는 오히려 성능 하락의 주범인 경우가 많다.
사용자가 많다면 연결이 늘어나서 새로운 사용자를 받아들이지 못하는 경우가 빈번히 일어난다.
그래서 사용자가 많고 유동이 많은 서비스에서는 사용이 권장되지 않는다.
프로젝트 소켓 연결을 진행하면서, 백엔드와 자주 소통을 하게 되었고 협업이 무엇인지 조금 배웠던 것 같다!
'트러블슈팅' 카테고리의 다른 글
[ TypeScript ] "No overload matches this call" (0) | 2023.02.01 |
---|---|
[ TypeScript ] import로 이미지 불러올 때 (1) | 2023.02.01 |
Socket.io 연결이 안될 때, 확인해봐야 할 것 (소켓 중복, Cors) (0) | 2022.11.09 |
Uncaught TypeError: Cannot assign to read only property '0' of object '[object Array]' at Array.sort (<anonymous>) (0) | 2022.10.19 |