(TIL) 2025-02-18 - FINAL(11)
(TIL) 2025-02-18 - FINAL(11)
분산 서버 작업 - 2일차
아키택처
분산 서버 작업 1일차에서는 레디스를 사용할 예정이었으나 계속 작업을 진행하게 되면서 현 상황에서 레디스를 사용해야할 이유가 없다고 판단하게 되어 차후에 스케일 아웃 상황을 고려하여 서버를 증가시키는 구조를 구현하게되면 게임 상태 정보를 동기화 하기 위해 그때 레디스를 사용해보는 걸로 변경하게 되었다. 그리고 어제는 클라이언트, 로비서버, 게임서버 의 구조를 계획을 했으나 추가로 게이트 웨이 서버를 추가하여 클라이언트는 오직 게이트 웨이 서버와 연결을 맺고 게이트 서버가 각각의 서버와 연결하는 구조로 변경하였다.
게이트 웨이 서버 작업
게이트 웨이 서버 추가로 src_gateway 디렉토리를 추가하여 해당 서버에 필요한 파일을 정리하였다.
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
const server = net.createServer(onConnection);
const startServer = async () => {
await InitServer();
connectToLobbyServer(); //로비서버 TCP연결
connectToGameServer(); //게임서버 TCP연결
server.listen(config.server.port, config.server.host, () => {
console.log('[게이트웨이] 서버 시작!!', config.server.port);
});
};
const connectToLobbyServer = () => {
const lobbyServer = net.createConnection({ host: '127.0.0.1', port: 5557 }, () => {
console.log('로비서버와 연결되었습니다.');
onLobbyConnection(lobbyServer);
});
serverSession.addServer(config.server.lobbyServer, lobbyServer);
};
const connectToGameServer = () => {
const gameServer = net.createConnection({ host: '127.0.0.1', port: 5558 }, () => {
console.log('게임서버와 연결되었습니다.');
onGameConnection(gameServer);
});
serverSession.addServer(config.server.gameServer, gameServer);
};
게이트 웨이 서버를 실행하게 되면 우선 로비서버와 게임서버에 TCP연결이 되게 작업을 하였고 현재는 게이트웨이 서버가 연결을 1번밖에 안하니 후에 인터벌로 다른 서버와 연결이 안될경우 인터벌로 주기적으로 연결을 시도하는 로직을 추가할 예정이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
const handlers = {
[config.packetType.REGISTER_REQUEST[0]]: signUpHandler,
[config.packetType.LOGIN_REQUEST[0]]: signInHandler,
[config.packetType.C_PLAYER_ATTACK_REQUEST[0]]: onLobbyServerHandler,
[config.packetType.CREATE_ROOM_REQUEST[0]]: onLobbyServerHandler,
[config.packetType.GET_ROOM_LIST_REQUEST[0]]: onLobbyServerHandler,
[config.packetType.JOIN_ROOM_REQUEST[0]]: onLobbyServerHandler,
[config.packetType.LEAVE_ROOM_REQUEST[0]]: onLobbyServerHandler,
[config.packetType.PREPARE_GAME_REQUEST[0]]: onLobbyServerHandler,
[config.packetType.START_GAME_REQUEST[0]]: onGameServerHandler,
[config.packetType.C_PLAYER_POSITION_UPDATE_REQUEST[0]]: onGameServerHandler,
[config.packetType.C_PLAYER_ATTACK_MONSTER_REQUEST[0]]: onGameServerHandler,
[config.packetType.C_MONSTER_SPAWN_RESPONSE[0]]: onGameServerHandler,
[config.packetType.C_MONSTER_ATTACK_REQUEST[0]]: onGameServerHandler,
[config.packetType.C_MONSTER_MOVE_REQUEST[0]]: onGameServerHandler,
[config.packetType.C_PLAYER_USE_ITEM_REQUEST[0]]: onGameServerHandler,
[config.packetType.S_PLAYER_DAMAGED_BY_MONSTER[0]]: onGameServerHandler,
};
패킷 관리에서는 패킷별로 보내야하는 서버의 핸들러를 설정해서 각 핸들러가 전송할 수 있게 맵핑 작업을 하였다.
각 서버를 실행해보면 게이트 웨이 서버가 로비서버와 게임 서버에 정상적으로 연결되는 것을 확인할 수 있었다.
This post is licensed under CC BY 4.0 by the author.


