首页 文章 精选 留言 我的

精选列表

搜索[IM通道],共7060篇文章
优秀的个人博客,低调大师

为自己搭建一个分布式 IM 系统二【从查找算法聊起】

前言 最近这段时间确实有点忙,这篇的目录还是在飞机上敲出来了的。 言归正传,上周更新了 cim 第一版;没想到反响热烈,最高时上了 GitHub Trending Java 版块的首位,一天收到了 300+ 的 star。 现在总共也有 1.3K+ 的 star,有几十个朋友参加了测试,非常感谢大家的支持。 在这过程中也收到一些 bug 反馈,feature 建议;因此这段时间我把一些影响较大的 bug 以及需求比较迫切的 feature 调整了,本次更新的 v1.0.1 版本: 客户端超时自动下线。 新增 AI 模式。 聊天记录查询。 在线用户前缀模糊匹配。 下面谈下几个比较重点的功能。 客户端超时自动下线 这个功能涉及到客户端和服务端的心跳设计,比较有意思,也踩了几个坑;所以准备留到下次单独来聊。 AI 模式 大家应该还记得这个之前刷爆朋友圈的 估值两个一个亿的 AI 核心代码。 和我这里的场景再合适不过了。 于是我新增了一个命令用于一键开启 AI 模式,使用情况大概如下。 欢迎大家更新源码体验,融资的请私聊我🤣。 聊天记录 聊天记录也是一个比较迫切的功能。 使用命令 :q 关键字 即可查询与个人相关的聊天记录。 这个功能其实比较简单,只需要在消息发送及接收消息时保存即可。 但要考虑的一点是,这个保存消息是 IO 操作,不可避免的会有耗时;需要尽量避免对消息发送、接收产生影响。 异步写入消息 因此我把消息写入的过程异步完成,可以不影响真正的业务。 实现起来也挺简单,就是一个典型的生产者消费者模式。 主线程收到消息之后直接写入队列,另外再有一个线程一直源源不断的从队列中取出数据后保存聊天记录。 大概的代码如下: 写入消息的同时会把消费消息的线程打开: 而最终存放消息记录的策略,考虑后还是以最简单的方式存放在客户端,可以降低复杂度。 简单来说就是根据当前日期+用户名写入到磁盘里。 当客户端关闭时利用线程中断的方式停止了消费队列的线程。 这点的设计其实和 logback 写日志的方式比较类似,感兴趣的可以去翻翻 logback 的源码,更加详细。 回调接口 至于收到其他客户端发来的消息时则是利用之前预留的消息回调接口来写入日志。 收到消息后会执行自定义的回调接口。 于是在这个回调方法中实现写入逻辑即可,当后续还有其他的消息处理逻辑时也能在这里直接添加。 当处理逻辑增多时最好是改为责任链模式,更加清晰易维护。 查找算法 接下来是本文着重要讨论的一个查找算法,准确的说是一个前缀模糊匹配的算法。 实现的效果如下: 使用命令 :qu prefix 可以按照前缀的方式搜索用户信息。 当然在命令行中其实意义不大,但是在移动端中确是比较有用的。类似于微信按照用户名匹配: 因为后期打算出一个移动端 APP,所以就先把这个功能实现了。 从效果也看得出来:就是按照输入的前缀匹配字符串(目前只支持英文)。 在没有任何限制的条件下最快、最简单的实现方式可以直接把所有的字符串存放在一个容器中 (List、Set),查询时则挨个遍历;利用 String.startsWith("prefix") 进行匹配。 但这样会有几个问题: 存储资源比较浪费,不管是 list 还是 Set 都会有额外的损耗。 查询效率较低,需要遍历集合后再遍历字符串的 char 数组(String.startsWith 的实现方式)。 字典树 基于以上的问题我们可以考虑下: 假设我需要存放 java,javascript,jsp,php 这些字符串时在 ArrayList 中会怎么存放? 很明显,会是这样完整的存放在一个数组中;同时这个数组还可能存在浪费,没有全部使用完。 但其实仔细观察这些数据会发现有一些共同特点,比如 java,javascript 有共同的前缀 java;和 jsp 有共同的前缀 j。 那是否可以把这些前缀利用起来呢?这样就可以少存储一份。 比如写入 java,javascript 这两个字符串时存放的结构如下: 当再存入一个 jsp 时: 最后再存入 jsf 时: 相信大家应该已经看明白了,按照这样的存储方式可以节省很多内存,同时查询效率也比较高。 比如查询以 jav 开头的数据,只需要从头结点 j 开始往下查询,最后会查询到 ava 以及 script 这两个个结点,所以整个查询路径所经历的字符拼起来就是查询到的结果java+javascript。 如果以 b 开头进行查询,那第一步就会直接返回,这样比在 list 中的效率高很多。 但这个图还不完善,因为不知道查询到啥时候算是匹配到了一个之前写入的字符串。 比如在上图中怎么知道 j+ava 是一个我们之前写入的 java 这个字符呢。 因此我们需要对这种是一个完整字符串的数据打上一个标记: 比如这样,我们将 ava、script、p、f 这几个节点都换一个颜色表示。表明查询到这个字符时就算是匹配到了一个结果。 而查到 s 这个字符颜色不对,代表还需要继续往下查。 比如输入关键字 js 进行匹配时,当它的查询路径走到 s 这里时判断到 s 的颜色不对,所以不会把 js 作为一个匹配结果。而是继续往下查,发现有两个子节点 p、f 颜色都正确,于是把查询的路径 jsp 和 jsf 都作为一个匹配结果。 而只输入 j,则会把下面所有有色的字符拼起来作为结果集合。 这其实就一个典型的字典树。 具体实现 下面则是具体的代码实现,其实算法不像是实现一个业务功能这样好用文字分析;具体还是看源码多调试就明白了。 谈下几个重点的地方吧: 字典树的节点实现,其中的 isEnd 相当于图中的上色。 利用一个 Node[] children 来存放子节点。 为了可以区分大小写查询,所以子节点的长度相当于是 26*2。 写入数据 这里以一个单测为例,写入了三个字符串,那最终形成的数据结构如下: 图中有与上图有几点不同: 每个节点都是一个字符,这样树的高度最高为52。 每个节点的子节点都是长度为 52 的数组;所以可以利用数组的下标表示他代表的字符值。比如 0 就是大 A,26 则是小 a,以此类推。 有点类似于之前提到的布隆过滤器,可以节省内存。 debug 时也能看出符合上图的数据结构: 所以真正的写入步骤如下: 把字符串拆分为 char 数组,并判断大小写计算它所存放在数组中的位置 index。 将当前节点的子节点数组的 index 处新增一个节点。 如果是最后一个字符就将新增的节点置为最后一个节点,也就是上文的改变节点颜色。 最后将当前节点指向下一个节点方便继续写入。 查询总的来说要麻烦一些,其实就是对树进行深度遍历;最终的思想看图就能明白。 所以在 cim 中进行模糊匹配时就用到了这个结构。 字典树的源码在此处: https://github.com/crossoverJie/cim/blob/master/cim-common/src/main/java/com/crossoverjie/cim/common/data/construct/TrieTree.java 其实利用这个结构还能实现判断某个前缀的单词是否在某堆数据里、某个前缀的单词出现的次数等。 总结 目前 cim 还在火热内测中(虽然群里只有20几人),感兴趣的朋友可以私聊我拉你入伙☺️ 再没有新的 BUG 产生前会着重把这些功能完成了,不出意外下周更新 cim 的心跳重连等机制。 完整源码: https://github.com/crossoverJie/cim 如果这篇对你有所帮助还请不吝转发。

