webim如何用轮询保证消息绝对实时

webim如何使用http长轮询保证消息的绝对实时性

一、webim如何实现消息推送 webim通常有三种方式实现推送通道: 1)WebSocket 2)FlashSocket 3)http轮询 其中1)和2)是用Tcp长连接实现的,其消息的实时性很好理解,但这两种方案都存在一些局限性,不通用。 方案3)才算是webim实现消息推送的“正统”方案,用http短连接轮询的方式实现“伪长连接”,既然是轮询,有朋友就对消息的实时性产生了质疑。本文要解答,webim使用http长轮询如何保证消息的绝对实时性。

二、人们为什么会误解http长轮询不实时 什么是轮询?我擦,这个该怎么解释咧。 举个栗子,在火车上想上洗手间,挤到洗手间旁,却发现洗手间有人,于是你只能回座位继续等。过了N分钟,又朝洗手间的方向挤过去,却发现洗手间还是有人,又只能回坐等。这么一而再,再而三的每隔N分钟去洗手间查看洗手间是否有蹲位,这就是轮询。

webim用轮询的方式拉取消息会存在什么问题? webim每隔N分钟,轮询调用 “获取消息”接口,有可能出现消息的延时,某一时刻刚拉取完消息,突然又产生了一条新消息,这条消息就必须等到N分钟之后,再次发起“获取消息”轮询时,才有机会获取到。

减小轮询时间间隔是否能解决消息延时的问题? 减小轮询时间间隔的确可以缩短延时时间,但也不能保证消息绝对的实时,同时又会产生新的问题,绝大部分的轮询调用,都没有消息返回,造成服务端极大的资源浪费。

很多人基于上述直觉,认为webim使用http长轮询的方式拉取消息,会导致消息有延时,其实,webim的http长轮询根本不是这么玩的。

三、长轮询实际怎么玩 消息连接 webim和webserver之间建立一条http连接,专门用作消息通道,这条连接叫http消息连接【见下图】

消息连接的4大特性 1)没有消息到达的时候,这个http消息连接将被夯住,不返回,由于http是短连接,这个http消息连接最多被夯住90秒,就会被断开(这是浏览器或者webserver的行为)

2)在1)的情况下,如果http消息连接被断开,立马再发起一个http消息连接【见下图中的步骤1、2】

3)在1)和2)的配合下,浏览器与webserver之间将永远有一条消息连接在(极限情况下会出现4)),每次收到消息时,这个消息连接就能及时将消息带回浏览器页面,并且在返回后,会立马再发起一个http消息连接【见下图中的步骤1、2、3】

4)如果消息到达时,上一个http消息连接正在返回,没有http消息连接可用(理论上http消息连接的返回是瞬时的,没有连接可用出现的概率极小),则将消息暂存入消息池中,下一个消息连接到达后(上一个消息连接返回后,根据2)和3)会立马返回新的消息连接,无等待时间),将消息带回,并又立刻返回生成新的消息连接【见下图中的步骤1、2、3、4、5、6、7】

上述1-4就能够保证一直有一条http消息连接在,以保证webim消息推送的绝对实时性。

四、结论 webim通过http长轮询可以保证消息的绝对实时性。这种实时性的保证不是通过增加轮询频率来保证的,而是通过夯住http消息连接来保证的,在大部分时间没有实时消息的情况下,这个http消息连接对于webserver的请求压力是90秒1次,能够大大节省了web服务器资源。

下一章,笔者将讨论webim消息的可靠性(如何做到webim消息不丢失、不重复)。

原文发布于微信公众号 - 架构师之路(road5858)

原文发表时间:2015-04-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏性能与架构

分布式协调服务ZooKeeper工作原理

大数据处理框架Hadoop、Redis分布式服务Codis、淘宝的分布式消息中间件MetaMQ …… 他们都使用ZooKeeper做为基础部件,可以看出ZooK...

3598
来自专栏CaiRui

Lvs IP负载均衡技术

Lvs集群的通用结构    Lvs集群采用IP负载均衡技术,属于IP层的交换(L4),具有很好的吞吐率。调度器分析客户端到服务器的IP报头信息,将请求均衡地转移...

3549
来自专栏MongoDB中文社区

MongoDB 4.0 RC 版本强势登陆

MongoDB 因其灵活的文档模型、可扩展分布式设计广受开发者喜爱,在此基础上,MongoDB 4.0 推出了更强大的功能支持,目前4.0第一个RC版本已经发布...

932
来自专栏架构师之路

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

http如何像tcp一样实时的收消息? 一、webim如何实现消息推送 webim通常有三种方式实现推送通道: 1)WebSocket 2)FlashSocke...

37110
来自专栏about云

kafka权威指南 第二章第6节 Kafka集群配置与调优

问题导读: 1 Kafka集群有什么优势? 2 集群中部署多少个节点合适? 3 集群针对系统如何调优? Kafka集群 对于本地的开发工作或者概念性的...

3496
来自专栏IT技术精选文摘

redis架构演变与redis-cluster群集读写方案

redis-cluster是近年来redis架构不断改进中的相对较好的redis高可用方案。本文涉及到近年来redis多实例架构的演变过程,包括普通主从架构(M...

532
来自专栏云计算

基于Go语言使用NATS Streaming构建分布式系统和微服务

一段时间前,我写了一篇名为向 Go 语言开发者介绍 NATS 的博客文章以便使用Apcera NATS 作为基于GO语言的构建分布式系统和微服务的消息系统。在本...

3062
来自专栏前端黑板报

软件工程师需要了解的网络知识:从铜线到HTTP(四)—— TCP 和路由器

JohnLui:程序员,Swift Contributor,正在写《iOS 可视化编程与 Auto Layout》 基础梳理 截至目前,我们已经得到了三个首部:...

2706
来自专栏技巅

Glusterfs之nfs模块源码分析(上)之nfs原理和协议

2016
来自专栏程序员的SOD蜜

分布式系统的消息&服务模式简单总结

分布式系统的消息&服务模式简单总结 在一个分布式系统中,有各种消息的处理,有各种服务模式,有同步异步,有高并发问题甚至应对高并发问题的Actor编程模型,本文尝...

3497

扫码关注云+社区