(TIL) 2025-02-17
분산 서버 설계
아키택처
현재 최종 프로젝트 개발 단계에서는 단일구조로 작업을 진행하고 있다. 최종 목표로는 분산 서버로 만들고 수평 확장까지 적용을 해볼려고 한다. 그렇기에 오늘 현재까지 구현된 코드를 기준으로 우선 ‘로비’ 와 ‘게임’ 서버를 나누는 작업을 진행하였다.
계획상 우리 팀이 생각하는 서버 아키택처는 위 그림과 같다.
게임을 실행할 때 로비서버로 접속하여 회원 인증을 거쳐서 게임 룸 생성까지는 ‘로비’ 서버에서 진행을 하고 게임이 시작되면 ‘게임’ 서버로 넘겨서 게임이 진행된 후에 종료되면 다시 ‘로비’ 서버로 돌아오는 구조이다.
서버별 디렉토리 설정
우선 기존 SRC 경로는 그대로 유지하고 ‘로비’ 서버용의 src_loby 와 ‘게임’ 서버의 src_game 디렉토리를 추가하여 기존 src폴더의 파일들을 그대로 복사를 한 후 각 서버에 맞게 필요 없는 부분을 제거했다.
예시로 프로토파일에서 로비 서버에서만 사용할 패키지만 남겨두고 필요없는 것은 다 삭제하고 반대로 게임 서버에서는 게임 서버에서만 사용하는 패키지만 남겨두고 로비 서버에서 처리되는 것은 삭제하는 식으로 연관된 파일들을 각 서버에 맞게 수정 작업을 진행하였다.
그 후 package.jsom에 각 서버별로 실행하는 스크립트를 추가했다.
1
2
3
4
5
6
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "npx nodemon ./src/server.js", //기존(통합) 서버
"loby": "npx nodemon ./src_loby/server.js", //로비 서버
"game": "npx nodemon ./src_game/server.js" //게임 서버
},
그렇게 각 서버가 정상적으로 우선 실행되는 것을 확인 하였다.
Redis
분산 서버 구조를 갖게 되면 각 서버별로 데이터를 관리 및 검증에 사용해야 하므로 Redis를 사용해보기로 결정하였고 우선 Redis Cloud를 사용해보기로 했다.
레디스 클라우드 계정을 생성 후 데이터베이스를 생성하고 Node.js에서 레디스 연결 코드를 작성 한 후 연결 테스트를 진행했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import redis from 'redis';
import { config } from '../../config/config.js';
// Redis 클라우드 인스턴스에 연결
const redisClient = redis.createClient({
url:
'redis://' +
config.redis.user +
':' +
config.redis.password +
'@' +
config.redis.host +
':' +
config.redis.port,
});
// 연결 성공 시
redisClient.on('connect', () => {
console.log('Redis 연결 성공!!');
});
// 연결 실패 시 에러 출력
redisClient.on('error', (err) => {
console.error('Redis 연결 오류:', err);
});
redisClient.connect().then();
export default redisClient;
정상적으로 연결되서 저장된 값을 불러오는것까지 확인을 하였다.
내일은 레디스에 어떤 정보를 어떻게 저장을 할 것인가와 시간이 되면 ‘로버’와 ‘게임’ 서버간에 넘어 갈 때 어떻게 처리를 할 것인지에 대해서 작업을 할 계획이다.






