실시간 멀티 플레이어 게임에 사용할 데이터베이스 (RDBMS vs NoSQL vs BOTH)는 무엇입니까?


12

데이터베이스 (플레이어 프로필, 친구, 잠금 해제, 뉴스 등의 기능)가 필요한 실시간 멀티 플레이어 게임을 만들고 있습니다. 이것은 표준 PC 게임 (브라우저 기반이 아님)이며 클라이언트 서버를 사용합니다 건축물. 데이터베이스 사용에 익숙하지 않고 지난 몇 일 동안 RDBMS vs NoSQL과 같은 열띤 토론을 우연히 연구했습니다. 현재 NoSQL에 대해 기울고 있지만 각 용도 (RDBMS 및 NoSQL)에 대한 내용을 읽은 후에 두 가지를 모두 사용하고 싶습니다. 나는 그것이 이상하게 보일 수도 있다는 것을 알고 있지만 내 상황을 설명해 드리겠습니다.

우리 팀은 무제한 mySQL 저장 공간과 대역폭을 제공하는 공유 웹 호스팅 패키지를 가지고 있습니다. 단 한 번에 25 개의 연결 만 열 수 있습니다 (공유 호스팅 규칙). 뉴스 업데이트를 게시하고, 커뮤니티 기능 (댓글, 팬 아트 업로드 등)을 지원하기 위해 내 웹 사이트 (일반적인 사용법)에이를 사용하려고합니다. 다 괜찮아요!하지만! 이것은 흥미로운 일입니다. 게임 내 웹 사이트에 게시 된 것과 동일한 정보를 표시하고 싶습니다. 이것은 내 웹 사이트와 게임 모두에 mySQL을 사용한다는 것을 의미합니다. 뉴스 게시물 외에도 채팅 및 서버 목록과 같은 용도로 게임 내에서 사용할 계획입니다. 나는 그 25- 연결 규칙이 주로 걱정된다.

질문 1을하게하는 것은 어느 것입니까? : 이것이 효과가 있을까요? 더 나은 대안이 있습니까?

이 외에도, NoSQL의 성능에 대해 읽었으며 실시간 게임에 적합합니다 (잘못 될 수 있습니다. 여기에 도착하기 위해 거대한 RDBMS 대 NoSQL 불꽃 전쟁을 거쳤으며 아마도 화상을 입었습니다). 기본적으로 모든 게임 오브젝트 데이터에 MongoDB를 사용하고 싶습니다.

그리고 다시 한 번 문맥을 제공하면 도움이 될 것입니다. 240MB MongoDB 패키지를 무료로 제공하는 호스트 (MongoLab)를 찾았습니다. 업그레이드가 필요할 때까지 사용하려고합니다. 240MB가 주어지면 대략 60,000 명의 플레이어를 저장할 수 있다고 계산했습니다 (각 플레이어가 대략 4KB이고 저장 될 수있는 다른 것을 무시하는 경우). 스토리지 공간과 앞으로 더 많은 비용을 지불해야하는 것은 문제가되지 않습니다. 현재 모든 게임 오브젝트 데이터에 MongoDB를 사용하려는 유일한 이유는이 게임 오브젝트 데이터에 액세스하는 빈도 (예 : 플레이어가 죽거나 아이템을 집어 올리거나 총을 발사하는 등) 때문입니다. 또한 스키마가없는 간단한 문서 (게임 오브젝트 데이터를보다 쉽게 ​​매핑 할 수있는 문서)와 같습니다. 한 번에

내 웹 사이트에서 동일한 MongoDB를 사용하여 플레이어 프로필 정보를 표시하려고합니다 (완전한 일관성에 관심이 없으며 게임 내 업데이트로 인해 약간의 지연이 발생합니다). 두 번째 질문 인 질문 # 2로 이어질 수있는 것은 무엇입니까?

게임은 다음과 비슷한 시작 환경을 갖습니다.

  1. 클라이언트 로그인 (MongoDB)
  2. 클라이언트는 채팅방이있는 게임 내 홈페이지에 있습니다 (MySQL)
  3. 클라이언트가 서버 목록으로 이동 (MySQL)
  4. 클라이언트가 서버에 연결하여 서버에서 재생

  5. 서버는 모든 플레이어 (MongoDB)의 업데이트를 전달합니다.

이것은 내가 작동 할 것이라고 상상 한 방식입니다. 이 방법이 나에게 좋습니까, 아니면이 계획을 개선 할 수있는 방법에 대한 제안이 있습니까?


