Python Twist游戏服务器监控

3 投票
1 回答
1888 浏览
提问于 2025-04-16 20:22

我有一些关于写游戏服务器的问题,希望有经验的人能帮我。

我正在用Python和Twisted开发一个Flash游戏的服务器(MMO虚拟角色游戏)。这是我第一次使用Twisted,也是第一次写游戏服务器,所以我对服务器设计和Twisted的实现有一些疑问。

  1. 有没有人有关于Twisted在“游戏服务器场景”下表现的实践经验或案例研究?比如玩家之间的交流、房间里所有人的聊天、走动等——每个房间最多有50个角色。虽然还有其他操作,但这些是最常见的。Twisted能处理多少用户?(是否可以期待每个服务器支持1万用户)

  2. Epoll反应器?这对于MMO游戏服务器来说是个好选择吗?

  3. 如何建立服务器监控和管理?如果我想断开某些用户,或者在服务器已经运行时采取任何行动该怎么做?一种解决方案是将协议和工厂的数据写入memcache服务器,然后在网页界面上处理和显示,但这只是单向通信,而且“成本”比较高,我需要的是按需获取这些信息,而不是一直获取。有没有什么好的方法来建立一个监控和管理的“控制台”?我在网上搜索过,但没有找到任何例子或相关内容,这里是我的想法:

创建一个有一个工厂和两个协议的服务器?一个协议用于游戏,一个用于管理。(一个工厂<->协议监听端口1234,第二个工厂<->协议监听1235)。我在工厂中有我需要的所有信息(用户数量、活跃房间数量等),管理员也可以轻松读取这些信息,因为它们共享同一个工厂。但一个工厂一个协议,所以我做了一些修改:

两个工厂两个协议,一个工厂作为引用传递给另一个。在实践中大致是这样的:

from twisted.internet.protocol import Factory, Protocol
from twisted.protocols import basic
from twisted.internet import reactor
from twisted.application import service, internet


class Game(Protocol):
    def connectionMade(self):
            self.factory.users.append(self)

    def dataReceiver(self, data):
            for user in self.factory.users:
                    user.transport.write(data+"\n")

    def connectionLost(self, why):
            self.transport.write("You are off: {0}".format(why))
            self.factory.users.remove(self)


class GameFactory(Factory):
    users = []
    protocol = Game


class Admin(basic.LineReceiver):
    def lineReceived(self, line):
            if line == 'stats':
                    self.transport.write("{0} users online\n".format(self.factory.stats()))

            if line[0:4] == 'kill':
                    self.factory.kill(int(line[5:6]))

    def connectionMade(self):
            self.transport.write("hello fanta\n")



class AdminFactory(Factory):
    protocol = Admin

    def __init__(self, GameFactory):
            self.GameFactory = GameFactory

    def stats(self):
            return len(self.GameFactory.users)

    def kill(self, id):
            self.GameFactory.users[id].connectionLost('die')



application = service.Application("game")
gf = GameFactory()

internet.TCPServer(1234, gf).setServiceParent(application)
internet.TCPServer(1235, AdminFactory(gf)).setServiceParent(application)

这是个好解决方案吗?不会影响GameFactory的性能吧?有没有人有更好的解决方案或建议?正如我所说,我在写游戏服务器(任何类型的服务器)方面完全是新手,所以我需要关于组织和设计的帮助。

1 个回答

3

twisted.conch.manhole 是一个可以用来监控和管理的工具。最终,你可能会需要几个不同的控制界面来满足不同的需求。别害怕在其他端口上设置一个网页服务器,或者在另一个端口上设置一个IRC服务器,甚至可以设置一个SMTP客户端,给你发送每天的统计数据——这就是Twisted的主要目的。你主要是根据连接的数量来付费,而不是服务的数量。

在你第一次尝试并进行负载测试之前,尽量不要担心性能问题,确认它是否太慢。你可能会发现你现在的设置已经足够快了。如果不够快,可以尝试用UDP来处理某些玩家之间的通信(比如位置),然后用消息队列来处理玩家聊天。Second Life写了一篇关于一些流行的消息队列实现的概述

祝你好运。

撰写回答