Post

(TIL) 2025-02-20 FINAL(13)

(TIL) 2025-02-20 FINAL(13)

분산 서버 작업 - 4일차


서버 아키택처

어제는 게이트웨이 서버와 로비 서버의 분산 서버에 맞게 구조 변경을 하였고 오늘은 게임 서버를 작업하였다.

게임 세션 생성

우선 게임을 시작하게 되면 로비 서버에서 방 상태를 게임진행으로 변경을 하고 게임 서버에 방 정보를 전달해서 게임 세션을 생성해야 해서 해당 패킷처리를 하는 핸들러를 추가하였다.

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// 방 생성 핸들러
const createGameHandler = ({ socket, payload, userId }) => {
  const { room } = payload;
  if (!room) throw new CustomError('유효하지않는 요청입니다.');
  const { roomId, ownerId, users } = room;

  // 게임 만들기
  const game = gameSession.addGame(roomId, ownerId);

  // 서버, 게임 에 유저 추가하기
  for (const user of users) {
    // **만약 게이트 웨이가 증설되면 socket이 유저마다 달라질 수 있음을 주의..**
    const serverUser = userSession.addUser(user.userId, user.name, roomId, socket);
    game.addUser(serverUser);
  }

  const user = userSession.getUser(userId);

  // 초기 몬스터 정보 생성
  const monsterData = game.createMonsterData();
  if (!monsterData) throw new CustomError('몬스터 데이터 생성에 실패했습니다.');

  //초기 오브젝트 정보 생성
  const objectData = game.createObjectData();
  if (!objectData) throw new CustomError('오브젝트 데이터 생성에 실패했습니다.');

  const GamePrepareResponse = [
    config.packetType.PREPARE_GAME_RESPONSE,
    {
      success: true,
      monsters: monsterData,
      objects: [
        objectData,
        {
          objectId: 2,
          objectCode: 2,
          itemData: {
            itemId: 1,
            count: 2,
          },
        },
      ],
    },
  ];
  user.sendPacket(GamePrepareResponse);

  const GamePrepareNotification = [
    config.packetType.PREPARE_GAME_NOTIFICATION,
    {
      room,
    },
  ];
  game.broadcast(GamePrepareNotification);
  // user.sendPacket(GamePrepareResponse);
};

해당 패킷이 게임 서버에 들어오면 게임 세션을 추가하고 게임 시작하기 전에 필요한 정보들을 생성한 후 호스트(방장)에게 해당 정보를 전달해주고 추가로 호스트를 제외한 방 인원들에게 게임 시작 알림 패킷을 전달한다.

그외 게임 서버의 핸들러 구조 변경

로직 변경

단일 서버 상태에서 개발했던 기능들을 분산 서버 구조에 맞게 하나하나 수정을 하였다.

실행 테스트

중간발표에 시연할 기능들에 맞게 클라이언트가 완료가 되어 빌드된 클라이언트를 통해서 한번 테스트를 진행해보았다.

오류

테스트를 진행하면서 오류나는 부분은 바로바로 수정하여 해결을 하였다. 대부분은 Class 구조가 바뀌면서 못 바꾼 부분들이 오류나는게 대다수였다.

테스트 테스트

테스트 진행 결과 현재까지 구현된 기능들까지는 정상적으로 흘러가는 것을 확인할 수 있었다! 이제 마무리로 중간에 유저가 종료되었을 때 각 서버별로 알려주는 부분만 추가하여 처리하면 분산 서버는 마무리가 될 것 같다. 이제 남은건 미흡한 부분만 내일 처리하고 로드 밸런싱에 대해서 처리만 하면 해결될 것 같다.

This post is licensed under CC BY 4.0 by the author.