9
에서 적어도 당신이 제공 한 많은정보를 일부 달리, 사람들이 포기하지 않는 충분한 정보를.
Cyclops

7
나는 당신이 제안하는 것을 오해 할 수도 있지만 보안상의 이유로 게임은 데이터베이스에 직접 연결되어서는 안되므로 연결 수는 중요하지 않습니다. 게임이 연결되면 다른 사람도 연결될 수 있습니다. 또한 연결하는 모든 플레이어에 대해 게임 서버에서 데이터베이스로 새로운 연결을 열지 않아야합니다.
Matthew Scharley

1
백엔드 프로그래밍에 어떤 언어 / 도구를 사용할 계획입니까?
aaaaaaaaaaaa

4
호스팅 된 DB를 선택하면 게임에서 서버로 그리고 거기서 DB 서버로 왕복 할 수 있습니다. 게임에서 서버 (로컬 DB 연결을 여는)보다 속도가 느리고 NoSQL을 사용했을 때의 성능 향상을 무효화합니다.
bummzack

"팀은 무제한의 mySQL 스토리지와 대역폭을 제공하는 공유 웹 호스팅 패키지를 가지고 있습니다."그들이 말한 것과 얻는 것이 두 가지입니다. 당신은 세상의 모든 공간을 "가져올"수 있지만 뚱뚱한 파이프 대신 가상 빨대를 통해 접근한다면 쓸모가 없습니다.
Ken

답변:


11

내 제안은 게임 자체가 데이터베이스 쿼리와 관련된 웹 서비스와 통신하도록하는 것입니다. 이 시점에서 웹 서비스 구현을 "전환"(웹 서비스 인터페이스는 항상 동일하게 유지되므로 게임이 중단되지 않음)하여 다른 종류의 데이터베이스를 시도하고 자신에게 적합한 것을 결정하는 것은 매우 간단합니다.

또한 데이터베이스를 인터넷에 직접 노출시키지 않는 것이 훨씬 더 안전합니다.


좋은 생각입니다. 고마워요. 데이터베이스를 처음 사용하므로 이런 일이 발생하지 않았습니다.
Andrew

2
+1 클라이언트가 DB와 직접 통신하는 것은 goatse.cx 구경의 보안 구멍입니다.
Nevermind

6

한 번에 25 개의 연결 만 열 수 있습니다 (공유 호스팅 규칙).

게임에 충분합니다. 문제는 웹 사이트에서 여러 연결을 사용하는 경우 고갈 될 수 있다는 것입니다. 적은 수의 웹 서버 만 사용하도록 웹 서버를 구성해야하며 나머지는 게임 서버로 남겨 두어야합니다. 게임 서버에는 실제로 2 개 이상의 연결이 필요하지 않지만, 소수의 사용자에게 도움이 될 수 있습니다.

이 외에도, NoSQL의 성능에 대해 읽었으며 실시간 게임에 적합합니다. 기본적으로 모든 게임 오브젝트 데이터에 MongoDB를 사용하고 싶습니다.

어느 시스템도 빠르게 진행되는 실시간 게임의 주 저장소로 사용할만큼 빠르지 않기 때문에 약간의 잘못된 주장 입니다. 메모리의 값을 유지하고 조작해야합니다. 따라서 절대적으로 필요할 때만 데이터베이스를 공격하면 속도 차이가 무시할 수있는 정도로 자주 (예 : 1 분에 한 번) 전체 문자를 저장하는 것일 수 있습니다.

재미있는 점은 MongoDB를 최고 속도로 조정하면 합리적으로 빠르게 진행되는 게임 내에서 동기 쓰기를 수행하기에 충분히 빠를 지점까지 얻을 수 있지만 비용이 많이 듭니다. 쓰기가 버퍼링되므로 데이터 무결성이 저하됩니다. 즉, 충돌이 발생하면 데이터가 손실되므로 쓰기 작업을 전혀 수행하지 않아도되며 메모리에서 편집을 수행하고 나중에 저장 한 것보다 여전히 느리므로 두 세계에서 최악의 상황이 발생합니다. .

현재 모든 게임 오브젝트 데이터에 MongoDB를 사용하려는 유일한 이유는이 게임 오브젝트 데이터에 액세스하는 빈도 (예 : 플레이어가 죽거나 아이템을 집어 올리거나 총을 발사하는 등) 때문입니다.

