모의 면접
오늘은 프로젝트 진행과 지금까지 배웠던 사항들에 대해 모의로 면접을 보는 날이였다!
주요 질문
-
TCP/IP 통신 시 일어나는 과정을 구체적으로 설명해주세요(= 현 프로젝트가 TCP 통신 서버임 )
-
서버가 느리다 라는 말을 들었을 때 어떻게 해결할 건가요?(= 게임 서버의 기본적인 트러블슈팅)
-
분산 서버의 이점과 주의사항을 설명해주세요. (= 현재 프로젝트에 분산 서버를 사용한 이유)
-
Node.js 를 이용해 게임서버를 만들면 어떠한 장점과 단점이 있나요? (= 서버로 Node.js를 사용한 이유)
추가 조사
주요 질문들에 대해 대답을 못했거나 조금 더 알아보고 싶었던 사실들을 정리해두었다.
TCP/IP 통신
-
Application(응용 프로그램) Layer
-
클라이언트가 특정 프로토콜(예: HTTP, FTP)을 사용하여 서버에 통신을 요청
-
요청은 특정 주소(IP:PORT)로 전송됨
-
-
Transport(전송) Layer
-
요청 정보를 전송 단위(TCP Segment)로 분할
-
TCP의 경우, 3-way handshake를 통해 연결을 설정하고, 신뢰성 있는 데이터 전송을 보장함
-
헤더에 분할 순서, 오류 검출 정보, 포트 번호 등을 포함함
-
-
Network(네트워크) Layer
-
패킷을 목적지 IP 주소로 전송하기 위해 라우팅을 수행
-
라우팅 테이블을 참조하여 최적의 경로를 선택
-
ARP(Address Resolution Protocol)를 사용하여 IP 주소를 MAC 주소로 변환
-
-
Data-Link Layer
-
MAC 주소를 기반으로 패킷을 특정 기기로 전달
-
이더넷 프레임을 사용하여 데이터를 캡슐화
-
-
Physical(물리) Layer
- 물리적 매체(예: 케이블, 무선 신호)를 통해 데이터를 전송
-
송신자가 응용 프로그램을 통해 특정 주소(IP:PORT)로 통신을 요청
-
요청 정보를 전송 단위(TCP Segment)로 분할하는데, 이 때 분할순서, 전달지 및 오류검출에 필요한 정보들을 헤더에 담아둠
-
특정 주소(IP : 주소지 / PORT : 받는 프로그램)로 패킷 전송시작
-
패킷은 인터넷을 통해 여러 중간 노드들을 거쳐 특정 주소로 보내짐(라우팅)
-
네트워크 IP와 ARP을 이용해 MAC 주소(기기 고유 주소)를 찾아내 기기에 패킷을 전달함
-
패킷을 전달받은 기기는 헤더에 담긴 정보들을 통해 정보들을 조합하여 알맞은 PORT(응용 프로그램 주소)로 보내줌
서버 개선
-
서버가 느린 이유에 대해 크게 2가지 정도를 생각해볼 수 있다!
-
DB 접근이나 서버에 대한 I/O 요청에 의해 과부하가 걸렸을 때
-
서버 내부 로직에서 문법오류나 알고리즘 최적화가 덜되어 메모리/CPU 사용량이 증가할 때
-
1번 상황에 대해선 DB 샤딩( 대규모 DB를 여러 개의 작은 DB(샤드)로 분할하는 기법 ) 및 I/O 요청을 처리해주는 Gateway 서버엔 로드 밸런싱 + 오토 스케일 아웃을 통해
각 I/O 처리를 분산시켜 동시 최대 처리량을 증가시켜줄 수 있다! ( 대신 공유 정보에 대한 동기화 방법에 대해서 고민을 많이 해봐야 한다..)
2번 상황의 경우 프로파일링 및 디버깅을 통해 처리에 시간이 많은 구간을 찾아 최적화를 해주고,
그럼에도 이에 대한 자원이 부족하다면 상황에 따라 수직적/수평적 확장을 해준다!
( 수직적 -> 단일 컴퓨터의 필요 자원을 업그레이드 / 수평적 -> 처리할 컴퓨터를 여러 대 두어 부하 분산 )
아니면 서버가 느려질 수 밖에 없는 타이밍에 클라이언트에 특정 기능을 추가하거나,
특정 기능을 미리 작업하도록 해두어 사용자 경험을 높일 수도 있다!
분산 서버
-
서버가 처리하는 데이터 양을 분산시켜 전체 시스템의 부하를 줄일 수 있다!
( 만약 특정 종류의 서버가 부하를 감당하지 못한다면 오토 스케일 아웃 시스템으로 서버를 증설할 수 있다 ) -
특정 서버가 중단되더라도 전체 서비스가 유지되는 안정성을 제공한다 (= 가용성 증가)
-
주의사항으로는 서버 간의 데이터 동기화 문제( 공용 데이터 동기화는 접근/LOCK 방식에 고민을 많이 해야되니.. ),
네트워크 지연 ( 서비스 이용에 필요한 서버가 여러 개로 이루어져있으니 Latency는 단일 서버보다 당연히 증가.. ),
복잡한 시스템 관리 ( 서버가 분산된 만큼 관리해야 되는 서버 절대량과 서버 구조 관리방법이 추가로 필요.. ) 등이 있다
Node.js와 게임 서버
-
현재 대부분의 게임 서버들은 Node.js를 사용하지 않는다는 사실은 대부분 알고 있을 것이다!
-
이에 대해 Node.js가 싱글스레드라 CPU 집약적 작업에 취약하다는게 큰 문제점인가? 싶지만,
조금 더 원론적으로 들어가자면 Javascript가 인터프리터 언어라는 한계점이 더 크다! -
기존의 게임 서버에 이용되는 C++/C 는 컴파일 언어로 코드들을 한 번에 분석해 최적화를 한 후 실행파일을 만들고,
만든 실행 파일을 컴퓨터가 직접 실행할 수 있으므로 빠르다! -
하지만 Node.js는 인터프리터 언어로 실행 시마다 코드들을 분석해야되기 때문에 대규모 프로그램이나 복잡한 연산 수행 시 성능 저하가 심해질 수 있고, 실행파일을 생성하지 않기 때문에 실행 속도가 느리다..
-
그럼에도 게임 서버를 학습하면서 Node.js를 사용하는 이유는 뭘까?
-
기본적인 서버 아키텍쳐나 기초 이론은 어느 언어와 상관없이 사용할 수 있기 때문이다!
-> 실습으론 사용자 친화적 언어인 Javascript를 사용하여 이론을 빠르게 적용해볼 수 있고,
이를 통한 경험으로 다른 언어를 배워가며 그에 맞게 적용시켜볼 수 있다.
한줄 평 + 개선점
-
요즘 프로젝트에만 몰두해 기존에 배웠던 지식들이 조금씩 빠져나갔던 것 같다..
-
여러 면접준비 외에도 문제가 생길 때 도움이 될만한 지식들을 되새김질 해야되겠다!