일반적인 문제에 대한 해결 방법은 게임 서버를 공유

그림 삽입 설명 여기
게임 개발에서, 우리는 종종 몇 가지 기술적 인 문제가 발생하지만 버그가 전체 게임의 품질에 영향을 미칠 것입니다 일으켰습니다.

과부하 보호 문제, 클러스터링, 서버 통신, 동시성 선택은 종종 기술적 인 문제의 작은 팀, 우리가 Zuozhen 과정에서 언급 한 일부 전문가에 대한 해결책을 공유하고, 우리가 도와주고 싶어요.

하나의 문제 : 풀 정보는 플레이어가 친구가 로그인 할 때,하지만 친구 로그온 바쁜 서비스로 인해 실패했습니다.

해결 방법 :

1 이상 외주 서비스 로그인을 막지 않도록하기 위해 중요하지 않은 통화 단축 트랜잭션 프로세스를 분리 임계 경로.

2, 서비스 퓨즈 메커니즘, 신속하게 사태를 방지하기 위해 실패를 처리 할 수있는 능력을 넘어.

3, 사용자 격리 트랜잭션에 따라, 피할 토끼 단일 사용자 요청 차단은 다른 사용자에게 영향을 미칩니다.

두 번째 문제 : 압력 측정 동시 로그인이 레디 스에 많은 압력을 생성합니다.

해결 방법 : 더 많은 데이터 테이블의 수보다, 트랜잭션이 더 레디 스 요청 생산할 예정 레디 스, 작은 테이블을 큰 테이블에 병합.

웨이드 : 서버 프로세스의 일반 관리가 많은 구성 파일 또는 정적 조직을 사용하여 비교적 간단하다. 동시에 이들은 레디 스 통신 구성 요소와는 심지어 미들웨어, 메시지 큐를 사용하지 않고, 프로세스 간 통신 수단의 부족, 경향이있다. 자동화 클러스터 관리의 수준을 향상시키기 위해 사용 사육사는 일반적인 접근 방법이다.

ZC는 : 일반적으로 메모리 캐시,하지로 레디 스의 데이터 보안에없는 일반적인 DB로 저장되어있는 중요한 데이터를 사용 레디 스 .. 과정에서 또한 성능 기준 참조, 액세스 제어 및 트래픽 주파수를 필요로한다.

질문 세 가지 : 외부 서비스가 지연되고 프로세스가 Caton을 생성하는 사업을 호출합니다.

해결 방법 : 비즈니스 측면 캐시를 증가 : 친구와 함께 플레이 + 아이디 + 최근 역할 역할 정보를 msdk.

웨이드 : 과부하 보호를위한 많은 팀은 없다 종종 가장 바깥 쪽 고객이 최대 연결 번호 또는 세션의 최대 수를 제한 할 수있는 권한이에 측면을 종료 충분히주의를 기울입니다. 같은 데이터베이스에 액세스하는 프로세스로 이상의 내부 프로세스를 들어, 많은 부하 보호되지 않습니다. 로드 밸런싱은 종종 너무 많은 일을하는 것입니다, 그래서 게임이 더 프로세스, 상태에 있기 때문에, 기본적으로 프로세스가 앞으로 이동 요청을 처리 상태에 따라.

ZC : 참고 캐시와 다운 그레이드. 외부 플랫폼 데이터, 가능한 한만큼 캐시 액세스 경험을 향상시킬 수 있습니다. 그들은 외부 서비스가 실패 찾거나 부하 자체가 위험이있는 경우, 서비스를 다운 그레이드해야합니다.

조비는 : msdk MIDAS 플랫폼 API를 액세스 권한 및 기타 작업, 게임 사업이 수요 피할 지나치게 침해 토끼 게임 로직 제어에보다 쉽게 ​​구체적으로 다루는 절연 층을 만들 수 있습니다.

질문 4 : 운영 및 고객 서비스 인터페이스는 일반 게임에 대한 쓰기 데이터 다시와 경쟁, 선수 데이터를 수정합니다.

해결 방법 : 데이터 메시지를 수정하는 유사한 메커니즘을 사용합니다.

ZC는 : 멀티 스레드 개발, 종종 교착 상태가 소진 또는 양질의 서비스를 상승하는 스레드 풀 스레드가있다. 비즈니스 요구와 합리적인에 따라 스레드 풀의 분류, 서로 다른 서비스가 서로 영향을주지 않습니다 사이에 부하의 합리적인 비율이하는 것이 좋습니다. 중요하지 않은 프로세스가 지연되거나 비동기 처리, 붙어 중요한 프로세스를 피하기 위해해야합니다.

동시에, 합리적인 스레딩 모델을 효과적으로 스레드 간의 경쟁을 줄일 수 있습니다. 정말, 논리적 과정을 피하기 중첩 된 잠금 경합을 자유롭게하기 위해 입구를 고정 통일하고 질서있는 과정에서 자원에 대한 경쟁해야합니다. 그리고, 서비스 중단을 방지하기 위해 잠금 제한 시간을 추가 할 수 있습니다.

