消息推送和聊天功能是移动时代的重要功能,广泛存在于各种业务中
一、特性
- 消息推送(单播、组播、广播);
- 聊天(聊天室、单聊);
- 业务低成本接入;
- 用户数据反馈和统计,需要辅助业务去做精准营销;
- 业务定制扩展,插件机制,如上行聊天敏感词过滤等;
- 性能(推送能力&实时性)、可靠性;
- 数据安全;
- 协议,兼容更多设备。
二、对比
场景
对比 | 消息推送服务 | 聊天服务 |
---|---|---|
使用场景 | 移动端推送 | IM聊天、社交 |
面向对象 | 设备 | 用户、账号 |
消息对象 | App 运营人员或者 App Server 向用户推送 | 用户之间互相交流 |
发送方式 | 支持广播、多播、单播 | 单聊、群群 |
协议
Protocol | XMPP | MQTT |
---|---|---|
优点 | 组件成熟,成本低 | 3.1版本,协议轻量级,最小消息头仅有2字节,省流量,专门为IOT设计的弱网弱设备协议 |
缺点 | 协议冗杂,耗流量耗电 | 缺点是组件不够成熟,开发略复杂 |
三、设计
整体上,系统用etcd做服务发现和配置加载(本地配置做etcd容灾),并结合etcd做微服务的rpc通用架构(技术沉淀),接入层、用户逻辑层、状态存储层,三层之间弱耦合,层内水平扩展,接入层和业务逻辑层弱状态,状态存储层分布式状态保证状态可用,同时为了可用性保证,考虑在状态存储层遇到宕机情况,当前已接入设备的恢复过程。为了调试、 调优、追查的效率考虑,基础框架嵌入trace机制
接入层:
包括dispatcher服务和access服务:
dispatcher模块的主要功能是给client提供接入点,根据一定的调度策略,达到负载 均衡的作用。dispatcher的调度策略 dispatcher需要能够通过分配算法的合理分配给client的access地址。dispatcher根据用户 的信息以及etcd中的上报的access信息综合选择。
access模块负责client的接入,client直接和access建立连接。
- dispatcher:
a) 介绍:根据用户的ip、位置、设备属性、网络运营商, 给其分配access服务器,用户sdk后续连接到分配到的access进行服务。
b) 调度算法:
输入1:用户的ip、位置、设备属性、网络运营商
输入2:根据topic在access中的分布,和用户订阅的topic来动态调整
分配算法:位置第一、运营商第二、topic参与调整(topic的user在access中分布不能太散,也不能太集中(阈值)) - access:
a)接入用户端,与sdk直接通信,兼容多协议,向后端业务逻辑层传递归一 化后的协议数据
b)核心功能点:
i. 接入客户端,兼容客户端协议mqtt
ii. 注册etcd,并从etcd拉取配置(兼容本地配置做etcd容灾)
iii. 数据安全,加密解密
iv. 维持长连接,心跳逻辑
v. 与status服务配合,维护设备(用户)的上下线状态和分布,并维护心跳,同时进行断网恢复
vi. 与task服务配合,按照task服务寻址指定进行消息推送,并接受到达ack逻辑,和点击ack逻辑
vii. 与logic服务配合,按照logic服务的寻址指定进行消息下发,并接收到达ack逻辑
viii. 接收用户的loginwithtoken请求,赋予上行权限,并后续进行上行消息的向logic服务转发
业务逻辑层:
包括task服务和logic服务:
- task服务:
a) 介绍:用于推送服务,接收业务方推送请求,并寻址到对应用户, 进行转发和存储
b) 核心功能点:
i. 接收推送请求,根据推送目标(单播、组播、广播),到status服务中寻找这些用户在access上分布,批量发往access服务消息进行推送
ii. 组播部分,可以是一批eid,也可以是tag,也可以是用户定义的条件,进行解析,并发送给access
iii. 对于批量推送任务,生成task_id,时刻维护task_id状态(完成与否,完成
量),向业务反馈
iv. Task_id与推送到达率等相结合,供效果查询点击率等
v. 根据status服务做分发寻址
vi. 配合msg_server做离线消息存储和消息备份(备份可以用来做retain msg) - logic服务:
a) 介绍:用于聊天服务,做中间的路由寻址和存储转发。同时维护用户订阅等逻辑处理(不限于聊天服务,包括推送,因为接入层不做逻辑处理)
b) 下行消息(topic下发),类似于如上task服务,不同点在于上行消息的处理
c) 上行消息,需要调用自定义插件(如违禁词过滤、消息复制通知mq等)
状态存储层:
状态存储模块维护各个topic和长连接状态关系,和维持长连接心跳信息。
包括msg服务、status服务、user cluster服务:
- msg:
a) 介绍:存储用户离线消息,存储topic retain消息。 - status:
a) 存储用户eid->access_server的映射关系,考虑到同一个eid会看多个topic,所以需要中间多一层映射,即为:eid->conn_id, connid->access_server
b) 用户上下线,需要修改eid->access的映射和状态
c) 接收access转发来的心跳包,并结合超时机制,修改eid->access的映射和状态
d) 接收logic服务转发来的订阅请求,存储eid到topic_ids的映射关系
e) 如断网重连等情况,需要维护同一个eid不能出现在两个access上的逻辑,需要主动对access服务发送清理命令 - user cluster:
a) 维护业务自定义tag(cache),底层还是放到es中
b) 根据用户自定义查询条件,到es中进行检索,返回eids,并缓存
网友评论