首页 > 其他分享 >即时消息技术剖析与实战

即时消息技术剖析与实战

时间:2024-04-06 19:33:54浏览次数:20  
标签:实战 接收 即时消息 剖析 IM 消息 推送 服务端 客户端

1.架构与特性:一个完整的IM系统是怎样的?

当服务端有消息需要推送给客户端时,也是将经过业务层处理的消息先递交给接入层,再由接入层通过网络发送到客户端。

此外,在很多基于私有通信协议的IM系统实现中,接入服务还提供协议的编解码工作,编解码实际主要是为了节省网络流量,系统会针对传输的内容进行紧凑的编码(比如Protobuf),为了让业务处理时不需要关心这些业务无关的编解码工作,一般由接入层来处理。

另外,还有session维护的工作很多时候也由接入服务来实现,session的作用是标识“哪个用户在哪个TCP连接”,用于后续的消息推送能够知道,如何找到接收人对应的连接来发送。

2.消息收发架构:为你的App,加上实时通信功能?

 

3.轮询与长连接:如何解决消息的实时到达问题?

短轮询和长轮询之所以没法做到基于事件的完全的“边缘触发(当状态变化时,发生一个IO事件)”,这是因为服务端在有新消息产生时,没有办法直接向客户端进行推送。

这里的根本原因在于短轮询和长轮询是基于HTTP协议实现的,由于HTTP是一个无状态协议,同一客户端的多次请求对于服务端来说并没有关系,也不会去记录客户端相关的连接信息。

因此,所有的请求只能由客户端发起,服务端由于并不记录客户端状态,当服务端接收到新消息时,没法找到对应的客户端来进行推送。

4.ACK机制:如何保证消息的可靠投递?

针对第一部分123,我们通过客户端A的超时重发和IM服务器的去重机制,基本就可以解决问题;针对第二部分4,业界一般参考TCP协议的ACK机制,实现一套业务层的ACK协议。

IM服务器在推送消息时,携带一个标识SID(安全标识符,类似TCP的sequenceId),推送出消息后会将当前消息添加到“待ACK消息列表”,客户端B成功接收完消息后,会给IM服务器回一个业务层的ACK包,包中携带有本条接收消息的SID,IM服务器接收后,会从“待ACK消息列表”记录中删除此条消息,本次推送才算真正结束。

超时重传带来的问题是重复推送消息,需要业务方去重。

消息完整性检查

5.消息序号生成器:如何保证你的消息不会乱序?

单机本地化的时钟或者序号都存在问题,那么如果有一个全局的时钟或者序号是不是就能解决这个问题了呢?所有的消息的排序都依托于这个全局的序号,这样就不存在时钟不同步的问题了。

而且这种“全局序号生成器”可以通过多种方式来实现,常见的比如Redis的原子自增命令incr,DB自带的自增id,或者类似Twitter的snowflake算法、“时间相关”的分布式序号生成服务等。

有了“时序基准”,是不是就能确保消息能按照“既定顺序”到达接收方呢?答案是并不一定能做到。原因在于下面两点。

  1. IM服务器都是集群化部署,每台服务器的机器性能存在差异,因此处理效率有差别,并不能保证先到的消息一定可以先推送到接收方,比如有的服务器处理得慢,或者刚好碰到一次GC,导致它接收的更早消息,反而比其他处理更快的机器更晚推送出去。

  2. IM服务端接收到发送方的消息后,之后相应的处理一般都是多线程进行处理的,比如“取序号”“暂存消息”“查询接收方连接信息”等,由于多线程处理流程,并不能保证先取到序号的消息能先到达接收方,这样的话对于多个接收方看到的消息顺序可能是不一致的。

所以一般还需要端上能支持对消息的“本地整流”。

根据包的ID,对一定时间内的消息做一个整流和排序,这样即使服务端处理多条消息时出现乱序,仍然可以在最终推送给客户端时整流为有序的。

 

在即时消息收发场景中,用于保证消息接收时序的序号生成器为什么可以不是全局递增的?

答: 这是由业务场景决定的,这个群的消息和另一个群的消息在逻辑上是完全隔离的,只要保证消息的序号在群这样的一个局部范围内是递增的即可; 当然如果可以做到全局递增最好,但是会浪费很多的资源,却没有带来更多的收益。

