NodeJS基于Redis广播服的设计思路
Contents
前言
分布式集群是NodeJS游戏服务端一个基本要素,多进程间玩家通讯是游戏服的一个核心问题。目前常见的多进程广播数据的方式一种是通过RPC,另一种是Redis,本文主要讲通过使用Redis来实现。
广播服设计基本规则
- 广播服务器,只做登录、心跳、顶号、下线、广播数据基本逻辑功能。登录、心跳、顶号、下线是为了广播数据做辅助功能。
- 单纯广播服务器一般是为短连接主服务器服务的,长连接的主服务器除了做广播服还要做链接保持服,同样不做其它逻辑。
- 其它逻辑,比如向好友发信息,应交给逻辑服务器GameServer做。eg:逻辑服收到给好友发信息消息,判断完毕,具体向某个人广播时才向广播服指定人广播。
- 通过Redis的发布订阅方式,监听指定channel来实现。
一个全服广播服的设计思路
- Redis发布消息时应明确ServerID_ChanneelName,以缩小广播范围。
- 发布的消息应包含消息包名,已为了客户端做区分
- 单独向指定人广播的消息应指定目标人
- 设计一个ServerRoom的房间类,已Server为单位Redis订阅各自独立的ServerID_ChanneelName
- 玩家登陆后,查找自身ServerID对应的房间,若没有则需要创建并加入此房间。
- 每个聊天服需要订阅ChanneelName比如Notice以便做全服通知
eg:发布 向1001服的UID为1001@234, 1001@100的玩家聊天
ChanneelName:"1001_Chat"
{
packageName: “fiend.chat”, //包名
msg:"你好a", //广播内容
"to":[1001@234, 1001@100]/'all', //接收单个uid或多个UID数组,当为all时表示当前channel所有人
}
ChanneelName:"Notice"
{
packageName: “notice.item”, //包名
msg:"你好a", //广播内容
}
eg:订阅 1.各个订阅ChanneelName:”1001_Chat”的聊天服收到订阅消息,根据to字段判断接收人群,再向目标人发送消息 2.各个订阅ChanneelName:”Notice”的聊天服,遍历所有ServerRoom向所有人广播
结束语
比较仓促,还不会插入示意图,思路应该说清楚了,再具体还是文采匮乏啊!
Author wangkm
LastMod 2018/06/20