前言

分布式集群是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向所有人广播

结束语

比较仓促,还不会插入示意图,思路应该说清楚了,再具体还是文采匮乏啊!