消息系统设计

消息推送和聊天功能是移动时代的重要功能,广泛存在于各种业务中

一、特性

  1. 消息推送(单播、组播、广播);
  2. 聊天(聊天室、单聊);
  3. 业务低成本接入;
  4. 用户数据反馈和统计,需要辅助业务去做精准营销;
  5. 业务定制扩展,插件机制,如上行聊天敏感词过滤等;
  6. 性能(推送能力&实时性)、可靠性;
  7. 数据安全;
  8. 协议,兼容更多设备。

二、对比

场景
对比 消息推送服务 聊天服务
使用场景 移动端推送 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建立连接。

  1. dispatcher:
    a) 介绍:根据用户的ip、位置、设备属性、网络运营商, 给其分配access服务器,用户sdk后续连接到分配到的access进行服务。
    b) 调度算法:
    输入1:用户的ip、位置、设备属性、网络运营商
    输入2:根据topic在access中的分布,和用户订阅的topic来动态调整
    分配算法:位置第一、运营商第二、topic参与调整(topic的user在access中分布不能太散,也不能太集中(阈值))
  2. 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服务:

  1. 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)
  2. logic服务:
    a) 介绍:用于聊天服务,做中间的路由寻址和存储转发。同时维护用户订阅等逻辑处理(不限于聊天服务,包括推送,因为接入层不做逻辑处理)
    b) 下行消息(topic下发),类似于如上task服务,不同点在于上行消息的处理
    c) 上行消息,需要调用自定义插件(如违禁词过滤、消息复制通知mq等)
状态存储层:

状态存储模块维护各个topic和长连接状态关系,和维持长连接心跳信息。
包括msg服务、status服务、user cluster服务:

  1. msg:
    a) 介绍:存储用户离线消息,存储topic retain消息。
  2. 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服务发送清理命令
  3. user cluster:
    a) 维护业务自定义tag(cache),底层还是放到es中
    b) 根据用户自定义查询条件,到es中进行检索,返回eids,并缓存
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • 关联文章:消息系统设计与实现「上篇」 模型设计 Notify Save Remind消息表,我们需要target、...
    JC_Huang阅读 26,153评论 52 196
  • 看过很多产品设计的文章,很少有对消息系统这个模块的设计讲得比较清晰的,最近搜集了一些资料,结合实际例子梳理了消息系...
    jason_peng阅读 2,724评论 3 46
  • 由于文章篇幅较长,而作者精力有限,不希望这么早就精尽人亡,故分成上下篇来写消息系统的设计与实现。上篇主要讲的是一些...
    JC_Huang阅读 50,060评论 20 203
  • 最近需要做到关于消息的功能,参考着博客写下自己的一点感悟(读后感),参考博客链接。 消息分为两大类:私信和公告/提...
    卡萨布兰卡ginger阅读 420评论 0 1
  • from http://www.infoq.com/cn/articles/etcd-interpretation...
    小树苗苗阅读 13,923评论 3 38