公告与推送系统
概述
公告是运营触达玩家的第一通道:开服维护、活动预告、紧急通知,都需要"必达"。公告系统的难点在分级(滚动/弹窗/系统的触达强度不同)、全服推送(在线玩家实时收到、离线玩家登录补发)、以及与邮件/推送的衔接。本文设计完整的公告与推送系统。
一、公告分级
1.1 分级模型
| 级别 | 展示形式 | 触达强度 | 典型场景 |
|---|---|---|---|
| 滚动公告 | 屏幕顶部跑马灯 | 弱、轻打扰 | 活动预热、欢迎语 |
| 弹窗公告 | 登录/触发时弹窗 | 中 | 版本更新、重要活动 |
| 系统公告 | 全屏/强制确认 | 强 | 维护通知、紧急事件 |
Announcement:
annId、level(MARQUEE/POPUP/SYSTEM)
title、content、banner
startTime、endTime
channel(全服/指定服/指定公会)
onceFlag(每人只显示一次)1.2 展示控制
弹窗公告:
登录后拉取未读弹窗(去重:onceFlag)
活动弹窗按优先级排序
可跳过/稍后看
滚动公告:
在线实时推送(WebSocket)
离线不补(滚动是即时信息)二、全服公告推送
2.1 在线推送
在线推送链路:
1. 运营后台发布公告
2. 公告服务写入公告表(持久化)
3. 广播到所有逻辑服(网关/消息)
4. 逻辑服推送在线玩家(WebSocket)
5. 客户端展示(按级别)实现要点:
广播用发布订阅(Redis Pub/Sub / MQ 广播)
全服公告低延迟(秒级)
客户端重连后重新拉取(在线状态恢复)2.2 离线补发
离线玩家:
登录时拉取"未读公告"(弹窗/系统级别)
滚动公告不补(即时信息)
补发去重:player_announcement_read 表
拉取流程:
登录 → 拉取有效期内的弹窗/系统公告
→ 过滤已读 → 依次展示三、公告管理
3.1 生命周期
公告生命周期:
DRAFT(草稿)→ PUBLISHED(发布)→ EXPIRED(过期)
管理:
定时发布/下架(startTime/endTime)
紧急公告立即发布
已过期自动归档3.2 运营操作
运营后台:
创建/编辑公告(富文本/图片)
选择级别、频道、时间
预览效果
发布/撤回(撤回需谨慎,弹窗已展示无法收回)内容安全:
公告内容审核(敏感词过滤 + 人工审核)
公告落库留痕(谁发的、何时发的)
发布权限控制(运营后台鉴权)四、邮件与推送通知接入
4.1 邮件通知
公告 → 邮件:
重要通知可同时发邮件(离线必达)
邮件模板(标题/正文复用公告内容)
走邮件系统统一发送(见邮件章节)适用场景:
补偿公告(内容含奖励 → 邮件附件)
长文本公告(邮件可回看)
维护通知(离线也能看到)4.2 推送通知
App 推送:
离线玩家推 Push(厂商通道/极光/个推)
内容 = 公告标题 + 摘要
点击跳转活动页
接入:
推送服务适配多厂商
推送去重/限频(防骚扰)
推送状态回执(送达率统计)红点通知:
游戏内红点(邮箱/活动/任务)
由各系统红点汇总
公告本身不占红点(除非带奖励)五、实现要点
核心接口:
publish(Announcement)
revoke(annId)
pull(playerId) // 登录拉取未读
ackRead(playerId, annId) // 标记已读
pushBroadcast(annId) // 在线广播工程注意:
广播低延迟(Pub/Sub)
离线补发幂等(已读记录)
公告内容过敏感词 + 审核
公告表归档与清理常见坑:
广播风暴(频繁发公告)→ 合并 + 限频
重复弹窗 → onceFlag + 已读表
维护中公告推送不了 → 维护通知独立通道
时区错乱 → 统一服务器时间与其他系统衔接:
公告内容 → 邮件系统(离线必达)
推送 → 第三方推送服务
活动公告 → 活动框架(自动发布)
弹窗数据 → 客户端展示层