目前正打算用gatewayworker框架做游戏服务器
正进行框架搭设 遇到些问题 希望能一起帮我探讨一下
1.关于gatewayworker
a.请问在一台电脑上设置bussinessworker的count数为8 与同一台电脑上运行两次不同目录的bussinessworker 设置count数为4 是否有什么不一样?一台电脑上的进程数 不管是否是属于同一个目录 总和都最好是cpu数的8倍 这样吗?还是说单次运行一个目录下的bussinessworker count数为cpu的8倍?多次不同目录可以再次8倍?
b.同一台电脑不同目录运行bussinessworker,若不改名字($worker->name)会报错name重复 而不同电脑开则不会 是因为什么原因
c.bussinessworker的内部通讯端口比如2700~2704 不同目录开启多个,name设置不同 但端口一样 没有出现报错的情况,这样它们内部通讯是否会受影响?
2.关于游戏框架的探讨
a.目前要做大世界类型的游戏,能够跨服,转服这些玩法,目前是想利用gateway来区分是哪个服连接过来的,但是$_SERVER里面的信息比较少 ,想用端口进行区分,但是就需要做一个配置来映射服务器ID,有没有什么方式可以直接在gateway代码里配置一个服务器ID 类似$_SERVER里的那样 bussinessworker可以识别服务器ID是多少.
b.另一个方案是在登录服做服务器选择记录 选择不同的gateway地址(可能相同,走配置 对应不同服务ID)对应不同的服务ID 下发给客户端 再又客服端传过来(做转服也是类似的方案)传给游戏逻辑服 旧的服务器ID与转服的服务器ID,由此去老的服务器(数据库)取数据 交互时跟新转服的这个服玩家交互。
c.gateway的瓶颈大概是能支持多少的并发,每个服务器一个gateway好呢,还是多个共用一个gateway
d.假如我采用了以上方案,目前想来想跨服(假设1000个服务器)就得一个bussinessworker建立1000个数据库的连接,有N个Bussinessworker进程每个数据库的连接就是N个这样下去会超过数据库连接数最大值(用的mysql)有没有更好的方案
e.假如说就采用了以上方案,游戏业务里面有排行榜这个东西,因为以上是采用了伪转服(玩家数据库没有迁移还是在原来的数据库上)只是做了广播时按服区分,数据交叉比较厉害,比如做1服的排行榜必须遍历所有的数据库取出1服的玩家来进行排行,是想做一个排行榜服务器所有请求排行数据单独处理,有没什么更好的方法解决
或者说更好的架构,解决大世界的问题。
小弟水平有限,只想到这些方法,希望大神们指点一二~~在此谢过啦
1、GatewayWorker
a、bussinessworker的count数为8和两组bussinessworker各设置count数为4 默认没区别。但是gateway路由会用到bussinessworker->name
b、gateway有个http://doc2.workerman.net/326140功能,gateway与所有businessWorker进程建立一个链接,这些链接在gateway进程里是一个数组,数组的key是 "ip:worker_name:worker_id",所以同一个服务器上启动相同worker_name的businessWorker进程会报冲突
c、 不影响
2、关于游戏框架的探讨
a、这个属于业务逻辑了。自己映射下就好了
b、都可以,需要自己权衡
c、并发和业务相关。连接数没限制,每个服务器根据cpu核数设置gateway进程数,1核开一个gateway进程,4核开四个...
d、一般不会采用1000台服务器,mysql就一台这种架构。一般几十台服务器与几台mysql(一主多从)组合成一个区。多个区之间不共用相同的数据库。
e、排行榜可以单独new 一个Worker进程,处理排行榜数据。排行榜进程和实时处理客户端请求的进程不同,最好分开做。
非常感谢walkor大大的回答!
walkor我还想问一下关于数据库连接数的问题
假如我15个服(15个不同的库都在同一个mysql上)各自对应一个不同的日志库(也就是说一个mysql上建了30个不同的库)因为要做跨服 所以在onworkstart的时候我初始化了连接这30个库,假如我8核的CPU 我开了64个bussinessworker进程 ,等于同时创建了 30 * 64 = 1920个连接同一个mysql..这怎么整呢
一般都是每个服一个独立的库吧
@1:因为分服的时候有时不是因为数据量太大 只是运营要求开多服 所以还是同一个台电脑上的MYSQL 分不同的库名db_name
2000个链接对于mysql来说也没什么压力,就是内存占用稍微多一点。
@1:那这样是不是会限制了服务器的性能 要再开服的话 就要再搞台Mysql
你们可以看实际情况来,如果几百人在线没什么问题,几十万人在线,那就要分了。看情况的
@1:好的 多谢了~~笑脸
@1873:walkor大大 不好意思 我再再再问个问题哈 针对上面这个连接数的问题
同一个mysql不同的库名的库 只建立一个连接,比如有A,B,C,D,E个库
我只建立A的连接后面操作B,C,D,E的时候语句带上操作的库 先use B,C,D,E 或者带上库名
select from B.表名; 这样的操作 跟直接建立B的连接 select from 表名;
有什么性能上的差异吗 有的话 差异大吗
性能上感觉不到差别。主要是这样容易出错,每次还要切换库。
最好每个库一个链接。
不要给自己找麻烦,用最简单的方法做,mysql性能没你们想的那么差。
@1:yes sir 了解~