조비는 : 단 하나의 데이터 포인트 수정은 피할 데이터 경주를하는 데 도움이 같은 시간을 보장합니다. 독립적 인 데이터 테이블 및 서비스 이벤트를 기록, 단일 수정 서비스에 대한 요약 실행을 사용하여, 제안 된 디자인 CQRS 방법을 사용하는 경우.

웨이드 : 동시 프로그래밍은 일반적으로 하나 또는 다중 스레드 솔루션을 비는 차단과 함께 가장 일반적인 서버 측 문제입니다. 자바와 같은 언어를, 멀티 스레딩에 대한 기본 지원의 경우, 많은 개발자들이 멀티 스레드로, 장점은 코드를 작성하는 것이 더 편리 경향이 있지만, 다양한 개체가 작동, 유사하거나 java.util에서의 숙련 된 사용을 잠금 취소하는 것이 필요하다. 이 동시 멀티 스레드 도구 라이브러리. 사용하는 경우 이점이 잠금 문제가되지 않습니다, 비를 차단하지만, 코드가 각 콜백 함수로 나누어 져 일부 팀은이 문제를 완화하기 위해 도구 "코 루틴"약속 등을 사용할 수 있도록, 가독성이 매우 나쁘다 문제는, 그러나 또한 더 복잡성을 소개합니다.

게임 서버 아키텍처 스케줄링 아키텍처에 대한 다음과 같은 세부 사항은 이해를 촉진하기 위하여.

a)는 하나의 게임 서버 프로세스

가장 쉬운 게임은 프로세스 서버가 단일 지점입니다. 이 과정을 종료하면, 전체 게임 세계는 사라졌다. 이 방법에서, 필요에 따라서 선택 때문에 다양한 방법을 만들어 동시 클라이언트 데이터 패킷을 처리하기 :
그림 삽입 설명 여기
동기화 - 동적 멀티 스레딩

각 사용자는 스레드의 확립 세션을 수신한다. 이 기록 데이터 패킷 모드, 직관적이고 단순한 인코딩 블록에서 사용할 수있는 경우 또는 각 호출이 소켓으로부터 판독되도록 자주 표시되는 클라이언트 TCP 연결하여 사용자 세션이다. 얼마나 많은 게임 클라이언트 연결, 많은 스레드가 있습니다. 그러나이 프로그램은 또한, 명백한 단점을 가지고이 불쌍한 제어 서버 스레드, 메모리 풋 프린트의 많은 양을 생산할 가능성이 있지만, 스레드 스위치 또한 수있는 CPU의 성능 손실 원인. 읽고는, 더 중요한 잠금 장치에서 문제를 해결해야 할 필요성이 코드는 다양한 교착 버그, 서버의 영향 안정성의 결과로, 매우 복잡하게 만들 수있는, 멀티 스레드 데이터의 동일한 조각을 작성합니다.

동기화 - 멀티 스레드 풀

설립을 저장하고, 스레드의 스레드 풀의 설립을 해제하기 위해. 사용자 세션이 설정 될 때마다 응용 프로그램은 스레드 풀 스레드를 사용합니다. 사용자 세션이 종료가 스레드는 "릴리스"이 스레드의 사용하지만, 스레드 풀을 종료하지 않는 경우. 스레드의 수의 스레드 풀의 양호한 제어는 사용자의 영향에 의거하여 서버에 접속을 방지 할 수 인플레이션 성형기구 큐 엔트리 의한. 그러나 스레드 풀 구현 자체가 더 복잡하고, "응용 프로그램"이며, "릴리스"호출 스레드가 규칙을 엄격하게 준수를 요구, 스레드 풀에서 실행 스레드 누수가있을 것입니다.

비동기 - 단일 스레드 / 코 루틴

게임 업계에서는 네트워크 API로 리눅스는 epoll의 사용은 높은 성능을 얻기 위해, 일반적인 선택입니다. 게임 서버는 가장 일반적인 차단 호출이 너무는 epoll을 사용 후, 전체 프로세스 서버가 하나의 스레드 만 할 수 있도록하는 것이 완전히 차단 호출 될 수 있습니다, 네트워크 IO입니다 처리합니다. 이것은 완전히 멀티 스레드 잠금 문제를 해결뿐만 아니라 동시 프로그래밍의 어려움을 단순화합니다. 그러나, "차단되지해야하는 모든 호출은"제약은 일부 데이터베이스 API가 차단 등을 준수하는 것으로 그렇게 쉬운 일이 아닙니다이며, 또 다른 하나의 프로세스는 이제 멀티 코어 CPU 서버의 경우, 단일 스레드 CPU를 사용할 수 없습니다 CPU 자원을 최대한 활용. 이 콜백의 많은 정의 및 프로세스 로직의 내부로 이어질 것 "콜백"접근 방식을 기반으로 비동기 프로그래밍 있기 때문에, 매우 부정적인 독서에 대한 코드 내부의 다른 콜백 함수의 숫자로 작성되었다. -이 코딩 문제의 관점에서, 코 루틴 (코 루틴)는 이제 더 많은 인기를 비동기 +의 코 루틴의 조합을 사용하려면, 도움말을 더 나은 수 있습니다. 어떤 경우에는, 비동기 - 때문에 동시 사고없이 좋은 성능을 단일 스레드 모델은 지금 선호하는 팀의 많은 아직도있다.

