当前位置: 首页 > 科技观察

http是如何像tcp一样实时接收报文的呢?

时间:2023-03-13 06:51:25 科技观察

http是如何像tcp那样实时接收报文的?一、webim如何实现消息推送webim通常有三种实现推送通道的方式:1)WebSocket2)FlashSocket3)http轮询1)和2)都是通过Tcp长连接实现的,其消息的实时性可以通过tcp保证。方案3)是webim实现消息推送的“正统”方案。它利用http短连接轮询实现“伪长连接”。由于是轮询,所以有朋友质疑消息的实时性。本文想解答webim如何使用http长轮询来保证消息的绝对实时性。2、为什么会有人误认为http长轮询不是实时的?什么是投票?我擦,这该怎么解释。比如在火车上想上洗手间,你挤到洗手间,却发现洗手间里有人,只能回到座位上等待。N分钟后,我往洗手间的方向挤,却发现洗手间里还有人,只好坐以待毙。就这样周而复始,每隔N分钟就去洗手间看看洗手间有没有蹲点,这就是轮询。webim轮询拉取消息有什么问题?Webim每N分钟轮询一次“获取消息”接口,消息可能会有延迟。某时刻,刚拉完消息,突然出现一条新消息,这条消息必须等到N分钟后,再次发起“获取消息”轮询时,才有机会获取到。减少轮询间隔能解决消息延迟问题吗?减少轮询间隔确实可以缩短延迟时间,但是不能保证消息绝对实时,同时会引发新的问题。查询调用,没有消息返回,造成服务器端资源的巨大浪费。基于以上直觉,很多人认为webim使用http长轮询拉取消息,会造成消息延迟。其实webim的http长轮询根本不是这样的。3.长轮询实际上是如何工作的?消息连接在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消息连接,保证绝对rwebim消息推送的实时性能。4、结语webim通过http长轮询的方式保证了消息的绝对实时性。这种实时性保证不是通过提高轮询频率来保证的,而是通过tampdownhttp消息连接来保证的。当大部分时间没有实时消息时,这个http消息连接对webserver的请求压力是每秒901次,可以大大节省web服务器资源。文章转载自微信公众号《建筑师之路》