webim 实现实时通讯的 4 种方式

简介: webim 实现实时通讯的 4 种方式

本文前半段主要节选自:WebSocket ,后半段总结和概括自沈剑大佬的两篇文章和文章评论http如何像tcp一样实时的收消息?网页端收消息,究竟是推还是拉?,完整参考见文末。

webim 是什么

即时通信(Instant Message,IM),比如 QQ、微信。webim 就是通讯应用的浏览器版本。

webim 实现实时通讯的 4 种方式

1、HTTP

http是一种无状态协议,每次请求和响应就携带有大量的header头,每当一次会话完成后,服务端都不知道下一次的客户端是谁,需要每次知道对方是谁,才进行相应的响应,因此本身对于实时通讯就是一种极大的障碍,而且因为每次都得携带上 header,加大了网络开销和服务端的解析开销,进一步降低了通信效率。

最重要的是,需要客户端主动发,服务端被动发,也就是一次请求,一次响应,服务器无法主动给某个客户端发送数据。

2、long poll(长轮询)

就是客户端发起长轮询,如果服务端的数据没有发生变更,会 hold 住请求,直到服务端的数据发生变化,或者等待一定时间超时才会返回。返回后,客户端又会立即再次发起下一次长轮询。

伪长连接。

优点:

  • 通讯实时性高。服务端数据发生变更后,长轮询结束,立刻返回响应给客户端。
  • 服务端压力小。长轮询的间隔期一般很长,例如 30s、60s,并且服务端 hold 住连接不会消耗太多服务端资源。

3、Ajax轮询

按照一定的频率,每隔一段时间就给服务端发起一次 http 请求,查询有没有新消息,如果有,就返回,如果没有等待相同的时间间隔再次询问。以此实现浏览器跟服务器的近实时通信。

Ajax轮询存在的问题:

  1. 通讯实时性一般,最坏情况下需要等待一个间隔周期才能收到服务端的数据。
  2. 服务端压力较大。频繁的轮询会给服务端造成很大的压力,浪费服务端资源。
  3. 通讯实时性和服务端压力无法中和。加大轮询频率,实时性提高,服务端压力增加;减小轮询频率,服务端压力降低,但是通讯延迟加大,实时性降低。

4、websocket(当前web实时通信的首选技术)

socket 翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。

WebSocket协议是基于 TCP 的一种新的网络协议,和 http 协议一样属于应用层协议,是一种让客户端和服务器之间能进行双向实时通信的技术,实现了“真·长链接”,也就是连接可持久化的意思。(在2008年诞生,2011年成为国际标准,协议标识符是ws,如果加密,则为wss,服务器网址就是 URL)

1456655-20230217004208978-787626327.png

WebSocket有以下特点:

  • 是真正的全双工方式,建立连接后客户端与服务器端是完全平等的,可以互相主动发起请求。而HTTP长连接基于 HTTP,是传统的客户端对服务器发起请求的模式。
  • HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP header(比如cookie,jwt等),信息交换效率很低。Websocket协议通过第一个 request 建立了TCP连接之后,之后交换的数据都不需要发送 HTTP header就能交换数据,因为需要 header 的东西在第一次建立连接时就做完了,后面直接用这个就行。在海量并发及客户端与服务器交互负载流量大的情况下,极大的节省了网络带宽资源的消耗,有明显的性能优势。这显然和原有的HTTP协议有区别所以它需要对服务器和客户端都进行升级才能实现(主流浏览器都已支持HTML5)

问题

问:web实时通讯是怎么实现的?http如何像tcp一样实时的收消息?

通过 long poll 长轮询来实现的。业内主流做法,同时在线量很高很高的webim(比如web qq,百度hi等),基本上都是这样实现的,大部分产品一般有一个comet之类开头的子域名专门提供这个服务。之所以不用 websocket,是因为它需要浏览器和web-server的支持,websocket有些浏览器/web-server不支持

问:长轮询的方式会不会导致 web 服务器的连接数爆掉

现在普通的 web-server 单机都能抗住千级别的连接数,如果需要抗住更多连接,可以通过水平扩展 web 服务器来解决。如果反向代理有瓶颈,则水平扩展反向代理,一般来说,一个 nginx 轻松 hang 住几十万链接。

问:如果上一个 http 连接返回期间,服务器产生了新的消息怎么办?怎么保证下个连接会刚好请求到同个服务器

服务端消息暂存入消息池中,下一个消息连接到达后将消息立刻带回客户端。通过 Nginx 的 ip hash 可以同个用户的连接每次都由同一个服务端机器处理。

问:如果服务端生成消息非常快,长轮询性能是不是比普通轮询性能还低

(1)对于同一个用户(uid),不会一秒钟上百条消息的。(2)如果真的同一个uid消息量非常大,可以在服务端批量返回,以减少交互次数

