Python扭曲的游戏服务器监控

标签 python monitoring twisted

我对写游戏服务器的问题不多,希望有实践经验的人,帮帮我。

我正在使用 python 和 twisted 为 Flash 游戏(MMO 头像游戏)开发服务器。这是我第一次使用twisted,也是我第一次写游戏服务器,对服务器的设计和twisted的实现没有什么疑问。

  1. 有没有人有关于“游戏服务器情况”中扭曲表现的实践经验或案例研究(互相交谈、与房间里的每个人交谈、走路等 - 每个房间中的化身以 50 为一组。有还有其他 Action ,但这是最常见的)。 twisted 能处理多少用户? (期望每个服务器有 10K 个用户是真实的)

  2. Epoll react 器?这是 MMO 游戏服务器的好选择吗?

  3. 如何构建服务器监控和管理?如果我想断开某些用户的连接,或者在服务器已经运行时采取任何措施?解决方案之一是将来自 Protocol 和 Factory 的数据写入 memcache 服务器,然后在 Web 界面中处理和显示,但这是一种通信方式,而且“昂贵”,我需要根据要求提供这些信息,但并非总是如此。 有没有什么好的方法来构建用于监视和管理的“控制台”?我在网上搜索,但没有找到任何相关示例或文字,这是我的想法:

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

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

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 性能?有没有更好的解决方案,建议?正如我所说,我在编写游戏服务器(任何类型的服务器)方面是全新的,所以我需要有关组织和设计的帮助。

最佳答案

twisted.conch.manhole是监视/管理的一种可能性。最终您可能需要多个用于不同目的的控制界面。不要害怕在另一个端口上设置一个 web 服务器,在另一个端口上设置一个 IRC 服务器,也许一个 SMTP 客户端在一天结束时通过电子邮件向您发送统计信息——这就是 Twisted 的全部意义所在。您将主要为连接数量而不是服务数量付费。

在您对第一次尝试进行负载测试并确认它太慢之前,请不要担心性能,您可能会发现当前设置的速度足以满足您的需求。如果不是,请尝试使用 UDP 进行玩家通信的某些方面(例如位置),并使用消息队列进行玩家聊天。第二人生写了一个overview of some popular message queue implementations .

祝你好运。

关于Python扭曲的游戏服务器监控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6492128/

相关文章:

python - 在 Twilio 的 Django/Python 中访问 DateCreated 和 DateUpdated

security - 如何以编程方式检测可用的ssh身份验证类型?

python - 在 Twisted 中限制 http 客户端

python - Tkinter 文本不显示

php - 如何从 python 或 php 中的 mp3 的 ID3 中删除版权标签?

apache - 正在下载 CGI 文件,而不是在 nagios Web 界面中执行

java - 在 OSGi/Equinox 上监控

特定接口(interface)上的Python扭曲框架多播绑定(bind)

python - Python Twisted中的互斥量

python - 如何在 raven/sentry 中记录带有上下文的完整调用堆栈?