使用 Websockets 代替 RESTful HTTP 有哪些陷阱?

2024-02-09

我目前正在开发一个项目,需要客户端请求一个大作业并将其发送到服务器。然后,服务器划分作业并以一组 url 进行响应,以便客户端进行 GET 调用并流回数据。我是该项目的新手,目前正在使用 Spring websockets 来提高效率。 Websocket 现在将直接联系客户端,而不是客户端不断地 ping 服务器以查看是否有准备好返回的结果!

让 websocket 管理端到端的整个过程是不是一个坏主意?我将 STOMP 与 Spring websockets 结合使用,放弃 REST 还会出现重大问题吗?


使用 RESTful HTTP,您将拥有无状态请求/响应系统客户端发送请求,服务器返回响应。

有了 webSockets,你就有了有状态(或潜在有状态)消息传递系统,消息可以以任何方式发送与 RESTful HTTP 请求/响应相比,发送消息的开销更低。

两者是截然不同的结构,具有不同的优势。

连接的 webSocket 的主要优点是:

  1. 双向通讯。因此,服务器可以随时通知客户端任何事情。因此,客户端可以建立一个 webSocket 并仅侦听来自服务器的任何消息,而不是定期轮询服务器以查看是否有新内容。从服务器的角度来看,当客户端感兴趣的事件发生时,服务器只需向客户端发送一条消息。服务器无法使用纯 HTTP 来执行此操作。

  2. 每条消息的开销更低。如果您预计客户端和服务器之间有大量流量,那么使用 webSocket 时每条消息的开销会较低。这是因为 TCP 连接已经建立,您只需在已经打开的套接字上发送消息即可。对于 HTTP REST 请求,您必须首先建立一个 TCP 连接,该连接在客户端和服务器之间来回多次。然后,您发送 HTTP 请求、接收响应并关闭 TCP 连接。 HTTP 请求必然包括一些开销,例如与该服务器对齐的所有 cookie,即使这些与特定请求无关。如果客户端和服务器都使用 HTTP/2(最新的 HTTP 规范),则可以在这方面实现一些额外的效率,因为单个 TCP 连接可用于多个请求/响应。如果您只是为了发出 https REST 请求/响应而绘制了 TCP 级别上发生的所有请求/响应,那么与仅通过已建立的 webSocket 发送消息相比,您会惊讶地发现发生了多少事情。

  3. 在某些情况下规模更大。由于每条消息的开销较低,并且无需客户端轮询来查找是否有新内容,因此可以提高可扩展性(给定服务器可以服务的客户端数量更多)。 webSocket 可扩展性也有缺点(见下文)。

  4. 有状态连接。无需借助 cookie 和会话 ID,您可以直接将给定连接的状态存储在程序中。虽然很多开发都是使用无状态连接来解决大多数问题,但有时使用有状态连接会更简单。

RESTful HTTP 请求/响应的主要优点是:

  1. 普遍支持。很难得到比 HTTP 更普遍的支持。虽然 webSocket 现在享有相对较好的支持,但在某些情况下仍无法定期提供 webSocket 支持。

  2. 兼容更多服务器环境。有些服务器环境不允许长时间运行服务器进程(某些共享托管情况)。这些环境可以支持 HTTP 请求,但不能支持长时间运行的 webSocket 连接。

  3. 在某些情况下规模更大。webSocket 对持续连接的 TCP 套接字的要求为服务器基础设施增加了一些 HTTP 请求不需要的新规模要求。因此,这最终成为一个权衡空间。如果 webSocket 的优势并不真正需要或未得到广泛使用,那么 HTTP 请求实际上可能会扩展得更好。这绝对取决于具体的使用情况。

  4. 对于一次性请求/响应,单个 HTTP 请求比建立 webSocket、使用它然后关闭它更高效。这是因为打开 webSocket 是从 HTTP 请求/响应开始的,然后在双方都同意升级到 webSocket 连接后,才能发送实际的 webSocket 消息。

  5. 无国籍。如果您的工作没有因拥有无状态基础设施而变得更加复杂,那么无状态世界可以使扩展或故障转移变得更加容易(只需在负载均衡器后面添加或删除服务器进程)。

  6. 自动可缓存。通过正确的服务器设置,浏览器或代理可以缓存 http 响应。对于通过 webSocket 发送的请求,没有这样的内置机制。


因此,为了解决您提出问题的方式:

