Python扭曲的游戏服务器监控

时间:2011-06-27 11:27:58

标签: python monitoring twisted

我对编写游戏服务器的问题很少,我希望有人有实践经验,并会帮助我。

我正在使用python和twisted开发用于Flash游戏(MMO头像游戏)的服务器。这是我第一次使用twisted和第一次编写游戏服务器,我对服务器设计和扭曲实现几乎没有疑问。

  1. 是否有人在“游戏服务器情境”中有关于扭曲表现的练习经验或案例研究(互相交谈,与房间里的每个人交谈,走路等等) - 每个房间的头像按50分组。也是其他行动,但这是最常见的)。有多少用户可以处理? (真正期望每台服务器有10K用户)

  2. Epoll反应器?这是MMO游戏服务器的不错选择吗?

  3. 如何构建服务器监控和管理?如果我想断开某些用户,或者在服务器运行时采取任何措施?其中一个解决方案是在memcache服务器中从Protocol和Factory写入数据,然后在Web界面中处理和显示,但这是单向通信,而且“昂贵”,我需要请求的信息,而不是总是如此。 是否有一些很好的方法来构建用于监控和管理的“控制台”?我在网上搜索,但我没有找到任何关于这方面的例子或文字,这是我的想法:

  4. 使用一个工厂和两个协议创建服务器?一个游戏协议,一个用于管理。 (一个工厂< - >协议监听端口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 个答案:

答案 0 :(得分:3)

twisted.conch.manhole是监测/管理的一种可能性。最终,您可能需要一些用于不同目的的控制接口。不要害怕在另一个端口上设置Web服务器,在另一个端口上设置IRC服务器,也许是一个SMTP客户端,在一天结束时通过电子邮件向您发送统计信息 - 这就是Twisted的重点。您将主要支付连接数,而不是服务数。

在第一次尝试加载测试并确认它太慢之前,请不要担心性能,您可能会发现当前的设置速度超出了您的需要。如果没有,请尝试将UDP用于播放器通信的某些方面(例如位置),以及用于玩家聊天的消息队列。 Second Life写了overview of some popular message queue implementations

祝你好运。