-
Notifications
You must be signed in to change notification settings - Fork 4.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
cluster 集群组网 #1523
Comments
cluster 的配置不一定是文件,可以是一个 table 。你要做的是按你的需求去生成这个 table 。 name 是一个字符串,你想拼出 "name[42]" 或 "name.42" 都是没问题的。 |
我明白你的意思
例如:
第一反应想到这2种可能性
或者是否考虑将open_channel中的bind实现改成如下
当然这将改写cache规则 |
其实我也向希望cluster可以支持同类服务多个实例的情况下,自动路由,自动替换,特别是在某个节点不可用的情况下,类似微服务的容错处理。 |
因为 cluster 没有任何底层设施,所以你完全可以不用 cluster 根据需求自己实现组网的需求。cluster 可以作为一个实现的参考,它本身也没有太多代码。 skynet 作为公共代码,我觉得不应该提供、规范太多细节。不然会有很大的维护负担。 |
我自己写了个cluster wrapper 来实现 route 和 load level 另外 云大侠 cluserd 中 对应
我理解为 可以通过将node[name] = false 来释放 clusterd 本地已建立的缓存节点 但是在 open_channel 中 没有释放 newservice 对应的sender
在 address not ture 中直接去释放sender 是否正确
sender存在cache 所以仍然能访问 我不太清楚 档 node == false 时 sender 仍然可以继续工作是故意为之(比如存在一些特殊状态 例如:call被挂起等等 ) 最后: 关于为啥不自行实现一套组网机制 |
我记得 sender 应该不能随便删的,因为服务可能会缓存地址,所以让那个 sender 负责拒绝服务更好。 我觉得再实现一套组网机构,应该不需要修改什么已有的代码,只是不用 cluster 模块就好了。skynet 现有的代码,也没有用到 cluster 。这个我觉得是可以独立出去的。 |
仔细思考了下 sender拒绝服务 可能结果会更糟糕
在最近的cluster设计结构中 我觉得业务不应当持有sender 如果业务持有 那业务在reload时也应当自行释放sender 引用 cluster目前的设计思路对于业务层来说是1个很好的闭环 (业务层不需要了解对端服务器部署位置 仅需要向自己感兴趣的service 投递消息) 但是就目前我们团队来说可能引入新的组网模式 填坑的能力略弱(ps:没用社区来帮忙验证/发现新的组网模式的error) |
我们当前是玩家从wlogin登录,然后获取实际玩家代理所在服务wgame的地址;各节点配置放在etcd里面的,可以使用etcd来做是否服务可用,我们当前是wgame ping wlogin来确定是否可用。 |
@fanyh @JieTrancender @cloudwu 我有一个想法打算这样实现,引入etcd作为服务发现,每个skynet有自己的唯一命名,例如game,login,common(好友,公会,支付充值)等等,特别针对一些无状态的服务,可以提供多份实例,然后每个进程都有这样一个服务master node用于把自身的服务名字(地址,端口,服务名,所属功能)注册到etcd,然后通过,cluster.register同时使用方启动一个slave node主要是监听那些节点服务有效,然后把提供相同功能的服务汇总一起,生成一个cluster.reload需要的table,然后上层业务根据需求进行(hash,失败retry)调用,针对进程内的服务想调用集群中的无状态服务则只需要通过一个功能名就可以发送业务,slave node会自动根据名字找到那些相同的服务,从而进行简单的微服务弱支持,全部都是在cluster基础上做一层业务包装,另外如果节点发生变化会通过监听来cluster.reload目前的服务,初步想法,请教各位是否可行。 |
我觉得既然参考了微服务设计方案;就应该淡化指向性定义(取消skynet name定义); 上层业务实现1个cluster wrapper 来服务 来代替cluster的直接调度(调度方式仅需保持和skynet.call/send 一致) 目前尚存不足:
我们现在是结构是 玩家主体业务进程game(大/小服) + 玩家间需要共享的信息slave nodes(搭载如果个service 如:聊天,好友,公会,等等) |
我觉得消息回传你可以考虑实现成 message queue 服务。在 mq 服务上创建一个 queue ,然后需要回传的消息 pub 回复消息进去,接收方可以 sub 这个 queue 。 |
我使用集群的方式
问下
|
目前实现方案是按照mq的方式实现的;可能存在某些极限/边界情况下出现多个 slave node pub相同的消息到上层业务;
但这样一来一些具备时效性的service就不太好设计(btw:谁知道策划会提出怎样的需求,难免会出现跨服务信息还具备时效性) 关于过载我这边实现策略大概是这样: 3层判断过载策略
过载和雪崩等都是一个主观的判断;没想到比较合适的量化标准; |
这几天又想了想消息回传的问题 |
游戏业务大多带状态的 不建议设计这么复杂 越简单越好 互相影响的放一个进程比较好 |
我对集群包装没你那么重,暂时没有你消息回传的问题。我这边用集群是因为是全球服,方便业务扩展。 均衡集群为无状态节点集群 (login1..n) (gamemgr1...n) ...
分片集群(类redis)为有状态节点集群 (friend1...n) ...
我这边req/resp的使用方式主要为了
问题:
|
我们需要同时支持 全球服项目/分服项目 多种业务环境 异常对开这种处理措施比较简单啊 我有点不太明白的是什么叫 等心跳感知还有大量的connect? 你的2个节点互发消息是建立的2个tcp?
battle push msg
这样? |
嗯,是两个tcp 战斗 侧 |
这种我还是建议你实现个simple msg queue; 当然我更推荐你 用一条tcp + msg queue 来解决这个问题 你仅需要修改下agent侧 监听消息的方式而已 |
嗯,目前我就是用队列,因为队列是针对玩家的,不是节点的,当有agent节点有很多玩家在战斗,每个玩家都有send,感觉会狂刷日志。 所以我在考虑要不要在cluster_sender做些拦截及让cluster_sender抛出节点断开让业务感知。 |
我明白你的意思了;但我觉得你始终需要再包装一次 或者你魔改一个你自己的cluster_sender; 你如果用云大侠提供的原神调度,你这个问题没办法避免 |
建议魔改一下clusterd和cluster_sender,让 战斗 节点可以感知到 agent节点挂了 |
借助cluster + etcd就可以很好实现了,不需要修改然后底层代码,上层做一个服务,做转发,能够达到同类服务的自动随机选择和或者负载选择等等,然后节点上线下线就自动去reload即可。 |
这个深有体会,我们的项目就是像楼主那样使用集群模式拆分了好多节点(类似微服务)导致了好多因为rpc调用结果异常的BUG,最后无奈重构成单节点的模式。 |
节点上线下线自动去reload 是不是需要有一个中心来 广播 给他节点reload |
cluster 每次连其它节点时 先httpclient 请求 ip:port |
节点本身自己监听etcd的更新来reload即可,如果你说是中心广播,etcd就是中心 |
游戏不像互联网产品,高度集成的产品,基本游戏业务都在单节点处理,针对好友聊天需要用到的跨节点操作可以不处理异常行为,针对一些全区全服的跨服玩法,匹配后无非还是进入一个独立的空间进行,至于是本节点转发还是客户端主动连接独立空间,可以根据需求来确定。 |
目前采用cluster+etcd liker 组网已经过去几个月了,已经推广到多个项目中使用,虽然仍然存在部分问题,但在可接受范围内 在设计过程遇到最大的问题是还是cluster proxyd 和 etcd的维持上,整体来说这种组网模式对整个项目人员的要求会比直接使用定向业务组网这种方式高一些 表述得略显凌乱,终归来说这种组网模式的还是有可行性的,目前我们应用层产生的问题还是比较少;反而是cluster proxyd还有优化空间,对过载的保护做法略显粗暴,将就能用 待项目顺利上线一段时候后再将我们的组网结构呈现出来接受大家批评。 |
我们更多的是遇到了需要扁平处理的场景,同时不希望整个环境存在太多了,a,b,c...z功能性的服务器 |
如果不介意延迟的话,我们是用的主动去query 是否变化;本质上来说游戏服务器不太需要高精度的服务发现 |
云大侠,我在某业务场景中需要实现 cluster 组网
skynet 进程都是等价的slave(不是使用master-slave模式)
目前cluser的配置只能声明
我期望的输入方式
loadconfig中config已经规定了cluser的配置格式
#Question:
我想问的是:
业务层不关心目标node在哪的情况下
可以对cluster进行扩展 支持 array吗?
还是自行将cluster包装一次 在wrapper中调度cluster (wrapper 中可以实现load level) ,例如:
wrapper.lua:
这样就存在一个问题 cluster配置会变得臃肿 name将变成一个无意义的key
cluser
The text was updated successfully, but these errors were encountered: