클라가 서버에 메시지를 전달하면 서버는 이를 수신하여 메시지 내용에 따라 특정한 행동을 처리한다
서버에서 클라에 메시지를 전달하면 클라는 수신한 메시지 내용에 따라 특정한 행동을 한다
메세지가 오가는 과정을 상호 작용(interaction)이라 한다
1. 연결
: 최초로 클라가 서버와 데이터를 주고받을 준비를 하는 것이다
2. 요청-응답
: 연결을 마쳤으면 클라는 서버에 메시지를 보내고, 서버는 이를 처리한 후 결과를 응답해 준다
3. 능동적 통보
: 클라에서 요청을 보낸 적도 없는데 서버에서 능동적으로 통해야 할 때도 있다
ex) 세션의 상태는 시간이 지나면서 변화하는데, 이 변화를 클라에 일정 시간마다 통보해야 할 때가 있다
4. 연결 해제
게임 서버가 주로 하는 일
1. 여러 사용자와 상호 작용
2. 클라에서 해킹 당하면 안되는 처리
3. 플레이어의 상태 보관
게임 서버의 품질
1. 안정성
: 게임 서버가 얼마나 죽지 않는가
서버가 불안정해질 때 극복하는 방법
1. 서버가 죽더라도 최대한 빨리 다시 살아나게 하는 것
: 서버 프로세스가 중단되더라도 다시 자동으로 켜지도록 프로그램을 만드는 것이다
2. 서버는 죽더라도 최대한 적은 서비스만 죽이는 것
: 비정상 종료나 일시중지를 하더라도 이것으로 발생하는 피해를 최소화하는 방법
3. 오작동에 대해서 기록(로그)를 남기는 것
: 당장에는 문제를 해결하지 못하더라도 미래에 반복되는 문제를 예방하는 소중한 정보를 확보한다
크래시 덤프를 파일로 남기거나 서버가 최근에 받았던 메시지 종류를 파일로 남기는 방법 등이 있다
2. 확장성
: 서버를 얼마나 많이 설치할 수 있는가
사용자 수가 늘어나더라도 서비스 품질이 떨어지지 않고 유지되는가
1. 수직적 확장(scale-up)
: 하드웨어를 더 좋은 것으로 바꾸는 것이다
2. 수평적 확장(scale-out)
: 서버 머신의 개수를 증설하는 것이다
프로그램 개발의 용이성 측면에서는 수직적 확장이 우세하다
수직적 확장 상황에서 과부하 지점은 서버 컴퓨터 그 자체이다
수평적 확장을 할 수 있는 서버에서는 서버 대수를 늘림으로써 쉽게 해결된다
수평적 확장에서 서버 개수를 증가하면 서버를 거치는 개수가 증가하고, 걸리는 시간도 증가한다
서버 간 통신 자체가 과부하를 일으키면 원치 않는 지연 시간이 추가로 발생할 수 있다
-> 수평적 확장은 단위 처리 성능이 수직적 확장보다 느리다
수평적 확장의 최대 장점은 총 처리량이다
수직적 확장은 하드웨어 성능의 한계 때문에 더 이상 올라가지 못한다
수평적 확장은 늘린 서버의 대수만큼 서버의 총 처리량이 증가한다
성능은 기본적으로 얼마나 빨리 처리하는가이다
성능만 좋고 확장성이 나쁘면, 게임 사용자 수가 늘어날 수록 플레이어의 행동 처리가 완료되는데 걸리는 시간이 크게 증가한다
확장성만 좋으면 게임 사용자 수에 상관없이 처리하는데 걸리는 시간은 일정하게 클 것이다
게임 서버의 성능을 높이는 방법
1. 서버의 단위 처리 속도를 높이는 것
더 좋은 서버 하드웨어를 쓰는 것도 서버 성능을 높이는 방법이다
2. 서버의 과부하 영역을 분산하는 것
프로파일링을 해서 처리시간을 많이 차지하는 함수를 찾아 성능을 개선한다
3. 네트워크 프로토콜을 최적화하는 것
1. 메세지의 양을 줄인다.
서버는 수신과 송신을 해야 하는 메시지 수가 많거나 메시지가 차지하는 총량(바잍 수)이 많으면 처리 부담이 증가한다
메시지의 양 자체를 줄여야만 서버 부담이 줄어든다
메시지를 압축하고 풀기 위해 CPU가 연산하는데 걸리는 시간은 메시지의 양에 비례한다
양자화(quantization)
: 정수 혹은 부동소수점 값의 정밀도를 낮추는 대신 값이 차지하는 데이터 크기를 줄이는 방법
2. 메시지 교환 횟수를 줄인다
3. 서버를 거치지 않고 클라끼리 직접 통신하게 한다
클라끼리 직접 메시지를 주고받는 것을 P2P(peer-to-peer) 네트워킹이라 한다
서버에 걸리는 부담을 줄여 준다는 효과가 있다. 클라끼리 주고받는 데이터의 양이 클때 효과적이다
서버가 주고받는 메시지 검증을 할 수 있는 기회가 없다는 단점이 있다
'프로그래밍 > 서버' 카테고리의 다른 글
분산 서버 구조 2 (0) | 2019.10.09 |
---|---|
분산 서버 구조 1 (0) | 2019.10.04 |
소켓 프로그래밍 3 (0) | 2019.09.27 |
소켓 프로그래밍 2 (0) | 2019.09.25 |
소켓 프로그래밍 1 (0) | 2019.09.23 |