为自己搭建一个分布式 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…


相关文章
|
29天前
|
存储 网络协议 前端开发
基于开源IM即时通讯框架MobileIMSDK:RainbowChat v11.7版已发布
Android端主要更新内容: 1)[优化] 优化了首页“消息”列表中单聊类型未正确同步时的收发消息和点击后的处理逻辑; 2)[优化] 优化了首页“消息”列表中同一好友和陌生人会话不能自动合并的问题;
49 2
|
1月前
|
存储 自然语言处理 机器人
实战揭秘:当RAG遇上企业客服系统——从案例出发剖析Retrieval-Augmented Generation技术的真实表现与应用局限,带你深入了解背后的技术细节与解决方案
【10月更文挑战第3天】随着自然语言处理技术的进步,结合检索与生成能力的RAG技术被广泛应用于多个领域,通过访问外部知识源提升生成内容的准确性和上下文一致性。本文通过具体案例探讨RAG技术的优势与局限,并提供实用建议。例如,一家初创公司利用LangChain框架搭建基于RAG的聊天机器人,以自动化FAQ系统减轻客服团队工作负担。尽管该系统在处理简单问题时表现出色,但在面对复杂或多步骤问题时存在局限。此外,RAG系统的性能高度依赖于训练数据的质量和范围。因此,企业在采用RAG技术时需综合评估需求和技术局限性,合理规划技术栈,并辅以必要的人工干预和监督机制。
75 3
|
7天前
|
存储 运维 负载均衡
构建高可用性GraphRAG系统:分布式部署与容错机制
【10月更文挑战第28天】作为一名数据科学家和系统架构师,我在构建和维护大规模分布式系统方面有着丰富的经验。最近,我负责了一个基于GraphRAG(Graph Retrieval-Augmented Generation)模型的项目,该模型用于构建一个高可用性的问答系统。在这个过程中,我深刻体会到分布式部署和容错机制的重要性。本文将详细介绍如何在生产环境中构建一个高可用性的GraphRAG系统,包括分布式部署方案、负载均衡、故障检测与恢复机制等方面的内容。
53 4
构建高可用性GraphRAG系统:分布式部署与容错机制
|
16天前
|
移动开发 网络协议 小程序
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v9.1版已发布
RainbowChat是一套基于开源IM聊天框架 MobileIMSDK 的产品级移动端IM系统。RainbowChat源于真实运营的产品,解决了大量的屏幕适配、细节优化、机器兼容问题
47 5
|
26天前
|
消息中间件 中间件 数据库
NServiceBus:打造企业级服务总线的利器——深度解析这一面向消息中间件如何革新分布式应用开发与提升系统可靠性
【10月更文挑战第9天】NServiceBus 是一个面向消息的中间件,专为构建分布式应用程序设计,特别适用于企业级服务总线(ESB)。它通过消息队列实现服务间的解耦,提高系统的可扩展性和容错性。在 .NET 生态中,NServiceBus 提供了强大的功能,支持多种传输方式如 RabbitMQ 和 Azure Service Bus。通过异步消息传递模式,各组件可以独立运作,即使某部分出现故障也不会影响整体系统。 示例代码展示了如何使用 NServiceBus 发送和接收消息,简化了系统的设计和维护。
42 3
|
6天前
|
人工智能 自然语言处理 搜索推荐
选型攻略 | 智能客服系统该怎么选?(好用的智能客服系统推荐)
智能客服系统的选型需要综合考虑渠道功能、系统性能、客服工作管理、客户管理以及成本效益等因素。目前合力亿捷推出的智能知识库,梳理海量知识,根据不同主题对知识进行分类,使其结构更清晰。
24 0
|
7天前
|
人工智能 自然语言处理 安全
AI技术在智能客服系统中的应用与挑战
【10月更文挑战第28天】本文将深入探讨人工智能(AI)技术在智能客服系统中的应用及其面临的挑战。我们将通过实例分析,了解AI如何改善客户服务体验,提高效率和降低成本。同时,我们也将关注AI在实际应用中可能遇到的问题,如语义理解、情感识别和数据安全等,并提出相应的解决方案。
|
1月前
|
消息中间件 存储 监控
【10月更文挑战第2天】消息队列系统中的确认机制在分布式系统中如何实现
【10月更文挑战第2天】消息队列系统中的确认机制在分布式系统中如何实现
|
1月前
|
存储 开发框架 .NET
C#语言如何搭建分布式文件存储系统
C#语言如何搭建分布式文件存储系统
66 2
|
22天前
|
消息中间件 存储 监控
消息队列系统中的确认机制在分布式系统中如何实现?
消息队列系统中的确认机制在分布式系统中如何实现?

热门文章

最新文章