当期望服务器端一次性响应时,长轮询与 websocket

2023-11-23

我读过很多关于实时推送通知的文章。总结一下,只要您不关心 100% 的浏览器兼容性,websocket 通常是首选技术。但是,一篇文章指出

长轮询 - 可能当您与以下对象交换单个呼叫时 服务器,服务器正在后台做一些工作。

这正是我的情况。用户按下一个按钮,在服务器端启动一些复杂的计算,一旦答案准备好,服务器就会向客户端发送推送通知。问题是,我们是否可以说,对于一次性响应的情况,长轮询是比 websocket 更好的选择? 或者除非我们担心过时的浏览器支持,并且如果我要从头开始该项目,那么在推送协议方面,websockets 应该始终优先于长轮询?


问题是,我们是否可以说,对于一次性响应的情况, 长轮询是比 websocket 更好的选择吗?

并不真地。长轮询效率低下(多个传入请求,您的服务器必须多次检查长时间运行作业的状态),特别是如果通常的时间段足够长,您将不得不轮询多次。


如果给定的客户端页面只可能执行一次此操作,那么您实际上可以采用任何一种方法。每种机制都有一些优点和缺点。

当响应时间为 5-10 分钟时,您不能假设单个 http 请求将保持活动状态等待响应那么长时间,即使您确保服务器端将保持打开那么长时间。客户端或中间网络设备(代理等)只是不让初始 http 连接保持打开那么长时间。如果你能做到的话,这将是最有效的机制。但是,我认为您不能指望您无法控制的随机网络配置和客户端配置。

因此,这给您留下了几个选项,我认为您已经知道这些选项,但为了其他人的完整性,我将在这里进行描述。

选项1:

  • 与服务器建立 websocket 连接,您可以通过该连接接收推送响应。
  • 发出 http 请求来启动长时间运行的操作。返回操作已成功启动的响应。
  • 一段时间后收到 websocket 推送响应。
  • 关闭 webSocket(假设此页面不会再这样做)。

选项2:

  • 发出 http 请求来启动长时间运行的操作。返回操作已成功启动的响应,并且可能返回某种可用于将来查询的任务 ID。
  • 使用http“长轮询”来“等待”答案。由于这些请求可能会在收到响应之前“超时”,因此您必须定期进行长轮询,直到收到响应。

选项 3:

  • 建立 webSocket 连接。
  • 通过 webSocket 连接发送消息以启动操作。
  • 一段时间后收到操作完成的响应。
  • 关闭 webSocket 连接(假设此页面不再使用它)。

选项 4:

  • 与选项 3 相同,但使用 socket.io 而不是普通的 webSocket 来为您提供心跳和自动重新连接逻辑,以确保 webSocket 连接保持活动状态。

如果您纯粹从网络和服务器效率的角度来看问题,那么选项 3 或 4 可能是最有效的。客户端和服务器之间只有一个 TCP 连接的开销,并且该连接用于所有流量,并且该连接上的流量非常高效并且支持实际推送,因此客户端会尽快收到通知。

从架构的角度来看,我不喜欢选项 1,因为当您使用一种技术发起请求,然后通过另一种技术发送响应时,它看起来有点复杂,并且它要求您在客户端之间创建关联发起传入的 http 请求和连接的 webSocket。这是可以做到的,但需要在服务器上进行额外的记账。选项 2 架构简单,但效率低下(定期轮询服务器),因此它也不是我最喜欢的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当期望服务器端一次性响应时,长轮询与 websocket 的相关文章

