游戏邮件系统
功能需求
- 单人邮件:对特定玩家发送邮件(如后台补偿邮件,背包空间不足道具由邮件发送等)
- 多人邮件:对一批玩家发送邮件(如排行榜奖励邮件,公会奖励邮件等)
- 全服邮件:对所有玩家发送邮件(如开服福利邮件,全服补偿邮件等)
基本设计思路
-
简单版本:
- 数据储存:用一个全局数据结构 g_mail_list 存放所有邮件,每发送一封邮件(包括个人,多人和全服邮件)就往 g_mail_list 添加 id 自增的邮件,玩家个人信息储存已接收到的邮件
- 发邮件:
- 往 g_mail_list 插入邮件信息,遍历该邮件的接收玩家列表,如果玩家在线,把邮件信息添加至玩家的邮件字段中并通知客户端,否则不处理
- 玩家上线时会拉取 g_mail_list,根据本身的邮件列表和全局邮件列表拉取新添加的邮件并通知客户端
- 缺陷:
- 发送全服邮件时会向所有在线玩家发送邮件,频繁发送多人/全服邮件可能会导致服务器短时间压力过大
- 由于单人邮件也存放在 g_mail_list 中,导致 g_mail_list 中的邮件数量过多,玩家登录时遍历该列表耗时会增加
-
改进方案:
- 对于缺陷 1:要发送到玩家的邮件存放在队列中,定时批量处理邮件(削峰平谷)
- 对于缺陷 2:可以把单人邮件从 g_mail_list 中剥离出来存放在对应玩家的 cache 中,玩家上线/定时检查缓存中的个人邮件信息
基于 skynet 实现的邮件系统
-
单人邮件:
- 所有单人邮件都会发送到 cache 服务中
- cache 服务收到邮件信息会记录到对应的玩家 cache 中,如果玩家在线,则通知到客户端
- 玩家登录会请求 cache 服务拉取所有缓存邮件
-
多人/全服邮件:
- 邮件会先发送到 group_mail 服务记录起来
- group_mail 定时批量将邮件发送到在线玩家的 cache 中并通知客户端
- 玩家上线会从 cache 请求所有邮件列表