架构说明:

1)CIM 中的各个组件均采用 SpringBoot 构建;2)采用 Netty + Google Protocol Buffer 构建底层通信;3)Redis 存放各个客户端的路由信息、账号信息、在线状态等;4)Zookeeper 用于 IM-server 服务的注册与发现。

整体主要由以下模块组成:

1)cim-server——IM 服务端:用于接收 client 连接、消息透传、消息推送等功能。支持集群部署;2)cim-forward-route——消息路由服务器:用于处理消息路由、消息转发、用户登录、用户下线以及一些运营工具(获取在线用户数等);3)cim-client——IM 客户端:给用户使用的消息终端,一个命令即可启动并向其他人发起通讯(群聊、私聊);同时内置了一些常用命令方便使用。

流程解释如下:

1)客户端向 route 发起登录;2)登录成功从 Zookeeper 中选择可用 IM-server 返回给客户端,并保存登录、路由信息到 Redis;3)客户端向 IM-server 发起长连接,成功后保持心跳;4)客户端下线时通过 route 清除状态信息。

所以当我们自己部署时需要以下步骤:

1)搭建基础中间件 Redis、Zookeeper;2)部署 cim-server,这是真正的 IM 服务器,为了满足性能需求所以支持水平扩展,只需要注册到同一个 Zookeeper 即可;3)部署 cim-forward-route,这是路由服务器,所有的消息都需要经过它。由于它是无状态的,所以也可以利用 Nginx 代理提高可用性;4)cim-client 真正面向用户的客户端;启动之后会自动连接 IM 服务器便可以在控制台收发消息了。

这里就设计的比较简单,直接利用 Redis 来存储用户信息;用户信息也只有 ID 和 userName 而已。只是为了方便查询在 Redis 中的 KV 又反过来存储了一份 VK,这样 ID 和 userName 都必须唯一。

具体的流程:

1)登录成功之后需要判断是否是重复登录(一个用户只能运行一个客户端);2)登录成功后需要从 Zookeeper 中获取服务列表(cim-server)并根据某种算法选择一台服务返回给客户端;3)登录成功之后还需要保存路由信息,也就是当前用户分配的服务实例保存到 Redis 中。

为了实现只能一个用户登录,使用了 Redis 中的 set 来保存登录信息;利用 userID 作为 key ,重复的登录就会写入失败。

1)先从 Zookeeper 获取所有的服务实例做一个内部缓存;2)轮询选择一台服务器(目前只有这一种算法,后续会新增)。即时通讯聊天软件app开发可以加小蓝豆的v:weikeyun24咨询即可

当然要获取 Zookeeper 中的服务实例前自然是需要监听 cim-server 之前注册上去的那个节点。

这是一个真正发消息的接口,实现的效果就是其中一个客户端发消息,其余所有客户端都能收到!流程肯定是客户端发送一条消息到服务端,服务端收到后在上文介绍的 SessionSocketHolder 中遍历所有 Channel(通道)然后下发消息即可。服务端是单机倒也可以,但现在是集群设计。所以所有的客户端会根据之前的轮询算法分配到不同的 cim-server 实例中。

由于 Redis 单线程的特质,当数据量大时;一旦使用 keys 匹配所有 cim-route:* 数据,会导致 Redis 不能处理其他请求。所以这里改为使用 scan 命令来遍历所有的 cim-route:*。

接着会挨个调用每个客户端所在的服务端的 HTTP 接口用于推送消息。

之所以说获取在线用户是一个辅助接口,其实就是用于辅助私聊使用的。一般我们使用私聊的前提肯定得知道当前哪些用户在线,接着你才会知道你要和谁进行私聊。

所以私聊接口在收到消息后需要查询到接收者所在的 cim-server 实例信息,后续的步骤就和群聊一致了。调用接收者所在实例的 HTTP 接口下发信息。只是群聊是遍历所有的在线用户,私聊只发送一个的区别。