优秀的个人博客,低调大师

终端数据出口收敛实践:USB、打印、网盘七类通道的管控设计与灰度

客户的图纸加密体系是完整的——透明加密、安全区域、密级全都配了,加密日志一条没断。但一个月后,竞品手上还是出现了同一套图纸。查到最后,路径特别朴素:一名有权限的设计师打开图纸,用手机对着屏幕拍了几张照片。加密文件从头到尾没被解密过,整个加密体系「完好无损」,因为对方本来就有权限,操作全是「合法」的。

优秀的个人博客,低调大师

分布式监控平台 WGCLOUD v3.4.4 全新发布 支持多通道下发指令

WGCLOUD是一款集成度较高的分布式运维监控平台,具有集群监控,易部署、易上手使用、轻量、高效、自动化等特点,server 端基于springboot 开发,agent 端使用 go 编写。核心模块包括:主机系统信息监控,CPU 监控,CPU 温度监控,内存监控,网络流量监控,磁盘 IO 监控,磁盘空间监测,系统负载监控,硬盘 smart 健康检测,应用进程监控,端口监控,docker 监控,日志文件监控,文件防篡改保护,数据可视化监控,自动生成拓扑图、大屏可视化,数通设备监测,服务接口监测,web ssh 堡垒机,指令下发,告警信息(邮件、钉钉、微信等)推送。 码云仓库:https://gitee.com/wanghouhou/wgcloud GITHUB 仓库:https://github.com/tianshiyeben/wgcloud WGCLOUD 唯一官网:http://www.wgstart.com WGCLOUD 支持监测的操作系统平台 支持监测 Linux 系列:Debian、RedHat、CentOS、Ubuntu、Fedora、麒麟、统信 (UOS)、龙芯 (mips) 等 支持监测 Windows 系列:Windows Server 2008 R2,2012,2016,2019,2022,Windows 7,Windows 8,Windows 10,Windows 11 支持监测 Unix 系列:solaris,FreeBSD,OpenBSD 支持监测 MacOS 系列:macOS amd64,macOS arm64 其他支持:ARM,Android(安卓),riscv64,s390x,树莓派等 WGCLOUD-v3.4.4 更新说明 1.新增,服务接口监测,增加采集响应body体积大小 2.新增,指令下发和自定义监控项模块,支持同时下发多条指令 3.新增,FTP/SFTP,服务接口,数通监测列表添加开始监控和停止监控按钮 4.新增,成员账号增加迁移功能,可以将某个账号的所有监控资源迁移到其他账号 5.新增,公众看板的监控概要和主机列表页面,可以设置自动刷新(10分钟一次),查看说明 6.bug修复,删除成员账号时候,同时解绑该账号的主机、服务接口、PING、SNMP、数据库、FTP的账号信息 7.bug修复,snmp列表搜索跳转到ping列表 8.bug修复,主机列表按照cpu%,内存%排序不准确的问题 9.改造,指令下发、自定义监控项、服务接口、数据监控、日志监控模块,原文本域改造为在线代码编辑器(主要用于语法高亮显示) 10.改造,数通拓扑图菜单,拆分为PING拓扑图和SNMP拓扑图 11.优化,主机判定下线机制更灵敏 12.优化,主机图表中增加显示告警线 13.优化,数据开放接口:主机列表、主机CPU使用率、主机内存使用率、主机系统负载、主机系统网络流量等接口,增加排序参数 14.优化改进,日志监控模块性能,主要针对监控体积较大的日志文件时候自动优化,保护系统性能 15.一些已知的bug修复,优化UI,代码结构优化