问:如果用户杀掉了这个app进程,app还是能收到新消息息提醒,怎么实现的?

这个是APP服务驻留的问题

问:每个连接都需要一个线程来处理吗

不需要,每个连接不需要一个线程维持,每个连接只是一个文件,只占有一个收发队列。

问:如果服务端产生新消息的瞬间,连接恰好超时,这样会丢数据吗

不会丢数据,有 ack 机制和本地队列

问:长轮询夯住的请求放在哪,怎么唤醒夯住的请求

夯住的请求放到上下文里,通过 notify 可实时唤醒请求。

问:微信扫码登录、扫码支付,支付成功消息回调也是长轮训

是的

问:有消息返回前,用户关闭browser了应该怎么办

此时消息会不可达,如果消息很重要,需要再存离线。

问:为什么 CS架构 可以实现全双工通信,BS 架构却只能浏览器发起请求

  • BS(browser/Server) 架构的通信协议是 http 。浏览器所有页面共用一个 80 端口,每个页面没有独占的端口号,所以服务器无法主动给某个页面发送数据。
  • CS(Client/Server)架构的通信协议是 WebSocket,每个客户端都独占一个端口号,所以允许服务端主动向客户端推送数据。

完整参考

WebSocket

【星课堂】一文带你了解webSocket

webSocket和Socket之间的区别联系

http如何像tcp一样实时的收消息?

网页端收消息,究竟是推还是拉?

相关文章
|
1月前
|
Web App开发 编解码 监控
RTSP协议探秘:从原理到C++实践,解锁实时流媒体传输之道
RTSP协议探秘:从原理到C++实践,解锁实时流媒体传输之道
115 0
|
7月前
|
Web App开发 开发工具 Android开发
Android平台不需要单独部署流媒体服务如何实现内网环境下一对一音视频互动
我们在做内网环境的一对一音视频互动的时候,遇到这样的技术诉求:如智能硬件场景下(比如操控智能硬件),纯内网环境,如何不要单独部署RTMP或类似流媒体服务,实现一对一音视频互动。
|
8月前
|
编解码 应用服务中间件 nginx
手机直播源码开发,协议讨论篇(三):RTMP实时消息传输协议
通过今天的讨论,大家都不难看出,RTMP协议是手机直播源码平台不可或缺的协议之一,为用户提供了低延迟、高质量的直播体验,也为平台带来了用户,增加了收益。
手机直播源码开发,协议讨论篇(三):RTMP实时消息传输协议
|
9月前
|
数据挖掘
直播平台源码开发,信息收发功能搭建
信息发送消息实现代码 import java.util.ArrayList; import java.util.List; 信息接收消息实现代码 public void receiveMessage() { System.out.println("接收消息:");
直播平台源码开发,信息收发功能搭建
|
JSON 前端开发 网络协议
海量用户通讯系统-服务端结构改进2|学习笔记
快速学习海量用户通讯系统-服务端结构改进2
72 0
|
网络协议 前端开发 测试技术
海量用户通讯系统——服务端结构改进1|学习笔记
快速学习海量用户通讯系统——服务端结构改进1
81 0
海量用户通讯系统——服务端结构改进1|学习笔记
|
数据格式 UED 网络架构
一对一直播系统源码,影响数据传输的网络七层结构
一对一直播系统源码,影响数据传输的网络七层结构
|
域名解析 移动开发 监控
mPaas-MGS服务端架构介绍
移动网关服务(Mobile Gateway Service,MGS)是移动开发平台(mPaaS)提供的连接移动客户端与服务端的组件产品。该组件简化了移动端与服务端的数据协议和通讯协议,能够显著提升开发效率和网络通讯效率。
1721 0
mPaas-MGS服务端架构介绍
|
存储 弹性计算 缓存
直播代码是如何工作的,不同服务器之间的区别
简单来说直播的原理就是把主播录好的内容实时推送到服务器,再由服务器分发给各个用户进行观看。直播发展到如今,由PC端的网页版直播到如今的移动端直播,越来越多直播功能的APP上线,直播的服务器分为很多种类,那么不同的服务器之间有哪些差异呢?本文来为大家简单介绍一下。 服务器在网络中为其它客户机提供计算或者应用服务。服务器具有高速的CPU运算能力、长时间的可靠运行、强大的I/O外部数据吞吐能力以及更好的扩展性。
直播代码是如何工作的,不同服务器之间的区别
|
Web App开发 编解码 网络协议
以网游服务端的网络接入层设计为例,理解实时通信的技术挑战
本文参考并引用了部分腾讯游戏学院的相关技术文章内容,感谢原作者的分享。 1、前言 以现在主流的即时通讯应用形态来讲,一个完整的即时通讯IM应用其实是即时通信(英文简写:IM=Instant messaging)和实时通信(英文简写:RTC=Real-time communication)2种技术组合在一起的一整套网络通信系统。
3596 0