6.HttpDNS和TLS:你的消息聊天真的安全吗?

  1. 消息传输安全性。“访问入口安全”和“传输链路安全”是基于互联网的即时消息场景下的重要防范点。针对“访问入口安全”可以通过HttpDNS来解决路由器被恶意篡改和运营商的LocalDNS问题;而TLS传输层加密协议是保证消息传输过程中不被截获、篡改、伪造的常用手段。

  2. 消息存储安全性。针对账号密码的存储安全可以通过“高强度单向散列算法”和“加盐”机制来提升加密密码可逆性;对于追求极致安全性的即时消息场景并且政策允许的情况下,服务端应该尽量不存储消息内容,并且采用“端到端加密”方式来提供更加安全的消息传输保护。

  3. 消息内容安全性。针对消息内容的安全识别可以依托“敏感词库”“图片识别”“OCR和语音转文字”“外链爬虫抓取分析”等多种手段,并且配合“联动惩罚处置”来进行风险识别的后置闭环。

7.分布式锁和原子性:你看到的未读消息提醒是真的吗?

 

标签:实战,接收,即时消息,剖析,IM,消息,推送,服务端,客户端
From: https://www.cnblogs.com/twh233/p/18117792

相关文章

  • Go 实战|使用 Wails 构建轻量级的桌面应用:仿微信登录界面 Demo
    概述本文探讨Wails框架的使用,从搭建环境到开发,再到最终的构建打包,本项目源码GitHub地址:https://github.com/mazeyqian/go-run-wechat-demo前言Wails是一个跨平台桌面应用开发框架,他允许开发者利用Go的性能优势,并结合任何前端技术栈,如React、Vue或Svelte,来创建桌面应......
  • 实战培训班:AIGC-Stablediffu+PS服装设计-服装设计师的人工智能课(16节)
    课程内容:1_一、先导片:课程介绍及课前准备-认识AI人工智能.mp42_二、Stablediffusion-基础学习-Stablediffusio运行的电脑配置要求.mp43_二、Stablediffusion-基础学习-Stablediffusio安装部署及注意事项.mp44_二、Stablediffusion-基础学习-SD-仙宫云部署.mp45_二、Stabl......
  • Redis从入门到精通(七)Redis实战(四)库存超卖、一人一单与Redis分布式锁
    ↑↑↑请在文章开头处下载测试项目源代码↑↑↑文章目录前言4.3优惠券秒杀4.3.4库存超卖问题及其解决4.3.4.1问题分析4.3.4.2问题解决4.3.5一人一单需求4.3.5.1需求分析4.3.5.2代码实现4.3.5.3并发问题4.3.5.4悲观锁解决并发问题4.3.5.5集群环境下的并发问题......
  • Python实战:天气应用
    1.引言天气应用是现代生活中不可或缺的一部分,它可以帮助我们实时获取天气信息,合理安排出行和活动。通过Python实现天气应用,我们可以加深对编程语言的理解,同时也能够体会到编程带来的便利。2.环境准备在开始编写天气应用之前,我们需要准备以下环境:1)Python环境:确保计......
  • Python实战:文章朗读器
    1.引言朗读器是一种可以帮助我们阅读文本的工具,特别适合那些需要长时间阅读或者视力不佳的用户。通过Python实现朗读器,我们可以加深对编程语言的理解,同时也能够体会到编程带来的便利。2.环境准备在开始编写朗读器之前,我们需要准备以下环境:1)Python环境:确保计算机上......
  • Python实战:键盘记录器
    1.引言键盘记录器是一种可以监控和记录用户键盘输入的工具,通常用于安全测试、数据分析等场景。通过Python实现键盘记录器,我们可以加深对编程语言的理解,同时也能够体会到编程带来的便利。2.环境准备在开始编写键盘记录器之前,我们需要准备以下环境:1)Python环境:确保计......
  • Python实战:将Pdf文件转换为有声读物
    1.引言有声读物是现代生活中不可或缺的一部分,它可以让我们在通勤、健身等场合享受阅读的乐趣。然而,将Pdf文件转换为有声读物需要一定的技术支持。通过Python实现Pdf文件转换为有声读物,我们可以加深对编程语言的理解,同时也能够体会到编程带来的便利。2.环境准备在......
  • 书生浦语第二期实战营——第二课_part2
    这里写目录标题1基于`InternLM2-Chat-7B`运行`Lagent`智能体1.1介绍1.2实践准备运行1.3作业2部署`浦语·灵笔2`模型2.1介绍2.2实践(1)环境配置(2)图文写作(3)图片理解2.3作业(1)图文创作(2)视觉问答正文主要内容:运行Lagent智能体、部署浦语·灵笔2模型B......
  • Java毕业设计-基于SSM框架的高校二手交易平台系统项目实战(附源码+LW+演示视频)
    大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦。......
  • 计算机毕业设计-基于Java+Springboot架构的时装购物系统项目开发实战(附论文+源码)
    大家好!我是职场程序猿,感谢您阅读本文,欢迎一键三连哦。......