使用 websocket 代替 RESTful HTTP 有哪些陷阱?

  1. 在大规模(数十万个客户端)下,您可能必须执行一些特殊的服务器工作才能支持大量同时连接的 webSocket。

  2. 所有可能的客户端或工具集都不支持 webSocket 或通过它们发出的请求,其级别与支持 HTTP 请求的级别相同。

  3. 一些较便宜的服务器环境不支持支持 webSocket 所需的长时间运行的服务器进程。

如果您的应用程序将进度通知返回给客户端很重要,您可以使用长时间运行的 http 连接并持续发送进度,也可以使用 webSocket。 webSocket 可能更容易。如果您确实只需要在该特定活动的相对较短的持续时间内使用 webSocket,那么您可能会发现最好的整体权衡是仅在您需要将数据推送到客户端的时间段内使用 webSocket,并且然后使用 http 请求进行正常的请求/响应活动。

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

使用 Websockets 代替 RESTful HTTP 有哪些陷阱? 的相关文章

  • Android 套接字和 HTTP 响应标头

    有趣的是 我可能无意中找到了解决方案是否可以使用普通套接字连接发送 HTTP 请求并接收没有标头的响应 https stackoverflow com questions 8320574 我希望我忽略了一些东西 无论如何 我正在连接到 We
  • 如何解析来自基于 C 的 Web 服务器的 HTTP 请求

    我有一个编程项目 我必须创建一个处理 HTTP 请求的多线程 Web 服务器 我刚刚学习了套接字编程 并且运行了一个客户端和一个服务器 我想知道解析 HTTP 请求标头的最佳方法是什么 我看到了这个 如何用C 解析http请求 https
  • WCF 4.0 REST 上传 MS-Excel 文件

    我正在尝试通过 WCF REST 服务上传 MS Excel 文件 我使用了下面帖子中给出的解决方案 RESTful WCF服务图片上传问题 https stackoverflow com questions 664712 restful
  • 泽西宁静例外

    我面对的是泽西岛 2 7 这是我的服务 package edu srv rest import javax ws rs GET import javax ws rs POST import javax ws rs Path import j
  • 如何用 C 语言通过 HTTP 协议发送图像?

    我是一名正在做网络服务器练习的学生 我需要一些帮助 我的网络服务器在文本页面上运行良好 但是每当浏览器发送一个 GET img jpg HTTP 1 1请求 我不知道如何处理 我听说 HTTP 协议是基于文本的 那么如何在 HTTP 响应中
  • WCF、REST、SSL、客户端、自定义证书验证

    我有一个无法解决的具体问题 让我详细解释一下 我是这项技术的新手 所以我可能使用了一些错误的术语 如有不明白之处 请指正并解释或要求解释 我正在创建一个自托管的 WCF REST 服务器 托管在 WPF 应用程序中 它使用 https SL
  • 使用 Google App Engine 向防火墙后面的设备发起消息

    我想使用 Google App Engine 向位于防火墙 路由器 NAT 后面的设备发起 http 流量 这些设备将接收来自 GAE 的命令 我可以让设备轮询 GAE 来查找新消息 但这会占用大量流量 或者 我可以尝试永久保持打开连接 但
  • Edge浏览器Websocket连接将在空闲时间后自动关闭

    我在新的Window Edge浏览器上做了关于Websocket的测试 看来Edge浏览器上的websocket连接会在空闲时间后自动关闭 没有数据传输b w 2端点 在 Chrome 或 Firefox 上不会出现此问题 我只是好奇 在E
  • Flask Restful API url

    我正在使用 Flask RESTful http flask restful readthedocs org en latest index html http flask restful readthedocs org en latest
  • 开放式 WebSocket 连接存在哪些安全问题?

    我正在构建一个使用 websockets 的应用程序 我只允许经过身份验证的用户在登录并被授予会话 ID 后打开与服务器的 Websocket 连接 一旦我与经过身份验证的用户打开了 Websocket 连接 当前 页面 就会保存打开的 W
  • 在 HTTP PATCH 请求中包含数据的正确方法

    当我组合 HTTP PATCH 请求时 可以选择哪些选项来包含 URL 参数之外的数据 以下任何一项都有效吗 最常见的选择是什么 多部分 表单数据 应用程序 x www form urlencoded Raw JSON 还有其他的吗 HTT
  • Web API GET 请求中的电子邮件地址

    我正在开发在 ASP NET Web API 中实现的 REST API 我们想要支持的一个场景是执行GET通过电子邮件地址请求一些用户信息 理想情况下 客户应该能够执行以下操作 GET api v1 users email your em
  • 在 PHP 中使用 file_get_contents 进行 PUT 请求的错误请求

    这个 api 调用使用 Postman REST 客户端 可以正常工作 但是当我的 GAE 应用程序中的服务器上发出请求时 我当前收到以下错误 HTTP 请求失败 在 C Projects app file php 第 26 行 打开流失败
  • Spring Stomp over Websocket:流式传输大文件

    我的SockJs客户端在网页中 发送帧大小为16K的消息 消息大小限制决定了我可以传输的文件的最大大小 以下是我在文档中找到的内容 Configure the maximum size for an incoming sub protoco
  • 如何在 Android 上的 HttpPost 中发送 unicode 字符

    我试图在我的应用程序中允许多语言支持 这会发出 HTTP post 来上传新消息 我需要做什么才能支持日语和其他非拉丁语语言 我的代码目前看起来像这样 note the msg string is a JSON message by the
  • 如何将 yii2 Restful api 中两个表的关系数据显示为 json 格式

    我遇到了将两个表中的数据显示为 JSON 格式并在 yii2 Restful api 上工作的问题 这是我的结构数据库 TABLE volunteer volunteer id int 11 NOT NULL auto increment
  • 如何将Android中的cURL发送到REST服务

    我是 android 新手 我想从 REST 服务获取一些数据 但在初始化发送到 REST 服务的方法时遇到一些问题 您知道 REST 服务使用 cURL 来操作一些数据 POST PUT GET DELETE 现在如何在 android
  • Playframework websocket 从服务器到浏览器的直播

    我正在尝试使用 playframework 将数据从网络服务器连续流式传输到浏览器 我根据示例创建了示例代码文档 http www playframework org documentation 2 0 3 JavaWebSockets 这
  • 如何使用 PATCH 更新简单的数据库字段?

    我是 php 和 API 的新手 我正在尝试学习这些方法 但我无法执行 PATCH 或 PUT 来更新我的简单 mysql 数据库 我使用了以下代码 if isset PATCH con mysqli connect localhost r
  • 有什么方法可以处理 ASP.Net MVC 中的 Put 和 Delete 动词吗?

    只是想知道是否有人知道真正宁静的 Put delete 实现 asp net mvc Preview 5 最好 查看 mvccontrib 项目 http www mvccontrib org http www mvccontrib org

