我正在開發基於MySQL的多人遊戲匹配系統。我有三個表:對接,遊戲和GameScores。實現SQL匹配
當玩家做一個牽線搭橋的要求,我們嘗試從對接會求n對手,然後我們創建一個遊戲遊戲和GameScore行與引用播放器和遊戲 N個。
- 選擇對接會 LEFT JOIN GameScores ON 對接會 .player = GameScores .player和GameScores .player IS NULL ...(玩家不GameScore)
- INSERT 遊戲
- INSERT GameScore
- 當比賽結束後,GameScores被刪除這樣的球員是在步驟1中找到再次
GameScore是玩家唯一的。當系統得到高頻率的請求時,這會導致很多錯誤,因爲其他人已經將此播放器添加到GameScore。
所以第1步是由多個客戶端同時進行的,他們試圖在第3步
我試圖做牽線搭橋之前鎖定表添加相同的玩家不同的遊戲,但是這導致服務器速度變慢太多了。
對接是一個臨時表,包含對玩家數據和上次ping時間的引用。也許這個數據應該在MySQL之外以獲得更好的性能?
有沒有其他方法可以做得更好?可能memcached或類似的共享內存多個進程和/或服務器?
服務器運行在多個內核(NodeJS)上,未來甚至可能是多個服務器。
請閱讀[我可以問什麼主題](http://stackoverflow.com/help/on-topic) 和[如何提出一個好問題](http://stackoverflow.com/help/how - 問) 和[完美的問題](http://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question/) 以及如何創建[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve) – RiggsFolly
最終,我認爲這樣做的正確方法是擺脫Matchmaking表併爲匹配請求使用適當的消息隊列。然後,您可以使用消息代理(如RabbitMQ)將匹配處理正確分發到多個核心。 –