我正在开发基于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)将匹配处理正确分发到多个核心。 –