我正在使用Python构建一个游戏服务器,我只想获得一些我正在考虑的服务器架构的输入。
因此,众所周知,Python无法通过单个进程跨核心扩展。因此,在具有4个核心的服务器上,我需要生成4个进程。
以下是客户端希望连接到服务器群集时采取的步骤:
客户端最初与之通信的IP是网关节点。网关会跟踪每台计算机上的客户端数量,并将连接请求转发给客户端数量最少的计算机。
在每台机器上,有一个Manager进程和X Server进程,其中X是处理器上的核心数(由于Python无法跨核心扩展,我们需要生成4个核心才能使用100%的四核处理器)
管理员的工作是跟踪每个进程上有多少客户端,以及如果其中任何一个进程崩溃,则重新启动进程。当连接请求从网关发送到管理器时,管理器查看该计算机上的服务器进程(图中的3),并将请求转发给具有最少客户端的任何进程。
服务器进程实际上与客户端进行通信。
以下是3机器群的外观。为了图表,假设每个节点有3个核心。 alt text http://img152.imageshack.us/img152/5412/serverlx2.jpg
这也让我思考 - 我可以用这种方式实现热插拔吗?由于每个进程都是由管理器控制的,当我想要交换新版本的服务器进程时,我只是让管理员知道它不应再向它发送任何连接,然后我将注册新的版本进程旧的。只要客户端连接到旧版本,旧版本就会保持活动状态,然后在没有其他版本时终止。
呼。让我知道你们的想法。
答案 0 :(得分:5)
听起来好像你想看看PyProcessing,现在包含在Python 2.6及更高版本中multiprocessing。它处理了许多处理多个过程的机制。
另一种架构模型是使用beanstalkd之类的东西设置工作队列,并让每个“服务器”从队列中拉出作业。这样你可以根据需要添加服务器,交换它们等,而不必担心将它们注册到管理器(假设你在服务器上传播的工作可以量化为“工作”)。
最后,在HTTP上构建整个事物并利用现有的众所周知且高度可扩展的负载分配机制(例如nginx)可能是值得的。如果您可以基于HTTP进行通信,那么您将能够使用大量现成的工具来处理您所描述的大部分内容。