您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

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

时间:2020-07-27 10:52:33  来源:  作者:

任何脱离业务的架构设计都是耍流氓。网页端收消息,究竟是推还是拉?

 

需求缘起

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

 

对于在网页端登录的用户A,发送方,也就是消息的来源有几方面:

  • 系统发给A的“系统通知”,可能对实时性要求没这么高
  • 用户发给A的“聊天消息”,有对实时性要求比较高,越实时越好

 

消息的处理方,也就是系统侧,一般来说:

  • 有服务对消息进行逻辑处理
  • 有数据库对数据进行落地
  • 有缓存对数据进行加速

抛开这些技术细节不谈,暂且认为服务端对每一个用户都有一个“待收消息”的队列,里面存放了需要给这个用户的一切消息。

 

消息的接收方,也就是用户A,如果是在网页端登录,因为HTTP协议是“请求-响应”式的,服务端与网页之间没有消息通道,对于这类“收消息”的需求,是如何处理的呢?

 

方案一、轮询拉取

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

 

轮询拉取,是最容易想到的实现方式:

  • 发送方发送了消息,先入队列
  • 网页端起一个timer,每个一段时间(例如10秒),发起一个轮询请求,拉取队列里的消息
  • 如果队列里有消息,就返回消息
  • 如果队列里无消息,就10秒后再次轮询

 

这种方式的优势是:实现简单,直观且,容易理解,互联网兴起时,人数不多的聊天室就是这么玩的。

画外音:创办于1996年的互联网老站碧海银沙,曾经中国最火爆的聊天室,已于2017.9.27停止运营。

 

缺点也很明显:

  • 实时性差:最坏的情况下,1条消息进入队列后,10s之后才会收到
  • 效率低下:发消息是一个低频动作,如果10次轮询才收到1条消息,请求有效性只有10%,浪费了大量服务器资源

 

更要命的是,在这种方案下,实时性与效率是一对不可调和的矛盾:如果将轮询周期设为1/10,将时延缩短到1秒,意味着100次轮询才会收到1条消息,请求有效性则降为了1%。

 

方案二、建立长连接

如果要兼顾实时性和效率,长连接是最佳之选,PC端聊天软件基本都是使用长连接。网页端常见的实现长连接的方式有两种:

  • WebSocket
  • FlashSocket

这两种方案的细节不再展开,ta们均有一定的局限性。

更为通用的方式,是“长轮询”。

长轮询,是通过拼装HTTP短连接来达到长连接的效果,即保证了消息100%实时,又最大化的系统效率。

 

方案三、HTTP长轮询

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

 

HTTP长轮询的核心在于,浏览器与服务端之间建立了一条“通知连接”,它的特点是:

  • 这是一条browser发往web-server的HTTP连接
  • 这条连接只用来收取推送通知
  • 不像普通的“请求-响应”式HTTP请求,这个HTTP会被服务端夯住,直到有推送通知到达,或者超过约定的时间

画外音:对于HTTP请求,为了提高效率,一般来说browser和web-server都会有一些设置,如果一条HTTP请求长时间没有数据(例如,150秒),会被断开。“通知连接”为了不被browser和web-server粗暴断开,一般会设置一个约定阈值(例如,小于150秒),由系统返回一个空消息,以便“优雅返回”。

 

更具体的,对于这条“夯住”与“只收推送通知”的“通知连接”,是怎么玩的呢?

 

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

 

场景1,发起通知连接时,队列里正好消息,则:

  • 发起通知连接,正好队列里有消息
  • 实时把队列里的消息带回
  • 立马再发起通知连接
网页端收消息,究竟是推还是拉?

 

场景二,发起通知连接时,队列里消息,则:

  • 发起通知连接时,队列里无消息
  • 一直等待,直到触发“时间阈值”,返回无消息
  • 立马再发起通知连接
网页端收消息,究竟是推还是拉?

 

场景三,新消息来时,正好通知连接在,则:

  • 新消息来时,正好有通知连接在
  • 通知连接实时将消息带回
  • 立马再发起通知连接

 

上面三个场景的最终状态,都是“一定,永远,会有一条通知连接,连接在浏览器与服务器之间”,这样就能够保证消息的实时性。当然,有人会说,HTTP的返回与再次发起会有一个时间差,如果这个时间差,恰巧有新消息过来呢?

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

 

场景四,新消息来时,没有通知连接,则:

  • 新消息来时,没有通知连接
  • 把新消息放入队列

 

最后这个场景,发生的概率非常小,但也确保了在“HTTP的返回与再次发起会有一个时间差”内,消息不会丢失,在通知连接发起后,消息能够实时返回。

 

