25
네네네네 네네 네네 네네 겁겁 겁겁 Boost 겁겁겁겁겁겁 IPWorks 9 겁 겁겁겁

네트워크 대전 서버 개발

  • Upload
    -

  • View
    209

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 네트워크 대전 서버 개발

네트워크 대전 서버 개발겁나 좋은 Boost 라이브러리와 IPWorks 9 를 이용한

Page 2: 네트워크 대전 서버 개발

목표 1. 현재 GS 서버와 DB 를 신뢰하지 않는다는 조건 (?) 을 걸고 그들의 시스템과는 무결성을 유지한 서버 개발이 목표 2. boost 와 ipworks 를 최대한 잘 활용한 서버 제작이 목표 3. ipworks 는 event driven, async 구조의 서버 , 리서치 결과 non-blocking 구조라 매우매우 작성하기 어려운 구조라고 함 .역시 돈주고 사는건 좋음 ㅋ 4. 결과적으로 boost 는 짱임

Page 3: 네트워크 대전 서버 개발

연구 해봅시다 ( 본인이 생각하는 주요 과제였음 ) 1. 매번 패킷을 제작하였을 때 패킷을 보내기 위한 구조체를 선언하고 구조체에 데이터를 담아 보내는 함수를 만들었어야 했다 . 이것을 최대한 자동화 하기 위해서 클라이언트와 서버가 공유하는 모든 데이터를 직렬화 할 수 있도록 중점을 두었음 . 구글 protobuf 와 msgpack, boost serial-

ization 을 모두 살펴본 결과 boost 가 가장 좋다고 판단 . 데이터 구조체를 모두 직렬화 상태로 구현중에 있음 2. 서버 내부의 로직에서 state machine 을 이용해서 로직을 분산함 . 역시나 이것도 boost 의 meta state machine 이라는 것을 테스트를 통해 사용하기 용이하다는것을 판단 후 적용함 . State 단위만 사용 할 수 있을뿐만 아니라 state 자체가 sub state 로 활용 가능한 구조로 되어 있음 .

Page 4: 네트워크 대전 서버 개발

계속 3. 스레드간 동기화에 필요한 queue 를 사용하기 위해서 3 가지 queue 의 퍼포먼스를 테스트 하였음 - stl queue 를 mutex 를 이용하여 동기화 - iocp queue 를 통한 동기화 - boost lock-free queue 를 통한 동기화 서로간에 속도에서는 입력 스레드 3 : 출력 스레드 1 로 설정 후 3 천만개의 데이터를 넣고 빼고 테스트 boost lock-free queue(4.51s) > stl queue(8.24s) > iocp queue(15.37s) 속도면에선 lock-free queue 가 가장 빠름 역으로 입력 1 : 출력 3 의 경우 stl queue 가 거의 근소차로 빠른 속도를 보여줌 . 하지만 보통 queue 를 사용했을 경우 입력 n : 출력 1 로 설정하여 사용하므로 lock-free queue 가 좋은 퍼포먼스를 보인다고 판단 . lock-free queue 를 적용하여 사용중 .

Page 5: 네트워크 대전 서버 개발

계속 4. 메모리 pool 경우도 boost 의 것을 사용하기로 함 . 천재 형아들이 만들었기 때문에 직접 제작한 것보다 100 배는 좋을거라 판단하였기 때문에 사용하기로 결정 . 일반 new/delete 와 boost pool 을 사용 하였을 경우 new 경우 퍼포먼스 차이가 거의 없엇으나 delete 하엿을 경우 거의 200 배의 가까운 퍼포먼스 차이를 보였음 - char[256] 개의 배열을 3 백만번 new / delete 테스트 시도함 부스트 메로리 풀의 경우 0.58s 일반 new / delete 경우 133.16s

각종 유저풀 , 패킷풀 , 상태 풀등의 메모리 new / delete 가 빈번한곳에 사용 .

Page 6: 네트워크 대전 서버 개발

Boost 찬양Boost 에서 사용할 만한 것들 .1. Any : 어떤한 타입에 데이터를 하나 보관하는 컨테이너2. Array : stl vector 와 같은 인터페이스로 동작 가능 배열과 같이 크기를 고정 c++ 배열과 같이 초기화 가능 c++ 배열을 사용해야 하는 경우 array 대신 사용3. Assign : stl container 들을 아주 간단하게 초기화 할수 있도록 도와줌 std::map< string, int > m1;

insert( m1 )( “1 월” , 31 )(“2 월” ,29); <= 초기화 가능 std::vector<in> v1; v1 += 1,2,3,4,5,6,7,8,9,10; <= 초기화 가능

4. Bind : 기존의 stl 에서 지원해주던 bind1st, bindst 의 확장 리턴값 , 매개변수 형식만 맞추면 어떤 클래스의 어떤 멤버 함수라도 bind 하여 호출이 가능함 . 매우 좋음 .

5. Function : 함수 포인터를 변수로 저장 할 수 있게 도와줌 bind 와 함께 사용하면 클래스의 멤버 함수도 변수로 저장 가능함

Page 7: 네트워크 대전 서버 개발

계속 찬양중 6. foreach : container 들의 loop 를 std::foreach 로 사용 할 경우 functor 를 만들어야 한다는 번거로움과 귀찬니즘이 생김 하지만 foreach 를 사용하면 간편하게 container 들을 loop 할 수 있음 vector<int> v2;

v2 += 1,2,3,4,5,6,7,8,9,10; BOOST_FOREACH( int& iter, v2 ) { cout << iter << std::endl; }

7. signal : observer 패턴 구현시 유용하게 사용 콜백 함수 또는 클래스의 멤버 함수를 관리하고 호출 shared_ptr 과 함께 사용시 메모리 추적 기능까지 있어 gabage 포인터를 호출할 위험성도 줄어든다 .

