实时通讯系统源码分析 (一) 之整体架构分析

本贴最后更新于 2119 天前,其中的信息可能已经时过境迁

前言

MPUSH 是一个开源的实时在线推送系统,基于开源代码,使用者可以很方便地开发出自己的实时通讯系统,例如:IM 通信、消息推送等。如果你正在选型实时通信框架或者是对实时通信框架感兴趣,又或者是有时间准备了新框架,可以了解一下 MPUSH 推送系统,也许是你一直寻找的框架,源码地址,QQ 交流群:952774305。本文主要分析 MPUSH 系统整体框架。

需求分析

当我们在开发面向客户的业务系统时(无论是面向企业或是个人),总会遇到实时性方面的需求,目前也有很好的解决方案,面向 Web 端开发,可以使用 websocket 技术,面向 app 开发则会使用 socket 进行通信,使用这些技术可以很好地满足实时通信需求,但在项目中引入新技术来解决问题的同时也要关注新技术带来的挑战。

相关挑战

在开发面向客户端的业务系统时,大部分的需求都是使用基于 HTTP 协议开发的 API 接口来解决问题,HTTP 协议具有通用,实现方便,大部分开发语言都有基于 HTTP 开发的类库,使用成本低。HTTP 是一种简单的请求响应模式,生命周期短,以 Java 开发语言为例,我们会基于 Servlet 容器来开发 HTTP 服务端,容器完全接管 HTTP 请求生命周期,我们只管使用请求中的信息完成业务处理,然后将返回数据写入响应中,由容器帮我们创建以及销毁 HTTP 请求。
png

使用 HTTP 开发很方便,但如果业务对实时性有要求,那么 HTTP 可能就不是一个好的选择了。Websocket 就是一个针对 Web 环境下使用的高性能通信协议,可以满足实时业务需求。websocket 和 HTTP 有所不同,用户发送 Websocket 连接请求,与服务器经过三次握手后建立连接,之后将会一直保持连接状态直到通信的一端主动发起断开连接,所以在此期间连接对象的管理工作由开发者负责维护,会存在以下挑战:1)创建链接后需要容器来存放链接,2)需要有效链接检测机制,3)需要设计新的通信协议(消息格式)4)消息安全问题 5)提前规划分布式架构设计(单机性能有限)6)还有其它多线程管理、性能检测等等功能。
websocketpng

MPUSH 功能分析

使用 socket 以及 websocket 技术引入的新问题,MPUSH 框架可以有效地解决:

  1. 提供了完整的通信格式协议,包括基础消息,心跳消息,并且能够方便地进行消息扩展实现自定义消息通信
  2. 封装了底层通信消息序列化以及反序列化能力,对上层业务透明
  3. 提供了连接全生命周期管理并提供了扩展点,包括建立连接、释放连接、连接会话创建以及销毁等,提供了状态变更消息分发(例如:系统启动、系统销毁、用户上线、用户下线等消息)
  4. 高扩展性,提供 SPI 接口优雅实现组件替换
  5. 分布式架构设计,为大业务量提供支持
  6. 模块化设计,代码质量高,条例清晰
  7. .....

更加详细的优点介绍可以参见官网文档

MPUSH 组件分析

MPUSH 系统具有良好的模块化设计,整体组件如下图所示:
MPUSHpng

整体组件可以划分为三大块:

1.对外服务组件
对外服务组件表示 MPUSH 服务对外部使用者可见,可以被第三方使用者使用,主要是两个连接管理器:
Socket Server 和 WebSocket Server,分别提供了 Socket 连接通信以及 websocket 连接通信底层管理:例如创建连接对象,检测连接状态,消息装包以及拆包功能。

2.内部功能服务
内部功能服务只有 MPUSH 内部系统可用,不直接对外提供服务,这也是实现 MPUSH 业务功能的组件,下面简单介绍下各个组件功能:

  • RouterCenter:路由中心组件,管理所有连接的路由信息,MPUSH 是分布式架构设计,存在本地路由以及远程路由信息,路由中心组件管理着本地路由以及远程路由信息,连接到本地服务器的连接在路由中心组件中注册本地连接路由信息,同时也注册一份远程路由信息方便系统间信息交换。(路由信息可以理解为通过这个信息可以找到连接对象,通过连接对象服务端就可以给客户端发送信息了)
  • PushCenter:推送中心组件,通过推送中心组件开发者只需要负责创建推送消息(指定推送人群,推送内容),将推送消息交给推送中心组件进行发送。推送中心组件会为每一个推送消息建立推送任务,如果是广播任务(不是推送给一个人的消息),会进行消息流量控制,防止消息流量过载导致系统奔溃。
  • MonitorService:监控服务中心,MPUSH 系统中存在大量线程池以及异步操作,需要对系统性能监控,可用于系统调优,包括 jvm 内存,线程,线程池,系统堆栈,垃圾回收情况,内存泄漏情况等。

3.系统间服务
系统间服务为 MPUSH 服务间通信而设计,在分布式架构下会存在多个 MPUSH 服务节点,各个节点之间需要相互通信,因此提供了 Gateway 网关服务,Gateway 网关服务提供了给 MPUSH 节点发送网关消息,例如在 MPUSH 节点 A 检测到同一个用户在 MPUSH 节点 B 也有路由信息,那么节点 A 发送踢人消息给节点 B(踢人策略可以自己实现),节点 B 接收到网关消息,并且是踢人信息时会执行踢人指令,断开用户连接,这只是一个场景,由于消息类型可以自定义所以我们可以实现一些符合自己业务的功能。
Admin Server 服务提供了控制台服务,可以为管理员提供 MPUSH 系统资源管理服务,目前源码只提供了部分功能,例如查询在线人数,如果要实现中控台服务还需要自己实现。

4.外部服务依赖
zookeeper:分布式协调服务,MPUSH 系统在分布式架构下会存在服务相互发现需求,所以依赖于 zookeeper(当然也可以是其它系统,MPUSH 官方只提供了 zookeeper 接口实现,你也可以依据自己需求使用其它系统,只需要实现发现注册组件接口即可),通过 zookeeper 服务 MPUSH 系统相互之间可以发现服务,然后进行通信
Cache:缓存服务,MPUSH 系统中有许多信息需要缓存,例如路由信息,MPUSH 官方提供了缓存接口,并且提供了 Redis 缓存实现,用户也可以自己实现缓存接口来自定义化组件
MQ:消息队列,MPUSH 系统使用 MQ 来实现消息订阅模式,官方实现了 Redis 消息订阅组件,同样用户也可以自定义 MQ。

上述就是 MPUSH 整体架构的简单介绍,如果你有疑问欢迎加入 QQ 进行交流。在后续的文章中我们将详细分析 MPUSH 组件源码。

源码地址,QQ 交流群:952774305。
博客地址

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...