聊点啥天
提到聊天,我们会联想到QQ,微信,那么游戏中的聊天系统和它们有什么不同?本质上其实是一样的,都是分发聊天消息。很简单嘛,对每个需要通知到的玩家,挨个发消息不就得了。
核心业务需求
收到策划的通知,我们游戏要加个聊天功能,需求很简单,明天就要,应该没问题吧?
- 支持玩家与玩家私聊 保存所有历史记录
- 支持队伍内聊天 队伍未解散前保留所有历史记录
- 支持公会内聊天 保留最新的100条发言
- 支持世界聊天 百万在线级别
- 支持频道世界聊天 每个频道限制人数2k,支持999个频道
- 敏感词过滤
- 广告过滤
- 玩家举报功能,后台支持查看玩家被举报次数,实施举报行为玩家信息,防止恶意举报
- 后台支持玩家历史发言记录查询
- 后台支持禁言操作
- 支持查看游戏道具链接
- 支持在聊天界面选中查看其他发言玩家主要信息
好家伙,我就聊个天,搞这么多需求是要闹哪样?
作为一个业务实力过硬的后端程序员,我们不能慌,将需求逐一分析,总结归纳。
- 我们总结出核心需求: 发消息。我们可以把队伍,工会,世界也看做一个一个的频道,相应的玩家订阅合适的频道,根据订阅者逐一发消息。对应观察者模式。
- 世界聊天比较特殊,百万在线玩家全部转发消息,对于带宽压力很大,先做一个估算,通过设置聊天冷却,平均每秒有0.1%的玩家发世界聊天消息,每条消息平均100字节,广播放大1000000倍,那就是800Gb带宽。(⊙o⊙)…这么多带宽,得多少钱?一台机器200Mb带宽,需要4000台!!!太贵了,不行,我得想想办法,把带宽降下来。办法1: 世界聊天成本这么高,可以通过消耗道具或者加大聊天冷却的方式,降低平均消息频率,降到0.01%,平均每秒控制在100条左右。办法2: 聊天消息集中在一起时,可以通过合并消息->压缩 来降低包体的体积,把每秒收集的100条消息合并压缩后变成一条消息,压缩率平均为50%,那么这一条消息大小为5KB,广播放大后为40Gb带宽,需要200台机器。哈哈,一下子省了20倍。办法3: 在线玩家数量也不是一下子到100万,可以灵活伸缩,10万在线时,需要带宽为400Mb,只需要2台机器就够了,在线数量往上涨后,自动扩容用于聊天的服务器。
- 敏感词过滤,广告过滤,道具链接等等都可以归纳为对聊天文本的处理,而且处理一次即可
- 后台需要支持一些聊天的功能,我们需要存储数据并预留接口。禁言功能需要预留禁言接口,查询历史发言记录,需要将玩家的发言都记录下来。举报相关信息也要记下来。这些记录都是存储一次,可被查询多次。
- 玩家对其他玩家的发言可以查看 道具,查看玩家基本信息等功能。这些基本信息都可以存储到缓存中,设置一个合理的过期时间。
- 玩家的私聊可以直接存储到个人聊天的表记录中。
归纳完毕之后,是不是没有那么复杂了呢?后台的功能我们可以先放一放,先实现优先级更高的消息分发,消息订阅。找策划沟通世界聊天的成本问题。
具体的实现因为不同类型的后端框架也不一样,就不详细展开了。
说点别的
我认为游戏中的聊天有一些特殊性。首先它自带游戏话题属性,游戏中总是有的聊,队伍聊天自带组队下副本话题,工会聊天自带工会事务话题;然后,很多聊天都是临时性的,在游戏玩法结束后失效;其次,游戏中聊天玩家都是以游戏虚拟身份进行,除了某些重度社交游戏,大部分都是代入虚拟身份;再其次,聊天也是游戏官方给所有玩家发消息的单向通道,比如很多游戏都有的跑马灯公告。最后,游戏要展示其核心功能,聊天作为非核心功能,占据的屏幕尺寸会受到限制,和纯聊天软件相比,并不是特别友好。因此很多玩家都会在游戏之外,QQ微信上创建自己的游戏群,方便更多的交流,作为游戏聊天的补充。