推送系统集群化设计
说明
1. 数据流
客户端 获取用户ID和客户端唯一标识(uuid),注册到表1
业务发送 消息+用户ID
通过表1,找到消息对应的客户端
通过表2,找到客户端所在的 推送节点
推送节点 根据uuid,找到客户端IP/port
通过TCP/UDP方式推送数据到 客户端
2. 设计要点
推送集群中,每个推送节点都要生成 唯一标识(pid)
客户端第一次心跳到推送集群后,推送节点接收到心跳,创建uuid与客户端地址对应关系的同时,向表2 记录uuid与pid的关系
客户端每次心跳,都由同一个推送节点接收(通过k8s实现),以避免 推送节点与表2频繁交互,造成数据漏发、丢失等问题
集群宕机容错设计
说明
业务与推送集群间,维护一个消息记录表,记录推送的消息,消息状态分为 推送中、推送成功
客户端收到推送消息后,更新 消息记录表中对应数据为 推送成功
通过定时调度,定时获取推送失败数据(消息在 五个心跳时间内(暂定),仍没有将状态改为推送成功,即认为推送失败),再次尝试下发,如果仍无法下发,走其他下发方式。
设计要点
消息记录表,由接入平台写入,由客户端更新,推送集群不维护此表,以降低服务器压力。
由客户端维护表,就需要客户端在收到消息后,发两条回执,一条给推送集群,一条给表更新接口
ddpush集群化技术点:
1. k8s如何支持UDP数据包和TCP长链接
-- 通过nodeport对外暴露端口和设置端口协议实现
2. k8s service路由规则能否设置
-- k8s service路由有两种方式:轮询和按session,其中按session方式既是同一IP的客户端请求,会路由到同一个pod,满足推送需求;
3. 推送节点自注册,程序内无法获取宿主机IP
-- 用pod名做 自注册的唯一标识