为自己搭建一个分布式 IM(即时通讯) 系统(下)

简介: CIM(CROSS-IM) 一款面向开发者的 IM(即时通讯)系统;同时提供了一些组件帮助开发者构建一款属于自己可水平扩展的 IM 。 借助 CIM 你可以实现以下需求: IM 即时通讯系统。 适用于 APP 的消息推送中间件。 IOT 海量连接场景中的消息透传中间件。 完整源码托管在 GitHub : github.com/crossoverJi…

在线用户接口


这是一个辅助接口,可以查询出当前在线用户信息。



实现也很简单,也就是查询之前保存 ”用户登录状态的那个去重 set “即可。


私聊接口


之所以说获取在线用户是一个辅助接口,其实就是用于辅助私聊使用的。


一般我们使用私聊的前提肯定得知道当前哪些用户在线,接着你才会知道你要和谁进行私聊。


类似于这样:



在我们这个场景中,私聊的前提就是需要获得在线用户的 userID



所以私聊接口在收到消息后需要查询到接收者所在的 cim-server 实例信息,后续的步骤就和群聊一致了。调用接收者所在实例的 HTTP 接口下发信息。


只是群聊是遍历所有的在线用户,私聊只发送一个的区别。


下线接口


一旦客户端下线,我们就需要将之前存放在 Redis 中的一些信息删除掉(路由信息、登录状态)。



IM 客户端



客户端中的一些逻辑其实在上文已经谈到一些了。


登录


第一步也就是登录,需要在启动时调用 route 的登录接口,获得 cim-server 信息再创建连接。



登录过程中 route 接口会判断是否为重复登录,重复登录则会直接退出程序。



接下来是利用 route 接口返回的 cim-server 实例信息(ip+port)创建连接。


最后一步就是发送一个登录标志的信息到服务端,让它保持客户端和 Channel 的关系。



自定义协议


上文提到的一些登录报文、真正的消息报文这些其实都是在我们自定义协议中可以区别出来的。


由于是使用 Google Protocol Buffer 编解码,所以先看看原始格式。



其实这个协议中目前一共就三个字段:


  • requestId 可以理解为 userId


  • reqMsg 就是真正的消息。


  • type 也就是上文提到的消息类别。


目前主要是三种类型,分别对应不同的业务:



心跳


为了保持客户端和服务端的连接,每隔一段时间没有发送消息都需要自动的发送心跳。

目前的策略是每隔一分钟就是发送一个心跳包到服务端:



这样服务端每隔一分钟没有收到业务消息时就会收到 ping 的心跳包:



内置命令


客户端也内置了一些基本命令来方便使用。


命令 描述
:q 退出客户端
:olu 获取所有在线用户信息
:all 获取所有命令
: 更多命令正在开发中。。



比如输入 :q 就会退出客户端,同时会关闭一些系统资源。



当输入 :olu(onlineUser 的简写)就会去调用 route 的获取所有在线用户接口。



群聊


群聊的使用非常简单,只需要在控制台输入消息回车即可。


这时会去调用 route 的群聊接口。



私聊


私聊也是同理,但前提是需要触发关键字;使用 userId;;消息内容 这样的格式才会给某个用户发送消息,所以一般都需要先使用 :olu 命令获取所以在线用户才方便使用。



消息回调


为了满足一些定制需求,比如消息需要保存之类的。


所以在客户端收到消息之后会回调一个接口,在这个接口中可以自定义实现。



因此先创建了一个 callerbean,这个 bean 中包含了一个

CustomMsgHandleListener 接口,需要自行处理只需要实现此接口即可。


自定义界面


由于我自己不怎么会写界面,但保不准有其他大牛会写。所以客户端中的群聊、私聊、获取在线用户、消息回调等业务(以及之后的业务)都是以接口形式提供。


也方便后面做页面集成,只需要调这些接口就行了;具体实现不用怎么关心。


总结


cim 目前只是第一版,BUG 多,功能少(只拉了几个群友做了测试);不过后续还会接着完善,至少这一版会给那些没有相关经验的朋友带来一些思路。


后续计划:



完整源码:


github.com/crossoverJi…