Page 8: 네트워크 대전 서버 개발

여전히 찬양중 8. format : 형식 , 인자 개수에 관해서 안전한 c++ printf 확장판 샘플은 만들어 두었으니 필요하신분은 요청하시면 드리겠음 9. optional : 값 (value) 을 리턴하는 함수에서 유효하지 않는 값을 리턴할때 enum 또는 define 으로 정의해야하는데 이것도 귀차늠 그러면 optional 을 쓰면 된다 .

10. random : 간단하게 random 값을 사용 11. regex : c++ 정규식 라이브러리 문자열 파싱하고 새로 생성하고 할때 레알 좋음 실 예로 얼마전에 빌링 오류 났을 경우 reallog 를 regex 를 이용해서 파싱함 . 매우 좋다는 결론 .

12. msm : meta state machine 의 약자 상태 전의 테이블을 통해서 state 간의 전의를 미리 선언 불가능 전의 상태에 대한 예외처리 가능 sub state 를 통해서 state 로직 부분을 분담하여 서로간의 종속성이 없이 협업이 가능함 13. 그밖에 thread, serialzation, pool, msm, tuple, tie, multi_index

실제로 코딩작업을 하다보면 필요한 라이브러리가 많이 있음 .

Page 9: 네트워크 대전 서버 개발

지금부터 서버 구조 1. 간단한 캐쥬얼 게임 서버 제작 하기로 함 2. 하지만 하다보니 간단하지 않음 3. 새로운 기술 접목하려다보니깐 테스트가 조금 필요 했음 4. 여전히 새로운 기술에 대한 접목이 필요하고 세 상은 넓고 천재는 많다고 느껴짐 5. 일단 서버 구조를 크게 2 가지 layer 로 나눔

Page 10: 네트워크 대전 서버 개발

구조임니다 .Daemon 스레드 Logic 스레드Queue

Page 11: 네트워크 대전 서버 개발

그리고 상태 전이 테이블들 1. 각자 상태 처리를 통해서 로직을 분리 2. 역시나 boost 가 큰 몫을 함

Page 12: 네트워크 대전 서버 개발

플레이어 상태 전이 테이블Room 의 서브 상태

Page 13: 네트워크 대전 서버 개발

플레이어 상태 1. 상태를 통해서 방에 입장하고 로비에 입장하고 퇴장하고를 상태마다 처리함 2. 상태마다 스스로 처리해야 하는 구조 예를 들어 로비 스테이트는

chat 패킷을 처리해야하고 스테이트에 입장시 로비 클래스에 플레이어를 입장시켜야 함 . 타 접속 , 또는 로그인은 처리 할필요 없는 패킷들은 처리하지 않는 구조

Page 14: 네트워크 대전 서버 개발

방 상태 전이 테이블

Page 15: 네트워크 대전 서버 개발

방 상태 1. 플레이어와 역시나 마찬가지 각자 상태가 할일만 하게됨

Page 16: 네트워크 대전 서버 개발

방 - 게임 - 플레이 sub 상태Room-Game-Play 의 서브 상태

Page 17: 네트워크 대전 서버 개발

플레이어 -방 - 플레이 sub 상태Player-Room-Play 의 서브 상태

Page 18: 네트워크 대전 서버 개발

간단하게 lobby 입장 flow

Page 19: 네트워크 대전 서버 개발

네트워크

Page 20: 네트워크 대전 서버 개발

로직 - 플레이어

Page 21: 네트워크 대전 서버 개발

룸 , 게임모드 ,

Page 22: 네트워크 대전 서버 개발

방 구조 게임 모드를 상태 머신으로 가지게됨 .이곳에는 전설과의 싸움 모드 , 모든것이 가능한 모드 등등추가 가능한 모드들이 들어가게 된다 .

방은 라운드 모델이라는 데이터 구조를 갖게 됨이곳에 이 방에서 했던 라운드 데이터를 기록하고 통계를 내고저장하고 패킷으로 주고 받고 하게 됨 . 기존 클라이언트에 있었던리플레이 구조가 이곳으로 넘어 오게 되고 서버에 맞고 조금 변형되어 클라이언트와 협업을 통해 수정되어짐

Page 23: 네트워크 대전 서버 개발

라운드 모델

Page 24: 네트워크 대전 서버 개발

라운드 모델 Model. MVC 패턴에서 사용되는 모델 , 패션모델 이런거 아님데이터를 저장하는 Storage, 이곳에서 사용되는 데이터 구조는 모두모두직렬화로 작성되게 됩니다 .이것이 핵심이였고 가장 많이 고민했던 부분인데 막상해보니깐 별건 없었음 .

여담을 하자면 boost serialze 를 사용하게 되면 vector, map 등 stl container 들은 모두 자동으로 직렬화를 사용할 수 있슴 . 단 hash_map 만 빼고모든 데이터를 직렬화 하게 되면 패킷 구조체를 일부러 만들필요도 없고간단하게 직렬화 인터페이스를 통해 버퍼에 때려넣고 패킷으로 보내버리면그것으로 끗 !! 우왕ㅋ굳ㅋ

Page 25: 네트워크 대전 서버 개발

마치며 Boost 데모는 http://www.boost.org/doc/libs/1_55_0/

구조들은 그림으로 그려놨으니 더 이상 자세한 설명은 생략한다 .

Boost 사용 샘플이 필요하신분은 메신저 주세요 .내부망 메신저로 보내드립니다 .

ppt 문서 제작하는게 제일 어렵네요 ..생각하는 것도 힘든데 생각을 정리하려니깐생각이 사라짐 궁금한점은 문의 해주세요 . 안알랴줌 . ㅋ