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

walkor

PHP小蝌蚪游戏也是可以分布式部署的。

分布式具有以下好处:

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

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

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

首先了解下phpgame框架的进程模型
phpgame框架分为两组进程gateway进程和worker进程(分别对应workers下的gateway.php和worker.php)

gateway进程只[b]负责网络IO[/b],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() {
    // [b]如果是workerman.net phpgame.cn域名 则采用多个接入端随机负载均衡[/b]
    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
[code]
listen = tcp://0.0.0.0:8280
persistent_connection = 1
start_workers = 5
user = www-data
preread_length = 65535
;[b]本机内网ip[/b]
lan_ip = [b][i]本gateway接入机IP[/b][/i]
lan_port_start = 20000
;[b]worker进程的ip[/b]
game_worker[] = udp://[b][i]worker机器IP[/b][/i]:8183
[/code]

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

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('[b]memcache内网机器IP[/b]', 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)

好了,重启服务,大功告成!

7476 3 1
3个评论

one

牛逼啊

  • 暂无评论
xtjsxtj

workerman的标准配置文件中gateway.conf好象没有下面这几个参数啊?是另外扩充的吗?
;本机内网ip
lan_ip = 本gateway接入机IP
lan_port_start = 20000
;worker进程的ip
game_worker[] = udp://worker机器IP:8183

  • 暂无评论
walkor

这个是比较老的帖子了
现在分布式部署可以参考手册
http://doc.workerman.net/advanced/distributed.html

  • 暂无评论
年代过于久远,无法发表评论

walkor

140721
积分
0
获赞数
0
粉丝数
2014-05-04 加入
🔝