ddpush集群化

推送系统集群化设计

说明

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名做 自注册的唯一标识
 

猜你喜欢

转载自blog.csdn.net/zhaipengfei1231/article/details/81412729