随机推荐

  • 洗牌算法分析

    我遇到了以下洗牌算法的分析 问 给定一个不同整数的数组 给出一个算法来随机 对整数重新排序 以便每个可能的重新排序都是相等的 可能 换句话说 给定一副牌 你如何洗牌 使得任何牌的排列都是同样可能的 好答案 按顺序遍历元素 将每个元素与 数组
  • Python struct.pack() 用于列表中的各个元素?

    我想将列表中的所有数据打包到单个缓冲区中以通过 UDP 套接字发送 该列表相对较长 因此为列表中的每个元素建立索引非常繁琐 这是我到目前为止所拥有的 NumElements len data buf struct pack d NumEle
  • 如何使用 awk 在文件中的模式后打印 5 个连续行[重复]

    这个问题在这里已经有答案了 我想在文件中搜索模式并在找到该模式后打印 5 行 我需要使用awk为此 例子 文件内容 PATTERN Line1 Line2 Line3 Line4 Line5 如何解析文件并仅打印上述行 我是否使用包含 PA
  • 无需用户服务的 Spring Security X.509 身份验证

    我在我的 Web 应用程序中使用 Spring Security v3 1 3 进行 X 509 身份验证 用户和角色存储在数据库中 但我实际上不需要这样做 因为客户端证书的 CN 符合 ROLE USERNAME 模式 这意味着我已经拥有
  • Javascript 日期验证 (DD/MM/YYYY) 和年龄检查

    我最近开始研究Javascript 我正在测试的是检查 DoB 的有效格式 下一步将检查年龄 我的 HTML 代码包含的内容如下
  • 将 CurrentDirectory 从未提升的脚本传输到提升的脚本

    我需要将文件 manufacturer bmp 复制到与脚本位于同一目录中 在我的闪存驱动器中 system32目录 我成功地获得了变量sourcefile destinationdirectory 并提升我的脚本 但是当我提升它时 我的s
  • ColdFusion:查询中存在多个 SQL 语句?

    显然 ColdFusion 不喜欢单个查询中的多个 SQL 语句 那么这曾经是什么 SET sender user id 3 recipient user id 5 INSERT INTO messages message type sen
  • WCF 双向 HTTP 通信绕过防火墙

    我想使用 WCF 启用双向通信 而无需在客户端上打开端口 我正在开发类似 P2P 应用程序 类似于 teamviewer logmein 的东西 您不需要打开端口进行通信 如何通过 HTTP HTTPS 完成双向通信 而不需要在客户端中打开
  • 比较大型集合的 i4o 与 PLINQ

    我有一个问题想问任何有 i4o 或 PLINQ 经验的人 我有一个大对象集合 大约 400K 需要查询 逻辑非常简单明了 例如 有一个 Person 对象的集合 我需要找到与相同的名字 姓氏 出生日期或名字 姓氏的第一个首字母等匹配的人员
  • Firebase Cloud Functions 模拟器抛出“退出代码:1”错误

    我正在尝试设置本地环境来测试 firebase 云功能 我跟着一起他们的文档 https firebase google com docs functions local emulator但现在遇到以下错误 错误 firestore 模拟器
  • 代码::Blocks/ Dev-c++: 错误: iostream: 没有这样的文件或目录

    我从这里下载了 Code Blocks http www codeblocks org downloads 26 http www codeblocks org downloads 26 我正在学习c编程 当我运行以下程序时 出现错误 io
  • C 中的短整型文字

    为什么 C 中没有短整型文字 在 C 中使用短 int 文字是没有意义的 因为所有整数表达式都会被计算 就好像子表达式的大小至少为 int 一样
  • 输入元素上的 Autocapitalize 属性(用于 iOS)会破坏验证

    可以看出here http www evotech net blog category html Safari 和 iPhone 版 Safari 支持所有 HTML 元素 包括已弃用的元素 甚至一些从未属于任何 W3C 规范的专有元素 它
  • 南非身份证号码验证并获取年龄和性别

    我对此进行了研究 但我使用的代码似乎都不起作用 南非身份证号码包含出生日期和性别 我想要的只是在输入字段中输入他们的 ID 号时提取该信息并验证它 最好是使用 jQuery 或 javascript 任何帮助表示赞赏 Dawid 您可以使用
  • 如何使用geom_vline和geom_histogram r ggplot2从填充比例图例中删除线条

    基本 使用R统计软件ggplot2 geom vline和geom histogram可视化一些数据 问题出在图例键上 我试图从一些随机模拟中绘制一对直方图 并在其之上绘制几条代表确定性模拟结果的线 我已经绘制了数据 但直方图的图例键中间有
  • 具有 AJAX 功能的 jQuery 循环插件

    我有一个页面 其中有多个图片滑块 例如 50 个滑块 每个滑块有 5 10 张图片 不幸的是 由于滑块数量巨大 页面加载速度非常慢 到目前为止 我一直在使用 Malsup 著名的 jQuery Cycle 插件 然而 这缺乏 AJAX 功能
  • 如何在 Visual Studio 2019 中将当前分支与另一个分支进行比较?

    在 Visual Studio 中 假设以下场景 从 master 创建一个分支 做一些改变 Commit 再次进行一些更改 Commit 当我们进行提交时 下面没有显示任何更改团队资源管理器 gt 更改 如果我们不执行第 5 步Chang
  • 为什么 AWS Lambda 无法到达 FunctionHandler?

    I am 首次将 C 应用程序部署到 Lambda 使用 Mac 因此无法使用 Visual StudioAWS 工具包扩展 https marketplace visualstudio com items itemName AmazonW
  • AngularJS 在表单输入上输入指令时不保存模型值

    我在页面上有以下内容 完整代码在此Plunker http plnkr co edit NZMC0Km3pFUBGXgcVopx p preview 有一个习俗onEnter当在聊天表单输入上按 Enter 键时调用函数的指令 下面的代码片
  • 使用 Websockets 代替 RESTful HTTP 有哪些陷阱?

    我目前正在开发一个项目 需要客户端请求一个大作业并将其发送到服务器 然后 服务器划分作业并以一组 url 进行响应 以便客户端进行 GET 调用并流回数据 我是该项目的新手 目前正在使用 Spring websockets 来提高效率 We