PHP小蝌蚪游戏如何分布式部署

PHP小蝌蚪游戏使用的是phpgame框架,phpgame框架设计的时候就是基于分布式设计的,所以PHP小蝌蚪游戏也是可以分布式部署的。

分布式具有以下好处:

1、充分综合利用资源,并行计算处理,高性能
2、避免单点故障造成的整个系统崩溃
3、提高系统整体承载能力
4、节约成本

关于第4点节约成本:拿小蝌蚪游戏来说,小蝌蚪由于游戏自身的特点对于CPU及内存要求不高,但是会比较消耗的服务器带宽。小蝌蚪使用的服务器是两台阿里云的低配(单核+500M内存+5M带宽)云主机价格为2x157¥/月,同样的带宽如果选用单台(单核+500M内存+10M带宽)服务器则需要1*657¥/月。所以选择两台低配5M带宽的服务器要比单台划算很多,后面如果还需要扩容则增加低配置服务器即可,所以支持分布式部署会节约不少成本,既拿很多低配机器撑起海量请求。

如何分布式部署小蝌蚪游戏呢?

首先了解下phpgame框架的进程模型
phpgame框架分为两组进程gateway进程和worker进程(分别对应workers下的gateway.php和worker.php)
gateway进程只负责网络IO,gateway进程是异步非阻塞的。gateway具体职责是
1、hold住客户端连接
2、并将客户端发来的数据转发给worker进程处理
3、接收worker进程的处理结果并发送给客户端
worker进程主要职责是处理用户请求,具体如下
1、接收gateway进程socket转发来的用户请求
2、处理请求
3、如果有需要,通过socket向gateway发送结果数据,gateway将结果数据再转发给用户

那么基于这种进程模型可以看到,gateway进程和worker进程是可以分开部署在不同机器上,这为我们分布式部署提供了便利。
所以当小蝌蚪带宽资源不足时,可以简单的增加gateway的机器,然后配置gateway进程将请求转发给同一台worker机器即可,这样就实现了增加低配服务器提高接入服务器带宽的目的,节约了成本又大大的增加了系统的承载能力。

具体如何配置:

1、首先前端配置,根据当前域名判断是否使用多个接入机
applications/Todpole/Web/js/Setting.js
var Settings = function() {
// **如果是workerman.net phpgame.cn域名 则采用多个接入端随机负载均衡**
var domain_arr = ['workerman.net', 'phpgame.cn','www.workerman.net', 'www.phpgame.cn'];
if(0 >= $.inArray(document.domain, domain_arr)){
this.socketServer = 'ws://'+domain_arr[Math.floor(Math.random() * domain_arr.length + 1)-1]+':8280';
}
else{
// 运行在其它域名上
this.socketServer = 'ws://'+document.domain+':8280';
}
}


2、服务端配置
gateway接入机的配置 conf/conf.d/Gateway.conf
listen = tcp://0.0.0.0:8280
persistent_connection = 1
start_workers = 5
user = www-data
preread_length = 65535
;**本机内网ip**
lan_ip = ***本gateway接入机IP***
lan_port_start = 20000
;**worker进程的ip**
game_worker[] = udp://***worker机器IP***:8183


worker业务逻辑机器的配置
;确认worker监听的ip是0.0.0.0,最好是本机内网ip
listen = udp://***0.0.0.0***:8183
start_workers = 5
user = www-data
preread_length = 23
max_requests=1000


3、替换原applications/Todpole/Store.php的内容如下:
class Store
{
protected static $instance = null;

public static function connect()
{
if(!self::$instance)
{
self::$instance = new Memcache;
self::$instance->addServer('**worker机器IP**', 11211);
}
return self::$instance;
}

public static function set($key, $value, $ttl = 0)
{
if(self::connect())
{
return self::$instance->set($key, $value, $ttl);
}
return false;
}

public static function get($key)
{
if(self::connect())
{
return self::$instance->get($key);
}
return false;
}

public static function delete($key)
{
if(self::connect())
{
return self::$instance->delete($key);
}
return false;
}

public static function deleteAll()
{
}
}

4、安装memcahced (debian系统运行命令 apt-get install memcached)
此时memcached可能已经运行起来了,可以先kill掉,然后运行 /usr/bin/memcached -m 128 -p 11211 -u nobody -l 0.0.0.0 -D 启动memcahced服务
给php安装memcache扩展(debian系统运行命令 apt-get install php5-memcache)
已邀请:

要回复问题请先登录注册