플레이어가 총을 발사 할 때 왜 데이터베이스에 기록해야하는지 자문 해보십시오. 왜 게임 서버에서 인 메모리로 처리 할 수 ​​없습니까? 게임이 충돌하고 나중에 다시 시작한 후 플레이어가 예상보다 총알이 3 개 더 많다는 것을 알게되면 중요한 비즈니스 문제입니까?

또한 스키마가없는 간단한 문서 (게임 오브젝트 데이터를보다 쉽게 ​​매핑 할 수있는 문서)가 좋습니다.

이것이 성능 문제보다 NOSQL 접근 방식을 선택하는 훨씬 좋은 이유입니다.

내 웹 사이트에서 동일한 MongoDB를 사용하여 플레이어 프로필 정보를 표시하려고합니다 (완전한 일관성에 관심이 없으며 게임 내 업데이트로 인해 약간의 지연이 발생합니다).

괜찮습니다. 나중에 별도의 인스턴스를 사용하여 웹 읽기가 게임 읽기 및 쓰기와 충돌하지 않도록 할 수 있지만이 문제는 문제가 될 정도로 인기가 높아지는 문제에 비해 해결하기가 쉽지 않습니다.

개인적으로 나는 두 데이터베이스 중 하나를 선택하여 어느 것이 나에게 덜 효과가 있는지에 대해 표준화하고 표준화했습니다.하지만 원하는 경우 두 데이터베이스를 유지할 수있는 이유는 없습니다.


이것에 대한 프레임 워크를 제안 할 수 있습니까? "실제로 메모리의 값을 유지하고 조작해야합니다." 나는 redis에 대해 들었지만 그 핵심 가치 관계는 우리가 조작 할 수있는 것이 있습니까?
user1735921

아니요, "메모리의 값 유지 및 조작"이라고 말하면 문자 그대로 "특별한 데이터베이스 계층 또는 프레임 워크가 아닌 변수에 저장된 데이터를 가진 일반 프로그램처럼 실행됩니다."
Kylotan

4

모든 실시간 데이터는 애플리케이션 메모리에 보관해야합니다.

사용자 로그인 데이터, 통계 등을 유지하는 것은 매우 간단한 작업이므로 대담하고 원하는 것을 거의 사용할 수 있다고 말합니다. 웹 사이트를 조심해야 할 수도 있지만 적절한 캐싱 시스템을 만들지 않으면 사용자 목록과 같은 것들이 데이터베이스 성능을 크게 떨어 뜨릴 수 있습니다.

bummzack이 말했듯이 모든 것을 동일한 네트워크에 보관해야합니다. 게다가, 무료 콘텐츠에주의하십시오. 240MB의 무료 데이터베이스 스토리지는 양호하게 들리지만, 머신이 다수의 무료 사용자 사이에 분할되어 있기 때문에 서비스 속도가 느릴 수 있습니다.


게임 데이터를 메모리에 보관하고 로그인 데이터도 메모리에 보관할 것을 동의합니다 (소규모를 고려할 때)
MarkR

일부 데이터를 메모리에 유지하지 않는 이유 (또는 데이터베이스가 메모리와 디스크 모두에있는 데이터베이스를 처리하게하는 이유)는 서버 충돌시 데이터가 지속되기를 원하기 때문입니다. 보안을 유지하는 가장 쉬운 방법은 데이터베이스에 저장하는 것입니다.
aaaaaaaaaaaa

지속성을 위해 데이터베이스를 계속 사용할 수는 있지만 강력한 충돌 안전 스토리지를 사용하는 방식으로 데이터를 메모리에 보관할 수 있지만 로그인 등을 확인해야하는 경우 서버를 (다른 활동에서) 차단할 수 없을 정도로 빠른 액세스 .
MarkR

2

데이터베이스 당 60,000 명의 사용자를 신뢰하십니까? 그렇지 않은 경우 데이터베이스 소프트웨어 보안에 대한 전문 지식 수준이 최고 수준이 아닌 경우 발생하는 모든 문제를 수용 할 수 있다고 확신하지 않는 한 "클라이언트의 데이터베이스 액세스"아이디어를 해결해야합니다.


9
그리고 당신이 그것에 대해 확신한다면, ipso 사실상 데이터베이스 보안에 대한 당신의 전문 지식 수준은 최고가 아닙니다.
jhocking
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.