随机推荐

  • Android 使用 Zxing 生成二维码和条形码

    使用zxing生成二维码的代码是 它需要字符串数据和imageview这很好用 private void generateQRCode general String data ImageView img throws WriterExcep
  • 将 RGB 颜色值转换为十进制

    如何将 RGB 颜色值转换为纯十进制 所以我有 RGB 255 255 255 是白色其十进制等效值为 16777215 我试过认为这可能只是 var dec r g b but this doesn t work 虽然那不起作用 有人知道
  • 使用实时数据创建闪亮的应用程序

    我正在尝试创建一个闪亮的应用程序来显示实时收集的数据 为此我正在使用invalidateLater 5000 session 定期更新 R 中的数据 这是我的轮廓server R file library shiny library mag
  • 如何使用 BASIC 身份验证从网站注销用户?

    如果用户使用基本身份验证 是否可以从网站注销用户 杀死会话是不够的 因为一旦用户通过身份验证 每个请求都包含登录信息 因此用户下次使用相同的凭据访问站点时会自动登录 到目前为止唯一的解决方案是关闭浏览器 但从可用性的角度来看这是不可接受的
  • 如何让 VBO 使用 Python 和 PyOpenGL

    以下 Python 程序应在窗口的右上象限绘制一个白色三角形 import pygame from OpenGL GL import from ctypes import pygame init screen pygame display
  • Ebnf – 这是 LL(1) 语法吗?

    我发现了以下内容EBNF在维基百科上 描述了 EBNF letter A B C D E F G H I J K L M N O P Q R S T U V W X Y Z digit 0 1 2 3 4 5 6 7 8 9 symbol
  • Java - 旋转数组

    所以目标是向右旋转数组中的元素a次 举个例子 如果a 2 然后array 0 1 2 3 4 会成为array 3 4 0 1 2 这是我所拥有的 for int x 0 x lt array length 1 x array x a ar
  • Java 打印包含整数的字符串

    我有一个疑问 public static void main String args throws IOException int number 1 System out println M number 1 Output M11 但我想把
  • 从 Rails 外部的 HAML 内部渲染 HAML 部分

    我正在使用 HAML 为网站生成一些静态 html 页面 并且我想将公共组件拆分为可以包含在多个页面中的部分 就像在 Rails 中一样 然而 我不想使用整个 Rails 堆栈来执行此操作 因为这看起来有些过头了 我在互联网上环顾四周 但没
  • java中的equals()和运算符“==”

    我知道equals 将比较对象的值 运算符将检查变量是否指向同一内存 我不明白怎么办equals 比较对象的值 例如 class Test public Test int x float y this x x this y y int x
  • 有时,在乒乓球比赛中球不会从球拍上弹起

    我有一个简单的乒乓球游戏 大部分效果都很好 但有时会出现球不弹起球拍的情况 球沿着桨叶摆动和滑动 桨叶似乎用磁力拉动球 如动画所示 每次当球周围的矩形碰撞桨矩形时 球的方向就会改变 if ball colliderect paddleLef
  • 如何从 Python 中的任何应用程序捕获剪贴板事件(相当于 onChangeClipboard)

    我正在研究剪贴板管理器 我当前的问题是成功捕获任何应用程序对剪贴板的修改 例如 从 ctrl c 右键单击并复制到剪贴板 这个想法是Python脚本在后台运行 就像一个恶魔一样 捕捉剪贴板的每一个变化 万分感谢 附 对于了解 autohot
  • SQL grant 在多个对象上执行

    大家好 我想为用户添加多个对象的执行权限 但我似乎无法在代码中添加通配符 GRANT EXECUTE ON OBJECT dbo CREATESERVERSESSIONS TO domain user 这可行 但我有很多以 XU 开头的存储
  • CosmosDB 按值将结果排序到数组中

    我有一些如下所示的 CosmosDB 文档 ProductId 1 Status true Code 123456 IsRecall false ScanLog Location type Point coordinates 13 5957
  • 无法打开登录请求的数据库。登录失败。用户登录失败

    我从我的一台计算机复制了一个数据库并在这里使用它 在尝试打开需要从数据库获取内容的页面时 在 con open 上我收到此异常 无法打开物理文件 E Program Files Microsoft SQL Server MSSQL10 SQ
  • ImportError:DLL 加载失败:动态链接库 (DLL) 初始化例程失败

    我在 Conda 环境中使用 CUDA Toolkit v9 0 和 cuDNNv7 1 以及 Python 3 6 安装了具有 CPU 支持的 TensorFlow 我按照 TensorFlow 网站中描述的说明进行操作 当我尝试时 im
  • 使用异步 chrome.storage 时如何重构全局变量?

    要在迁移到 MV2 事件页面或 MV3 Service Worker 时删除持久 MV2 后台脚本中使用的全局变量 我找到的所有指南都只给出了一个示例 用几行设置替换单个全局变量 然后开始使用chrome storage 但我仍然不清楚如何
  • 使用fragmentStatePagerAdapter更新viewpager中的片段/视图

    需要一些帮助来解决我在使用 viewpager 时更新页面的问题 我正在使用带有 FragmentStatePagerAdapter 的简单视图分页器 我想要做的就是访问当前片段 视图 以便我可以更新片段 视图中的一些文本视图 我在论坛里搜
  • 将 Interlocked.CompareExchange 与类一起使用

    System Threading Interlocked CompareExchange运算符提供比较和交换操作的原子 因此线程安全 C 实现 例如int i 5 Interlocked CompareExchange ref i 10 5
  • 当期望服务器端一次性响应时,长轮询与 websocket

    我读过很多关于实时推送通知的文章 总结一下 只要您不关心 100 的浏览器兼容性 websocket 通常是首选技术 但是 一篇文章指出 长轮询 可能当您与以下对象交换单个呼叫时 服务器 服务器正在后台做一些工作 这正是我的情况 用户按下一