IM - 系统架构设计

1. 概述

IM系统架构设计,如下图,主要分为两部分:

  • 云盘系统Cpan(蓝色部分)。为了兼容已有云盘系统,提供Web SMIM Portal,接收来自云盘用户的IM需求,包含消息收发好友列表
  • 即时通讯系统IM(黄色部分)。支持Desktop和Mobile两大终端的用户IM需求,包含登录登出通讯录个人中心消息收发与搜索群组管理

本文重点介绍即时通讯IM的系统设计,包含设计思路、每个模块的功能、主要流程介绍、常见问题解答。

im-architecture.jpg

2. 系统设计

im-architecture-c4model.jpg

2.1. 系统目标

企业级即时通讯系统,在提高团队沟通协作效率的基础上,实现万物互联场景

  • 团队沟通协作,相关功能包含:即时通讯、云盘、多人会议、日程管理、任务管理,等
  • 万物互联,相关功能包含:三方系统助手、Webhook支持、公共Robot

2.2. 设计思路

  • 微服务架构,保证服务的双向扩展,具有较好的容灾性
  • 控制信令流数据分离,更好地保证控制信令的高可用,以及流数据的即时性
  • 消息总线,更好地保证微服务的高内聚低耦合特性,可实现同步异步的业务数据流
  • 数据库读写分离,深入分析业务需求,合理设计数据库模型,尽可能达到读写分离,尽可能不使用数据库事务
  • 服务幂等,业务级别实现横向扩展

3. 模块介绍

im-context.png

3.1. Portal

定位

  • IM用户的第一入口,通信协议gRPC
  • 反向代理Passport、Account、Group、Search、Robot等微服务模块

功能

  • 实现用户Session保持,而不是每次Request都携带Token
  • 实现Request/Response的统一规范化,达到协议格式清晰可维护
  • 实现复杂业务流,例如用户的一个Request,可能需要拆解成多个后台Request,由不同的微服务协作完成
  • 支持后台微服务地址可配置
  • 支持幂等,可横向扩展

3.2. Passport

定位

  • SSO(Single Sign On)服务,实现所有系统的统一登录认证,支持多种登录方式,输出JWT

功能

  • 注册功能,支持表单注册(含手机号验证、Email验证),及与已有账号系统对接
  • 登录功能,支持账号登录二维码登录手机号登录等多种登录方式
  • 登出功能,支持一键全系统登出(保存业务系统的callback)
  • 当前历史登录操作查看,包含登录设备、登录时间、登录方式、登录IP等信息
  • 支持RBAC模型(Role-Based Access Control,基于角色的访问控制)
  • 支持幂等,可横向扩展
  • 支持账号基本信息的CRUD操作,包含姓名、手机号、邮箱、工号、出生年月、性别等

3.3. Account

定位

  • IM账号的专有信息管理

功能

  • 支持IM系统专有信息的CRUD操作,包含用户团队组织架构、好友信息,以及IM Setting相关信息,例如皮肤、页面布局等
  • 支持IM用户获取可用SM地址列表,路由策略可基于办公地点就近团队默认SM等因素判定
  • 支持幂等,可横向扩展

3.4. Search

定位

  • 历史消息的检索

功能

  • 消息搜索功能,可基于日期、群组、发送人、接收人、消息关键字进行筛选,支持分页和排序
  • 支持幂等,可横向扩展

3.5. Group

定位

  • 群组管理

功能

  • 群组的创建与解散
  • 群组的修改功能,包含修改名称、公告及管理员
  • 群组邀请与移除成员,邀请时支持新人查看最近N条记录
  • 群组退出和置顶功能
  • 群组静默功能,可只静默Robot消息,或全部静默
  • 支持幂等,可横向扩展

3.6. Robot

定位

  • 支持人与物物与物的互联,此处的,可指一个软件系统、一个IoT设备等

功能

  • 基于群组,添加常用第三方Robot,例如Sentry、Prometheus、Gitlab等
  • 基于群组,支持自定义机器人,通过Webhook完成消息通知
  • 支持添加公共Robot为好友,例如打卡通知、天气提醒、日程管理等
  • 支持幂等,可横向扩展

3.7. Storage

定位

  • 支持对象存储

功能

  • 图片的上传与展示,展示参数可支持水印、指定比例的缩放,或者人工智能识别等
  • 文件的上传与下载,支持上传进度和下载进度
  • 图片展示及文件下载的权限校验
  • 定时清理功能,保存最近3个月,或者最多1G
  • 支持幂等,可横向扩展

3.8. Router

定位

  • Broker的维护者

功能

  • 提供API,实现Broker的服务发现功能,包含注册、注销,以及回调当前在线的Broker,通知其新上线的Broker信息
  • 维护在线用户路由表,即OnlineUserId(OnlineGroupId)Broker的对应关系(用户上线/下线信息,由每个Broker主动发送给Router)
  • 在线用户路由表发生变化时,通知到每个Broker
  • 支持幂等,可横向扩展

3.9. SM (Session Manager)

定位

  • IM用户的第二入口,通信协议gRPC
  • 维护IM系统与用户全双工TCP通道

功能

  • IM用户全双工TCP通道的创建、维护、使用和销毁,其中,维护可采用定时心跳
  • IM消息的收发,需要保证IM消息四大特性
  • 记录当前在线用户列表
  • 每次启动与退出,需要在Account服务完成注册和注销,可通过Redis实现
  • 支持幂等,可横向扩展

3.10. MQ

定位

  • 消息总线,实现各个微服务的低耦合和双向可扩展

功能

  • 消息的成功投递,MQ完成持久化后才算成功投递
  • 消息的安全消费,消息处理成功,且有下一个服务明确接棒,才算安全消费

3.11. Recorder

定位

  • 消息记录员

功能

  • 监听IM系统所有消息,完成消息入库
  • 支持幂等,可横向扩展

3.12. Auditor

定位

  • 消息审计员

功能

  • 审计内容:消息内容是否合法,不包含反党叛国、黄赌毒等语义
  • 审计设备:移动设备不能接收文件
  • 消息鉴权:鉴权sender与receiver是否好友(或同事)、sender是否是群组成员,等
  • 支持幂等,可横向扩展

4. 小结

本文结合IM主流需求,阐述了IM系统架构。从宏观层面,希望大家有一个初步的认识。

接下来,本专题将深入介绍核心功能的实现逻辑。(请客官坐稳扶好)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容