如何快速开发一套分布式IM系统相关推荐

  1. 拿起键盘就是干:跟我一起徒手开发一套分布式IM系统

    1.引言 老读者应该还记得我在去年国庆节前分享过一篇<技术干货:从零开始,教你设计一个百万级的消息推送系统>,虽然我在文中有贴一些伪代码,依然有些朋友希望能直接分享一些可以运行的源码.好吧 ...

  2. 鹅厂的这波青年,自发搭建了一套分布式大气监测系统

    本文转载自云加社区,原文作者高树磊. 引言 "绿水青山,就是金山银山",随着我国加强立法,大力投入环境治理,大家已经明显感觉到身边的大气环境在不断改善,那么除了国家气象局的城市级监 ...

  3. 开发一套多用户商城系统需要多少钱?

    如果不考虑二次开发,不考虑购买授权, 你可以按人工成本来计算, 比如4个PHP程序员,2个前端程序员,开发6个月, 假设每个程序员平均月薪为8千,算下来就是:(4+2)*8*6=28.8万. 感觉这个 ...

  4. 分布式大气监测系统架构介绍及案例解析

    1 项目背景简介 小能手曾经分享过一篇文章自制一个 LoRa PM2.5 监测器,用于监测自家小区的空气质量.个体的力量是微小的,如果集合更多人的力量,用丰富的大气监测节点来观测区域性的大气质量,相信 ...

  5. R3 Corda:一个为金融服务设计的分布式账本系统

    R3-CEV 因为联结了42家银行金融机构研究区块链,它的一举一动备受瞩目.这次是官方首次披露他们的系统 Corda 的相关细节,Corda 宣称的去「区块链」概念博人眼球,系统设计上确实有许多区别于 ...

  6. Uber 分布式追踪系统 Jaeger 使用介绍和案例【PHP Hprose Go】

    这里写自定义目录标题 Uber 分布式追踪系统 Jaeger 使用介绍和案例[PHP Hprose Go] 1. 前言 2. 分布式系统调用过程 3. [opentracing 协议](http:// ...

  7. 华为吴晟:分布式监控系统的设计与实现

    微服务架构其实就是将单一的应用程序划分成为一组小的服务,其中每个服务都是独立的业务单元,同时又能够被独立开发.运行.测试以及部署.简单来说,它的本质其实就是拆分和独立,这也决定了微服务的部署应该是分布 ...

  8. 有什么好用的低代码快速开发平台?

    上次,有位朋友私信我,需求是想要一款低代码快速开发平台用来做系统项目,要求上手快.操作简单.且支持ERP或进销存等项目系统的快速开发.那位私信的朋友赶紧出来冒个头哈,我现在帮你找到了~ 那这里,本人推 ...

  9. 分布式开发--分布式定时任务

    转自:https://blog.csdn.net/u011955252/article/details/78776851 一:我们先思考下面几个业务场景的解决方案: -  支付系统每天凌晨1点跑批,进 ...

最新文章

  1. 想知道垃圾回收暂停的过程中发生了什么吗?查查垃圾回收日志就知道了!
  2. mac php7 mysql.so_mac下安装php7详解
  3. 面试官问:平常你是怎么对 Java 服务进行调优的?
  4. access中判断回文的代码_LeetCode 第九题 回文数
  5. MySQL索引介绍,普通索引,全文索引,空间索引,多列索引使用原则,建立索引常用的规则
  6. 关于vscode插件autoprefixer 3.0无法使用的问题
  7. 强化学习能挑战众多世界冠军,人类亦能利用强化学习成为冠军
  8. 桥接网络,nat网络,静态IP配置,相关命令
  9. VUE之命令行报错:Component template should contain exactly one root element. If you are using v-if on multi
  10. BootStrap FileInput 插件实现多文件上传前端功能
  11. 嵌入式视频采集编程思路(Video 4 Linux)-转
  12. visio2016专业版2018最新密钥和下载方法 整理
  13. DataBufferLimitException: Exceeded limit on max bytes to buffer :262144
  14. 大盘点|三维视觉与自动驾驶数据集(40个)
  15. SpringBoot+Vue项目的PDF导出及给PDF文件盖章的功能示例
  16. c语言接受mysql中文,C语言连接MySQL中文问题
  17. 如何在vue页面中引入其他的子组件?(局部引入/全局引入)
  18. 前端开发规范:JavaScript 规范
  19. Java第一课学习,开启学习之旅!
  20. AAPT: error: resource android:attr/lStar not found.

热门文章

  1. Unity 实现类似 QQ泡泡堂一样平滑行走的 基于Tile的移动算法
  2. 喜欢计算机网络的原因,喜欢网络的请回答
  3. 全球与中国超高纯度热交换器市场深度研究分析报告
  4. 基于SSM盟校网交流服务平台
  5. python网易云音乐下载打包exe文件,Windows可运行
  6. java面试准备及技巧分享
  7. 技术面试老是有劲使不出,该怎么办? 1
  8. 机架服务器最多有多少cpu,多核心更有劲 四款优秀2U机架服务器推荐
  9. 微信打开网页不能下载的解决
  10. 关于公车上让座的问题