블로그 이미지
지누구루

calendar

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

Notice

2014. 10. 7. 09:43 자유글

지금까지 총 3개의 게임 프로젝트에 서버 개발자로 참가 했다.

 

경험했던 일중에, 이런건 정말 어쩔수가 없나? 싶었던 내용인데,

이번 프로젝트에서 적용했고, 어느정도 꽤 좋은 효과를 얻고 있는 내용에 대한 공유이다.

 

내용은 이러하다.

서버가 크래시 나는 일은 막을수가 없다. 사람은 실수를 하기 마련이기 때문이다.

하지만 서버 크래시가 날 경우 DB에 데이터를 동기화 할수 없기때문에,

이전 DB 데이터 동기화 시간부터 서버가 떨어지는 시간까지의 데이터는 보존해 줄수가 없다.

 

비슷한 일로 디아블로 3에서의 아이템 복사 사건도 있었는데, 서버를 죽이는 방법 알고 있다면.

아이템 드랍이나 거래로 아이템을 넘겨주고, 받은 사람은 다른 서버로 이동해서 아이템을 저장.

넘겨준쪽이 서버를 고의로 죽임으로써 아이템 복사가 성립된다.

(물론 아이템 uuid 사용 같은 방법으로 복사를 막는 방법이 있을수 있긴하지만 그건 일단 논외로..)

 

서버가 떨어지기 직전에 획득한 아이템이 사라져 있다거나,

서버 크래시 직전에 레벨업을 했는데, 레벨이 돌아가 있거나 하는 일시적인 백섭 현상이 생기게 된다.

(내가 있었던 게임들은 대부분 최대 5분정도의 백섭이 발생할 수 있었다)

 

그 이유는 캐릭터의 정보가 변경되었다고 해서, 그걸 모두 동적으로 DB 동기화 하지 않기 때문인데,

그건 동적으로 할 경우 DB 부하가 몰릴수 있고, 너무 자주 update가 발생하니까, 모아서 한번에 처리하기 위함이다

예를 들면, 몬스터 10마리를 잡아서 경험치를 10씩 획득, 총 100의 경험치를 획득했다면,

10씩 올라갈때마다 DB에 업데이트를 보내면 10번 업데이트를 해야 하지만,

모아서 보내면 1번에 100을 업데이트하는 방식으로 쿼리를 줄일수 있다는 이야기 이다.

(너무 당연한 거라서 길게 설명하지 않음)

 

여튼, 이 글에서 말하고자 하는건.

저 "일시적인 백섭" 현상을 줄일수 없을까? 하는 논의 에서 시작된.. 일종의 꽁수이다.

(이걸 생각해보게 된 경위는.. 서버가 떨어진것만도 신경이 쓰이는데, CS 에서 들어오는 유저 문의중에 아이템이 없어졌다는 문의 대응을 위해서는 찾아봐야 할게 너무 많아서.. ㅠㅠ 사실 여부 판단에 상당한 시간이 소모된다는 점 때문..)

 

내용 자체는 초 심플하다.

내가 있었던 프로젝트는 모두 리눅스를 사용했는데,

 

서버가 크래시나는 시그널(Ex - SIGFPE나 SIGSEGV 같은)을 받으면

시그널 핸들러에서 현재 해당 서버에 접속중인 모든 유저에 대해서

데이터 동기화를 다시 시도하도록 한다.

 

이게 끝인데..

 

이걸로 인해서 DB Thread가 사망하신게 아니라면

거의 모든 유저에 대한 데이터 정리가 완료 되고 종료되었다.

 

굉장히 간단하고.. 어쩌면 다른 프로젝트들에서는 당연하게 처리되고 있는지도 모르겠지만,

여튼 저런 단순처리만으로도 상당한 효과를 보고 있다...

 

 

부가적으로, 현재 프로젝트에서는 실제 게임을 플레이하는 서버가 크래시로 인해 떨어질 경우,

게임에서 완전히 접속이 끊어지는게 아니라, 캐릭터 선택화면으로 돌아가게 만들었는데,

(캐릭터 선택까지는 다른 서버가 하기 때문에 가능)

그로 인해 한두 서버의 크래시가 동접이 꺾이게 하지 않고,

서버 크래시로 인해 일시적인 백섭도 발생하지 않기 때문에..

운영적인 측면에서.. 서버 다운 피해로, 백섭에 대한 CS가 폭주하거나 하는 상황이 발생하지 않게 된것도

매우 잘한 조치라고 생각한다.

 

내가 직접 작업한건 아니지만

아이디어가 좋았다고 개인적으로 생각하는 부분이라서, 일단 기록해둠.

 

posted by 지누구루