转载:https://www.sohu.com/a/442518130_185201

网页端接收消息,究竟是推还是拉?
什么业务场景?

对于在网页端登录的用户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
    这两种方案的细节不再展开,它们均有一定的局限性。
    更为通用的方式,是“长轮询”。
    长轮询,是通过拼装HTTP短连接来达到长连接的效果,即保证了100%实时,又最大化的系统效率。

    方案三、长轮询

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

  • 这是一条browser发送web-server的HTTP连接
  • 这条连接只能用来收取推送通知
  • 不像普通的“请求-响应”式HTTP请求,这个HTTP会被服务器夯住,直到有推送通知到达,或者超过约定的时间。
  • 画外音:对于HTTP请求,为了提高效率,一般来说brower和web-server都会有一些设置,如果一条HTTP请求长时间没有数据(例如,150秒),会被断开。“通知连接”为了不被broser和web-server粗暴断开,一般会设置一个约定阈值(例如,小于150秒),由系统返回一个空消息,以便“优雅返回”。
    更具体的,对于这条“夯住”与“只收推送通知”的“通知连接”,是怎么玩的呢?

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

  • 发起通知连接,队列里正好有消息
  • 实时把队列里的消息带回
  • 立马再发起通知连接

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

  • 发起通知连接时,队列里无消息
  • 一直等待连接,直到触发“时间阈值”,返回无消息
  • 立马再发起通知连接

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

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


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

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

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

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

网页或pc端收消息,空究竟是推还是拉?相关推荐

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

    出处:网页端收消息,究竟是推还是拉? 任何脱离业务的架构设计都是耍流氓.网页端收消息,究竟是推还是拉? 需求缘起 对于在网页端登录的用户A,发送方,也就是消息的来源有几方面: 系统发给A的" ...

  2. 如何修改PC端微信消息提示音

    在平时工作中大家用的最多的就是微信了,但是PC端的消息提示声音又是一样的,难免会听错.下面就来教大家如何更改微信PC端的提示音: 1.先找到自己喜欢的提示音,然后转换为WAV音频模式,并且更名为118 ...

  3. 使用Python+SmsForwarder实现微信PC端通知消息

    目录 一.目的 二.准备: 三.实现逻辑: 四.具体实现: 五.最终效果图: 针对有全屏且任务栏设置隐藏习惯,但是隐藏任务栏后情况,在电脑上看不到微信PC端新消息的问题进行以下方案解决,前提是电脑为W ...

  4. 群消息已读回执(这个屌),究竟是推还是拉?

    每当发出一条微信消息,都希望对方尽快看到,并尽快回复,但始终不知道对方是否阅读. 每当收到一条不能立马回复的微信消息,都默默返回,假装没看见. 画外音:不想回复的人,唉,你只是个好人. 微信用于个人社 ...

  5. 群消息已读回执,究竟是推还是拉?

    每当发出一条微信消息,都希望对方尽快看到,并尽快回复,但始终不知道对方是否阅读. 每当收到一条不能立马回复的微信消息,都默默返回,假装没看见. 画外音:不想回复的人,唉,你只是个好人. 微信用于个人社 ...

  6. 网页自适应pc端和移动端

    手机的屏幕比较小,宽度通常在600像素以下:PC的屏幕宽度,一般都在1000像素以上(目前主流宽度是1366×768),有的还达到了2000像素.同样的内容,要在大小迥异的屏幕上,都呈现出满意的效果, ...

  7. python+win10toast—实现PC端通知栏消息推送

    import time from win10toast import ToastNotifierdef pc_toast():toaster = ToastNotifier()header = &qu ...

  8. 使用PC端谷歌Chrome浏览器浏览手机网页 修改PC端谷歌Chrome浏览器UA

    废话不多说直接上干货(快下班了): 1.进入你想要审查元素的网站,比如www.baidu.com: 2.按F12召唤开发者窗口: 3.点击下图框出来的三个点: 4.点击下图框出来的选项: 5.将下面框 ...

  9. 绝地求生官网界面网页(pc端)

    绝地求生官网思路 1.实现效果 2.效果与功能显示 3.步骤 *搭建基本结构(3)* *工具条,导航条(1)* *工具条,导航栏内部渲染(1)* *第一屏全屏视频(5)* *菜单条(关联页面)(2)* ...

最新文章

  1. CCTextFieldTTF 与 5种常用CCMenuItem
  2. 开启注册丨NeurlPS 2021论文预讲会议题全公开,4大主题和25场报告等你来
  3. php连接数据库提示could not find driver 问题解决
  4. 求正负数交互序列的和的MFC版
  5. [未解决]jQuery中autocomplete的source格式问题
  6. Windows性能分析器概述(三)
  7. android java判断字符串是否为空和是否是手机号和是否是数字,数字转中文
  8. mono webservice问题请教
  9. css固定姓名显示长度,排列更整齐
  10. Yii2 ActiveForm修改表单样式
  11. win7升级Powershell到5.1(for flutter)
  12. Nacos集群环境搭建
  13. 两面夹定理_故事的两面
  14. 进入ubuntu进入系统时忘记密码了怎么办
  15. 竟然是 300 万的诈骗案!
  16. 信息量和信息熵的理解
  17. Node.js.不要堵塞线程(一)
  18. 斩获iOS美国游戏榜单TOP2 触宝游戏战略进入高速发展轨道
  19. 调用U9系统里的新增杂收服务服务
  20. ubuntu升级到8.10后Realplayer11不能播放的问题

热门文章

  1. 如何把视频文件添加中英文对照字幕
  2. 基于51单片机室内室外环境检测仪控制设计
  3. ResNet改进原理介绍论文笔记
  4. python比赛积分类算法题_Python算法题(一)——青蛙跳台阶
  5. js,addEventListener参数传递
  6. 现代操作系统 第一章
  7. 功能测试技术--边界值分析法
  8. 计算机专业求职自荐书,计算机学专业求职自荐书范文
  9. Linux之用户和权限管理rpm与yum
  10. easyui-combobox的使用