두 가지 방법 모두 MMORPG와 함께 사용됩니다. 모든 것을 메모리에 유지하고 주기적으로 디스크를 가리키는 지 확인하는 것은 적어도 오래된 게임에서 가장 인기있는 옵션 인 것 같습니다. 구현 및 확장이 상당히 간단하다는 장점이 있지만, 신뢰할 수있게 만드는 것은 개발자의 몫입니다. SQL 데이터베이스는 신뢰성을 향상시키는 ACID 속성 을 제공 하지만 전체적으로 구현하기가 더 복잡하고 확장에 문제가있을 수 있습니다.
EVE Online은 모든 것이 SQL 데이터베이스에 저장되는 MMO의 예입니다. 필자는 약 60,000 명의 동시 사용자에서 최고조에 달했으며로드에 맞추기 위해 수년에 걸쳐 고가의 하드웨어를 데이터베이스 서버에 바쳐야한다고 생각합니다. 그러나 EVE는 대부분의 MMORPG보다 사용자 당 더 많은 데이터를 저장하며 훨씬 더 빈번하고 다양한 트랜잭션이 있습니다. 데이터베이스의 ACID 속성을 사용하면 대규모의 복잡한 데이터베이스 전체를 항상 일관된 상태로 유지할 수 있습니다.
예를 들어, 누군가가 다른 플레이어에게 아이템을주는 경우를 고려하십시오. EVE의 데이터베이스는 충돌이나 정전이 발생하더라도 해당 아이템이 한 명의 플레이어의 인벤토리에서만 끝나는 것을 보장합니다. 즉, 한 플레이어의 인벤토리에서 항목을 제거하고 다른 플레이어의 항목에 추가하는 데이터베이스 트랜잭션은 원 자성입니다. 트랜잭션이 완전히 완료되거나 전혀 발생하지 않습니다. 아이템이 플레이어의 인벤토리 또는 둘 다에 존재하지 않는 상태가 될 수 없습니다.
플레이어 데이터를 메모리에 유지하고 주기적으로이 원 자성 자체를 구현해야하는 체크 포인트를 유지하는 MMORPG. 이를 수행하는 한 가지 방법은 모든 플레이어의 데이터를 동시에 검사 점으로하여 가장 최근의 검사 점으로 간주되기 전에 새로운 검사 점이 디스크에 완전히 커밋되도록하는 것입니다. 이 게임은 또한 체크 포인트가 진행되는 동안 플레이어 데이터가 변경되지 않도록해야합니다. 활동적인 플레이어가 많을 경우, 플레이어가 알아 차릴 수있을만큼 지연 시간을 발생시키지 않으면 서이 모든 작업을 수행해야합니다.
일관성이 얼마나 중요한지 과소 평가하지 마십시오. 게임을 개발할 때 많은 충돌이 발생합니다. 문제가 관련되지 않은 버그로 인해 게임이 좋지 않은 시간에 충돌하는 경우가 아니라 항목이 사라지거나 복제되는 이유를 추적하고 싶지는 않습니다. 또한 게임이 시작되면 예상보다 많이 충돌합니다. 테스트 중에 완벽하게 작동하는 서버는 갑자기 전체 부하 상태에서 수많은 버그를 노출 시키며 플레이어는 예상치 못한 일을합니다.
대부분의 MMORPG는 실제 게임 데이터가 아닌 경우에도 계정 관련 정보로 SQL 데이터베이스를 사용합니다. 게임 상태를 일관성있는 상태로 유지하는 것보다 더 중요한 것은 청구 상태를 일관성있게 유지하는 것입니다. 게임 데이터베이스가 손상된 경우 최악의 경우 매일 백업에서 데이터베이스를 복원해야합니다. 계정 데이터베이스가 손상되는 최악의 사례는 모든 지불 거절로 인해 파산하는 것입니다.
프로젝트의 경우 어느 쪽이든 갈 수 있습니다. 동시 사용자 수가 1000 명인 경우 SQL 서버가 요즘 상용 PC에서 처리 할 수있는 기능의 한계를 극복하지는 못하지만 트랜잭션의 특성에 따라 크게 달라집니다. SQL 및 관계형 데이터베이스 디자인에 익숙하다면 이것이 도움이 될 수 있습니다. 플레이어의 현재 적중률과 같은 통계는 반드시 일관성이 필요하지 않기 때문에 거래를 데이터베이스에 저장하고 싶을 수도 있습니다. (PvP 게임에서는 ...) 몬스터 HP와 같은 것을 데이터베이스에 전혀 저장하지 마십시오. 대부분의 게임에서는 플레이어 관련 데이터 만 영구적입니다.
반면에 SQL 마법사가 아닌 경우 모든 데이터를 메모리에 더 단순하게 유지하여 안정적으로 작업 할 수 있습니다. SQL 데이터베이스는 일관성과 신뢰성을 향상 시키지만 자동은 아닙니다. 잘못 설계된 데이터베이스는 성능이 저하되고 불일치가 발생할 수 있습니다. 그렇게하지 않으면 거래는 원 자성이되지 않습니다. 종교적으로 매개 변수화 된 문장을 사용하지 않으면 SQL 인젝션 공격에 노출됩니다.