总结

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

  • 最容易想到的是,但实时性和效率是一对无法调和的矛盾
  • 最佳的方式是,但WebSocket和FlashSocket各有局限性
  • 最通用的方式是长轮询,通过HTTP短连接拼装长连接,具体是通过“夯住”“只收推送通知”的“通知连接”来实现的,能够做到消息的实时性到达

 

来源公众号:架构师之路

作者:沈剑



Tags:网页端   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
网页收发消息是一个常见的系统应用场景,通常我们有两种方式来完成消息的发送,一种是通过客户端来拉取消息,一种是服务端推送消息,到底使用哪种方式好一点呢?具体使用哪种方式,我们...【详细内容】
2020-12-31  Tags: 网页端  点击:(194)  评论:(0)  加入收藏
任何脱离业务的架构设计都是耍流氓。网页端收消息,究竟是推还是拉? 需求缘起 对于在网页端登录的用户A,发送方,也就是消息的来源有几方面: 系统发给A的“系统通知”,可能对实时性...【详细内容】
2020-07-27  Tags: 网页端  点击:(57)  评论:(0)  加入收藏
▌简易百科推荐
为了构建高并发、高可用的系统架构,压测、容量预估必不可少,在发现系统瓶颈后,需要有针对性地扩容、优化。结合楼主的经验和知识,本文做一个简单的总结,欢迎探讨。1、QPS保障目标...【详细内容】
2021-12-27  大数据架构师    Tags:架构   点击:(3)  评论:(0)  加入收藏
前言 单片机开发中,我们往往首先接触裸机系统,然后到RTOS,那么它们的软件架构是什么?这是我们开发人员必须认真考虑的问题。在实际项目中,首先选择软件架构是非常重要的,接下来我...【详细内容】
2021-12-23  正点原子原子哥    Tags:架构   点击:(7)  评论:(0)  加入收藏
现有数据架构难以支撑现代化应用的实现。 随着云计算产业的快速崛起,带动着各行各业开始自己的基于云的业务创新和信息架构现代化,云计算的可靠性、灵活性、按需计费的高性价...【详细内容】
2021-12-22    CSDN  Tags:数据架构   点击:(10)  评论:(0)  加入收藏
▶ 企业级项目结构封装释义 如果你刚毕业,作为Java新手程序员进入一家企业,拿到代码之后,你有什么感觉呢?如果你没有听过多模块、分布式这类的概念,那么多半会傻眼。为什么一个项...【详细内容】
2021-12-20  蜗牛学苑    Tags:微服务   点击:(8)  评论:(0)  加入收藏
我是一名程序员关注我们吧,我们会多多分享技术和资源。进来的朋友,可以多了解下青锋的产品,已开源多个产品的架构版本。Thymeleaf版(开源)1、采用技术: springboot、layui、Thymel...【详细内容】
2021-12-14  青锋爱编程    Tags:后台架构   点击:(20)  评论:(0)  加入收藏
在了解连接池之前,我们需要对长、短链接建立初步认识。我们都知道,网络通信大部分都是基于TCP/IP协议,数据传输之前,双方通过“三次握手”建立连接,当数据传输完成之后,又通过“四次挥手”释放连接,以下是“三次握手”与“四...【详细内容】
2021-12-14  架构即人生    Tags:连接池   点击:(16)  评论:(0)  加入收藏
随着移动互联网技术的快速发展,在新业务、新领域、新场景的驱动下,基于传统大型机的服务部署方式,不仅难以适应快速增长的业务需求,而且持续耗费高昂的成本,从而使得各大生产厂商...【详细内容】
2021-12-08  架构驿站    Tags:分布式系统   点击:(23)  评论:(0)  加入收藏
本系列为 Netty 学习笔记,本篇介绍总结Java NIO 网络编程。Netty 作为一个异步的、事件驱动的网络应用程序框架,也是基于NIO的客户、服务器端的编程框架。其对 Java NIO 底层...【详细内容】
2021-12-07  大数据架构师    Tags:Netty   点击:(16)  评论:(0)  加入收藏
前面谈过很多关于数字化转型,云原生,微服务方面的文章。虽然自己一直做大集团的SOA集成平台咨询规划和建设项目,但是当前传统企业数字化转型,国产化和自主可控,云原生,微服务是不...【详细内容】
2021-12-06  人月聊IT    Tags:架构   点击:(23)  评论:(0)  加入收藏
微服务看似是完美的解决方案。从理论上来说,微服务提高了开发速度,而且还可以单独扩展应用的某个部分。但实际上,微服务带有一定的隐形成本。我认为,没有亲自动手构建微服务的经历,就无法真正了解其复杂性。...【详细内容】
2021-11-26  GreekDataGuy  CSDN  Tags:单体应用   点击:(35)  评论:(0)  加入收藏
相关文章
    无相关信息
最新更新
栏目热门
栏目头条