비동기 - 고정 멀티 스레딩

단일 스레드 모델을 밖으로 진화 모델 -이 비동기 기반으로합니다. 메인 스레드, IO 스레드의 논리 스레드 :이 모델은 일반적으로 스레드의 세 가지 유형입니다. 이 스레드는 내부적으로 전체 비동기 방식으로 실행하고, 그들 사이의 잠금이없는 메시지 큐 통신에 의해있다.

b) 복수의 게임 서버 프로세스

멀티 프로세스를 게임 서버 시스템은 성능 문제에 대한 수요에서 유래. 단일 프로세스 아키텍처 때문에, 항상 용량의 한계를 들고있을 것, 더 복잡한 게임, 개발자가보다 복잡한 게임을 지원하기 위해 프로세스를 탈출해야하므로, 단일 프로세스의 장부 금액을 낮 춥니 다.

운영 체제 도구를 사용하여 더 많은주의 깊게 작동 상태를 모니터링 할 수 있습니다, 쉽게 재해 복구 프로세스, 멀티 코어 CPU를 활용할 수있는 기능 : 다중 프로세스로가는 길에되면, 개발자는 다중 프로세스 시스템의 다른 장점을 발견했다. 멀티 프로세스 시스템의 더 고전적인 모델은 "3 층"입니다 :

멀티 프로세스 아키텍처에서, 개발자는 일반적으로 전체 처리 로직을 조정하는 프로세스 간 통신을 사용하여 개별적으로 공정을 개발 각 모듈의 기능에 경향. 각 프로세스에 필터, 사용자에 의해 전송 된 데이터 패킷, 상기 덕트 어댑터로부터 상기 필터를 통과하는 복수의 마지막 완료하면 -이 아이디어는 전형적인 "필터 파이프"아키텍처 패턴이다 생각 처리. 인해 여러 프로세스를 사용하기 위해서는 이들 각각에 대해 단일 스레드 처리를 구성하는 하나의 프로세스를 사용하는 것이 바람직하다. 게임 개발자를위한 그래서, 명확한 구조가 훨씬 간단뿐만 아니라 더 높은 성능을 달성 할 수 있습니다.
그림 삽입 설명 여기
많은 이점이 있지만, 시스템이 특별한 관심의 문제가 요구하는 여러 과정이 있지만 - 데이터 저장. 데이터 일관성을 보장하기 때문에, 상기 저장 과정은 여러 방법으로 잘라 일반적으로 곤란하다. 심지어 관계형 데이터와 하위 라이브러리 하위 테이블 거래를하고, 매우 복잡, 사업의 유형에 따라 있습니다. 데이터 메모리 및 동기화를 분할 곤란하기 때문에, 하나의 논리 처리 과정을 수행하지 않는 경우와, 현상은 특정 비즈니스 로직에 평행하게 연장하는 것이 곤란하다. 그들은 비즈니스 프로세스의 로직 상태 비 저장을 선택할 수 있지만, 모든 비즈니스 프로세스를 잡아 당기거나 데이터 쓰기에 저장소 프로세스로 이동해야하기 때문에 그것은, 성능을 더욱 압력 저장 프로세스를 증가했다.

데이터의 문제뿐만 아니라, 멀티 프로세스 아키텍처는 또한 운영 및 유지 보수 및 개발에 대한 일련의 질문을 가져왔다 : 첫 번째는 전체 시스템의 구축이 프로필 더 많은 수의 결과로 인해 프로세스 구성의 다른 유형의 수를 연결하는 필요성의 복잡입니다 필요가 관리하는 단계; 프로토콜은 프로세스 간 해결하기위한 하나의 함수 호출 과정에서 문제의 거대한 수를 정의 할 필요가있다, 그래서 통신의 많은, 우리는 여러 과정에서 전체 소스를 발생 프로토콜 응답을 요청 세트를 정의해야합니다 둘째 때문에 AN 부호의 크기가 크기 증가의 순서, 그리고 마지막으로 전체 시스템이 전체 구조를 이해하지 않고 많은 짧은 조각 기능에 사지가 절단되고, 그것은 그들이 코드를 읽을 수있는, 처리하는 방법을 완벽한 비즈니스 프로세스를 이해하기 어렵고, 거의 아무도 완벽하게 내용을 파악할 수 인해 매우 빠르게 비즈니스 프로세스의 변화, 몇 가지 수정 된 시스템으로, 특히 게임 분야에서 매우 높은 엄청난 비용을 전송하지 않습니다.

게시 40 개 원래 기사 · 원 찬양 한 · 전망 3496

추천

출처blog.csdn.net/LuHai3005151872/article/details/104674417