《即时消息技术剖析与实战》学习笔记3——IM系统如何保证消息的实时性
IM 技术经历过几次迭代升级,如图所示:

从简单、低效的短轮询逐步升级到相对效率可控的长轮询;
全双工的 Websocket 彻底解决了服务端的推送问题;
基于 TCP 长连接衍生的 IM 协议,能够实现服务端的主动推送。
一、基于HTTP协议的短轮询与长连接
| 短轮询 | 长连接 | |
|---|---|---|
| 场景 | 定期、高频地轮询服务端的新消息。当服务器接到请求后,如果有新消息就将新消息返回给客户端,没有新消息就返回空列表,并关闭连接。即:服务端不管本轮有没有新消息产生,都会马上响应并返回。 | 当本次请求没有获取到新消息时,不会马上返回响应结果,而是在服务端“悬挂(hang)”请求并等待一段时间,一旦这段时间产生新消息,就能马上响应并返回。 |
| 缺点 | 对客户端来说,轮询频率较高,大部分请求是无用的,又费电(功效开销)又费流量(网络开销);对服务端来说,高频的请求会产生较高的 QPS ,并且对后端存储资源造成较大的压力。 | 服务端悬挂住请求,只是降低了入口请求的QPS,并没有减少对后端资源轮询的压力。(假如有1000个请求在等待消息,则可能有1000个线程在不断轮询);长轮询在超时时间内没有获取到消息时会结束返回,仍然没有完全解决客户端无效请求的问题。 |
结论:短轮询与长连接都无法做到基于事件的完全“边缘触发”,这是因为二者都是基于HTTP协议实现的,而HTTP是一个无状态协议,服务端有新消息产生时,无法直接向客户端推送,而客户端向服务端发起多次请求时,服务端也不会记录客户端的状态——所有的请求只能由客户端发起。
二、基于单个TCP连接的双全工通信协议的 Websocket
客户端和服务端只需要完成一次握手,就可以创建持久的长连接,并进行随时、双向的数据传输。
当服务端收到新消息时,可以通过建立的 Websocket 连接,直接进行推送,真正做到“边缘触发”,保证消息的实时性。
优点:
1.支持服务端推送的双向通信,大幅降低服务端轮询压力;
2.数据交互的控制开销低,降低双方通信的网络开销;
3.Web 原生支持,实现相对简单。
三、基于TCP长连接衍生的 IM 协议
在 IM 领域,除了 Websocket 协议,还有 XMPP、MQTT 等通信协议,这些是基于 TCP 长连接衍生的私有协议。
这些私有协议,在用户上线连接时,在服务端维护好连接到服务器的用户设备和具体 TCP 连接的映射关系,并且一旦建立起长连接,就一直存在,除非网络被中断。这样,客户端能随时找到服务端,服务端也能通过这个映射关系随时找到对应在线的用户的客户端。
小结
从简单、低效的短轮询到相对效率可控的长轮询,再到随着HTML5出现的双全工Websocket,再到基于TCP长连接衍生的各种有状态的通信协议,消息实时性随着技术的迭代升级,更加可靠。
《即时消息技术剖析与实战》学习笔记3——IM系统如何保证消息的实时性的更多相关文章
- 《即时消息技术剖析与实战》学习笔记4——IM系统如何保证消息的可靠性
IM 系统中,保证消息的可靠投递主要体现在两方面,一是消息的不丢失,二是消息的不重复. 一.消息不丢失 消息丢失的原因 首先看一下发送消息的流程,如下图所示: 消息.可以采取"时间戳比对&q ...
- 《即时消息技术剖析与实战》学习笔记5——IM系统如何保证消息的一致性
一.什么是消息一致性 消息一致性指的是消息的时序一致性,即消息收发的一致性.如果不能保证时序一致性,就会造成聊天语义不连贯,引起误会. 对于点对点的聊天场景,时序一致性保证接收方的接收顺序和发送方的发 ...
- 《即时消息技术剖析与实战》学习笔记6——IM系统如何保证消息的安全性
在消息产生.流转的各个环节中,需要保证消息传输安全性.消息存储安全性.消息内容安全性. 一.消息传输安全性 消息传输的重要防范点有两个,一是访问入口安全,二是传输链路安全. 1.HttpDNS保证访问 ...
- 《即时消息技术剖析与实战》学习笔记1——IM系统的架构
一.IM的应用场景 聊天.直播.在线客服.物联网等所有需要实时互动.高实时性的场景,都需要应用到 IM 技术.
- 《即时消息技术剖析与实战》学习笔记12——IM系统如何提升图片、音视频消息发送、浏览的体验
IM系统如何提升用户发送.浏览图片和音视频消息的体验呢?一是保证图片.音视频消息发送得又快又稳,二是保证用户浏览播放图片.音视频消息时流畅不卡顿. 一.提升用户发送图片.音视频的体验 1. 多上传接入 ...
- 《即时消息技术剖析与实战》学习笔记11——IM系统如何保证服务高可用:流量控制和熔断机制
IM 系统的不可用主要有以下两个原因: 一是无法预测突发流量,即使进行了服务拆分.自动扩容,但流量增长过快时,服务已经不可用了: 二是业务中依赖的这些接口.资源不可用或变慢时,比如发消息可能需要依赖& ...
- 《即时消息技术剖析与实战》学习笔记7——IM系统的消息未读
一.什么是消息未读 消息未读包括会话未读和总未读.前者指的是当前用户和某一聊天方的未读消息数,后者指的是当前用户的所有未读消息数,也就是所有会话未读的和.比如用户A收到用户B的2条消息,还收到用户C的 ...
- 《即时消息技术剖析与实战》学习笔记8——IM系统如何保证长连接的可用性:心跳机制
假设有以下突发意外情况: 用户进入信号不好的地方,手机没有网络信号了 上网的路由器突然掉线了 这个时候,比如微信发消息,消息就会转圈圈,甚至变成红色叹号-- 上面情况都会导致"长连接&quo ...
- 《即时消息技术剖析与实战》学习笔记9——IM系统如何支持消息的多终端漫游
一.什么是多终端漫游 多终端漫游是指:用户在任意一个设备登录后,都能获取到历史的聊天记录.如:QQ 默认漫游 7 天的聊天记录,开通 VIP 会员可漫游 30 天,开通 SVIP 会员可漫游 2 年. ...
随机推荐
- JVM性能优化简介
01. JVM是什么 概述: 大白话: 全称Java Virtual Machine(Java虚拟机), 它是一个虚构出来的计算机, 通过实际的计算机来模拟 ...
- Docker在Centos 7上的部署
Docker在Centos 7上的部署 方法1---开启centos 7上自带的 extras YUM源,然后 yum install docker来安装 安装前必须保证 Linux Kernel ...
- Flask中before_request与after_request使用
目录 1.前提,装饰器的弊端 2.before_request与after_request 2.1 before_request分析: 2.2 after_request分析: 3.before_re ...
- Natas25-writeup
前言 题目链接: http://natas25.natas.labs.overthewire.org 做这一题花了一些时间,也是由于自己知识点掌握不足,所以分享下解题过程. 题目分析 首先,登录后看到 ...
- POJ 2516Minimum Cost(最小费用流+特判)
[题意]: 有N个人,M个仓库,每个人需要物品,个数都等于共同的K,仓库中有对应的K件物品的数量,随后给K个N*M矩阵(小写k, n, m表示K,N,M对应的子集),表明m个仓库到第n个人的位置运送k ...
- js冒泡排序,快速排序,插入排序
//冒泡排序 function sortBubble(array){ var len=array.length,i,j,tmp; for(i=len-1;i>=1;i--){ ...
- 费马平方和定理&&斐波那契恒等式&&欧拉四平方和恒等式&&拉格朗日四平方和定理
费马平方和定理 费马平方和定理的表述是:奇素数能表示为两个平方数之和的充分必要条件是该素数被4除余1. 1. 如果两个整数都能表示为两个平方数之和的形式,则他们的积也能表示为两个平方数之和的形式. $ ...
- 原生php分页的封装,只封装函数,可适用所有的表
<?php/** * 封装分页函数 * $table [字符串] 表名 * @$size [数字][每页显示条数] */function fenye($table, $size){ $link ...
- Kali系统改国内源配置和SSH配置
一.Kali系统更新源 使用官网的虚拟化镜像安装,默认为英文界面,更新源也是官方源.因为官方服务器在国外,速度不是很理想,现在就来改国内源并且更新系统. 1.使用编辑器打开系统源文本(在终端内操作,先 ...
- nginx 配置参数优化
nginx作为高性能web服务器,即使不特意调整配置参数也可以处理大量的并发请求.以下的配置参数是借鉴网上的一些调优参数,仅作为参考,不见得适于你的线上业务. worker进程 worker_proc ...