优秀的个人博客,低调大师

单通道 Go WebRTC服务端拉流接口无响应导致程序堵塞,如何处理?

我们在通过GO语言开发webrtc服务时,使用js进行摄像头推流调用go服务端http,交换sdp信息,先把摄像头流推到服务端进行webrtc交互,再调用另外go http服务进行拉流。 第一次进行http拉流,webrtc 会话描述进行过交换,但是测试期间我们发现,如果此时再打开浏览器进行http 会话描述,go服务端会卡住,导致浏览器等段时间会超时错误。 此处的流程应该是下面这样的: 1、Go 中webrtc拿到的流会放到一个全局变量中,如下: 2、通过go的接口交换会话描述,再使用webrtc回调函数方法,拿到流就往里面写数据。 问题就出在第二步,我们在使用拉流接口时也是交换会话描述,从第二步中go写流数据的接口拿到流,这样浏览器在进行拉流操作时,接口无响应,导致浏览器超时。 找到问题,解决问题也比较简单,把go保存的流开个线程,一直往里写数据,这样就不会造成堵塞了。 我们开发的webrtc-client就已经经过了多次测试,在现有的视频播放平台上有了新的飞跃,而新型的与WebRTC相结合的EasyScreenLive同屏服务将在视频播放的流畅度和延时方面有更加优越的体现,大家可以通过关注Github获得我们的技术动态。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册