相关文章
|
2月前
|
机器学习/深度学习 自然语言处理 搜索推荐
深度分析 | 2024主流的智能客服系统有哪些?他们是怎么实现的?
本文深入探讨了智能客服系统的使用方法和相关技术实现逻辑,涵盖前端交互、服务接入、逻辑处理、数据存储四大层面,以及自然语言处理、机器学习、语音识别与合成、数据分析与挖掘、知识库管理和智能推荐系统等核心技术,帮助企业更好地理解和应用智能客服系统,提升服务效率和客户满意度。
352 1
|
4天前
|
人工智能 自然语言处理 安全
2025最新排名|盘点值得推荐的5个在线客服系统
在数字化浪潮下,在线客服系统迅速发展,成为企业提升竞争力的关键。本文推荐五款2025年值得使用的在线客服系统:合力亿捷、淘宝、京东、华为云和中国移动客服系统。它们各自具备全渠道接入、智能问答、数据分析、高稳定性等亮点,助力企业高效服务客户,优化营销策略并提升整体运营效率。
45 24
|
21天前
|
机器学习/深度学习 存储 人工智能
AI实践:智能工单系统的技术逻辑与应用
智能工单系统是企业服务管理的核心工具,通过多渠道接入、自然语言处理等技术,实现工单自动生成、分类和分配。它优化了客户服务流程,提高了效率与透明度,减少了运营成本,提升了客户满意度。系统还依托知识库和机器学习,持续改进处理策略,助力企业在竞争中脱颖而出。
61 5
|
25天前
|
存储 运维 安全
盘古分布式存储系统的稳定性实践
本文介绍了阿里云飞天盘古分布式存储系统的稳定性实践。盘古作为阿里云的核心组件,支撑了阿里巴巴集团的众多业务,确保数据高可靠性、系统高可用性和安全生产运维是其关键目标。文章详细探讨了数据不丢不错、系统高可用性的实现方法,以及通过故障演练、自动化发布和健康检查等手段保障生产安全。总结指出,稳定性是一项系统工程,需要持续迭代演进,盘古经过十年以上的线上锤炼,积累了丰富的实践经验。
|
28天前
|
存储 分布式计算 Hadoop
基于Java的Hadoop文件处理系统:高效分布式数据解析与存储
本文介绍了如何借鉴Hadoop的设计思想,使用Java实现其核心功能MapReduce,解决海量数据处理问题。通过类比图书馆管理系统,详细解释了Hadoop的两大组件:HDFS(分布式文件系统)和MapReduce(分布式计算模型)。具体实现了单词统计任务,并扩展支持CSV和JSON格式的数据解析。为了提升性能,引入了Combiner减少中间数据传输,以及自定义Partitioner解决数据倾斜问题。最后总结了Hadoop在大数据处理中的重要性,鼓励Java开发者学习Hadoop以拓展技术边界。
47 7
|
28天前
|
人工智能 自然语言处理 搜索推荐
年度评选 | 2024年客服系统6大品牌
在2024年的客服系统市场中,合力亿捷等服务商品牌展现了各自在技术研发、产品创新和行业应用等方面的卓越实力。
50 1
|
1月前
|
安全 UED
IM系统在体育直播网站中的重要性
IM(即时通讯)系统在体育直播平台中至关重要,提升用户体验、促进社交互动和增强平台活跃度。它支持实时互动、增强观赛氛围、构建社交网络、推送即时信息、创造商业价值并提供多元化互动体验。高并发性能、实时稳定性和用户安全是实现的关键。通过集成IM系统,平台能更好地满足观众互动需求,提升运营效益。 代码示例展示了如何在比赛数据响应中设置比赛ID、游戏ID、系列赛ID等基本信息,并检查是否有计划和关注标记。
|
2月前
|
存储 人工智能 运维
最新榜单 | 盘点2024年10大主流工单系统
随着互联网的发展,工单系统因其多样化功能和高效管理能力,成为企业运营的重要工具。本文介绍了10大主流工单系统,包括合力亿捷、阿里云服务中台、华为云ROMA ServiceCore等,它们各具特色,帮助企业提升服务质量和运营效率,实现数字化转型。
99 7
|
2月前
|
机器学习/深度学习 存储 运维
分布式机器学习系统:设计原理、优化策略与实践经验
本文详细探讨了分布式机器学习系统的发展现状与挑战,重点分析了数据并行、模型并行等核心训练范式,以及参数服务器、优化器等关键组件的设计与实现。文章还深入讨论了混合精度训练、梯度累积、ZeRO优化器等高级特性,旨在提供一套全面的技术解决方案,以应对超大规模模型训练中的计算、存储及通信挑战。
107 4
|
3月前
|
自然语言处理 数据可视化 搜索推荐
构建一个基于通义千问的智能客服系统
公司开发一个智能客服系统,帮助用户快速找到他们需要的商品信息、解决问题,并提供个性化的购物建议。系统需要能够处理大量的用户提问,并以自然语言的形式给出准确的回答。
197 1