向服务器发送数据时 Websocket 与 REST

2024-01-06

背景

我们正在编写一个类似 Messenger 的应用程序。我们已将 Websockets 设置为收件箱和聊天。

Question

我的问题很简单。什么时候有什么优点和缺点从客户端向服务器发送数据使用 REST 而不是 Websocket? (我现在对更新不感兴趣。)

我们知道 REST 在消息大小方面具有更高的开销,并且 WS 是双工的(因此始终开放)。那么其他我们没有记住的事情呢?


以下是我所知道的权衡的摘要。

使用 webSocket 的原因:

  1. 您需要/想要服务器推送数据。
  2. 您需要定期从客户端向服务器发送大量小数据。使用 webSocket 可以显着减少每次传输的开销。

使用 REST 的原因:

  1. 您想要使用为 REST 而不是为 webSocket 构建的服务器端框架或模块(例如身份验证、速率限制、安全性、流式传输等)。
  2. 您不会经常从客户端向服务器发送数据,因此始终保持 webSocket 连接打开的服务器端负担可能会降低服务器的可扩展性。
  3. 您希望您的客户端在不活动期间长连接 webSocket 可能不可行的地方运行(可能是移动设备)。
  4. 您希望您的客户端在不支持 webSocket 的旧浏览器中运行。
  5. 您希望浏览器强制执行同源限制(这些限制针对 REST Ajax 调用强制执行,但不针对 webSocket 连接强制执行)。
  6. 您不想编写代码来检测 webSocket 连接何时断开,然后自动重新连接并处理回退以及处理电池使用问题等移动问题......
  7. 您需要在存在可能不支持长时间运行的 webSocket 连接的代理或其他网络基础设施的情况下运行。
  8. 如果您想要内置请求/响应。REST 就是请求/响应。 WebSocket 不是——它是基于消息的。来自 webSocket 的响应是通过发回消息来完成的。返回的消息本身并不是对任何特定请求的响应,它只是发送回的数据。如果您想要使用 webSocket 进行请求/响应,那么您必须自己构建一些基础设施,在其中将 id 标记到请求中,并且该特定请求的响应包含该特定 id。否则,如果同时有多个请求,那么您不知道哪个响应属于哪个请求,因为所有数据都通过同一连接发送,并且您将无法将响应与请求进行匹配。
  9. 如果您希望其他客户端能够通过 Ajax 调用来执行此操作。

因此,如果您已经有了 webSocket 实现,并且对 REST 减轻的问题没有任何疑问,并且对 REST 可能更好的任何原因不感兴趣,那么就坚持使用您的 webSocket 实现。

相关参考:

websocket 与 REST API 的实时数据比较? https://stackoverflow.com/questions/28613399/websocket-vs-rest-api-for-real-time-data/28618369#28618369

Ajax 与 Socket.io https://stackoverflow.com/questions/30319618/ajax-vs-socket-io/30334848#30334848

根据您的要求添加评论:

听起来你好像在期待有人告诉你“正确”的做法。选择一种方式而不是另一种方式是有原因的。如果这些原因都没有迫使您采取某种方式与另一种方式相比,那么这只是一种架构选择,您必须考虑您正在做的事情的整个上下文,并决定哪种架构选择对您更有意义。如果您已经建立了可靠的 webSocket 连接,并且 REST 的任何优点都不适用于您的情况,那么您可以优化“效率”并通过 webSocket 连接将数据发送到服务器。

另一方面,如果您希望服务器上有一个简单的 API,可以通过其他客户端的 Ajax 调用来访问,那么您希望您的服务器通过 REST 支持此操作,这样对于其他客户端来说这将是最简单的来执行这一操作。因此,这一切都取决于您的需求驱动您朝哪个方向发展,如果没有特定的驱动原因选择一种方式或另一种方式,您只需自己做出架构选择即可。

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

向服务器发送数据时 Websocket 与 REST 的相关文章

随机推荐

  • 为什么在 try 块中重新声明函数标识符会引发语法错误?

    以下 JavaScript 行 try function free var free 1 finally 导致以下错误 Uncaught SyntaxError Identifier free has already been declar
  • R 中从右到左的语言支持(使用 Mac)

    我想知道在使用 Mac 时是否有支持 R 中从右到左语言的方法 例如假设以下代码 x lt data frame a runif 10 b runif 10 ggplot x aes a b geom point xlab 结果如下 在这里
  • 绑定到静态类实例中的属性

    我想要实现的目标 我有一个 WPF 应用程序 仅用于测试 我想将标签的文本 内容 绑定到某处的属性 这个想法是 当用户选择不同的语言时 该属性值将会改变 当属性更改时 我希望标签文本更新为新值 我尝试过的 我尝试创建一个具有标签值静态属性的
  • 检查 Internet Explorer 中的伪元素

    我有以下伪元素 input type radio selected before 在互联网浏览器中 伪元素根本不显示 所以我决定看一下 我在检查器中找到了选择器 检查器中的选择器将是一本很棒的儿童读物 但是所有属性都被删除了 即覆盖 无效
  • webpack 构建中意外的令牌“导出”

    我收到的错误是 webpack 无法将导出识别为关键字 我已经更新了 babelrc 并安装了必要的依赖项 我确信这与不理解 es6 有关 但我找不到解决我的问题的解决方案 以下是查看我的依赖项 错误和重要文件所需的文件 index scs
  • Google Go 语言中哪些类型是可变的和不可变的?

    在 Google Go 中 我读到字符串是不可变的 好吧 但是是 int 吗 那么其他类型呢 作为一个稍老的程序员 我更喜欢可变性 尽管我知道不变性的好处 但我更喜欢危险地生活 了解哪些类型是可变的或不可变的将非常有帮助 更新 我最关心的是
  • tools/bazel.rc 如何与外部工作区依赖项一起使用?

    如果我将外部 Bazel 项目作为 WORKSPACE 依赖项拉入 并且该项目有一个 tools bazel rc 添加了一些默认构建选项并定义了一些构建 config 选项 那么它到底是如何工作的 构建这些外部构建目标时是否使用这些默认选
  • 如何显示 Cabal 项目的依赖关系树

    我在用cabal v2 build构建一个项目 但它在我不直接依赖的包上不断失败 有没有办法与cabal列出包的所有依赖项 最好以树格式 这样我就可以看到我所依赖的调用构建失败的内容并 希望 摆脱它 Try cabal plan https
  • 如何保存 HTML5 画布?

    目前我正在使用画布2图像 http www nihilogic dk labs canvas2image 保存 HTML5 画布的内容 然而 它似乎不适用于 Google Chrome 欢迎任何有关如何解决该问题的想法 canvas toD
  • 我可以使用委托的单个实例来启动多个异步请求吗?

    只是想知道是否有人可以澄清使用BeginInvoke当您想要进行多个异步调用时 在某个委托的实例上 因为 MSDN 文档根本没有真正涵盖 提及这一点 我想做的是类似以下的事情 MyDelegate d new MyDelegate this
  • 我的表需要更多标准化吗?

    我正在制作一个简单的公共现金簿数据库表来计算我和我的朋友一起吃饭花了多少钱 我的第一个表只是一个表 它有一个具有非原子值的 person 列 所以我将表分成两个表 如上所示 但我不确定这是否足够正常化 是否存在任何应该规范化的功能依赖性 但
  • Google 数据源 JSON 无效吗?

    我正在使用他们的Google数据源来实现Python库 http code google com apis visualization documentation dev gviz api lib html tojsonexample 我希
  • Android 2.3 的 ActionBarCompat 中没有 FEATURE_INDETERMINATE_PROGRESS -

    我在用着 requestWindowFeature Window FEATURE INDETERMINATE PROGRESS setSupportProgressBarIndeterminateVisibility true setSup
  • regsvr32 是否有 .NET 或 Win32 版本?

    regsvr32 是否有 NET 或 Win32 版本 我想用代码注册一个 COM DLL 而不是使用 regsvr32 程序 注册程序集的标准方法是调用导出的DllRegisterServer装配体上的功能 http msdn micro
  • 如何以编程方式重新加载 Visual Studio Code 窗口?

    用户可以通过编辑器的 命令面板 运行 重新加载窗口 来实现此目的 然而 从扩展创作的角度来看 这并不像立即提示用户那么简单 期望的结果是将当前的实施this https github com xabikos vscode javascrip
  • 从 NSOperationQueue 取消 NSOperation 导致崩溃

    我正在尝试构建一个下载管理器类 它将所有异步下载 每个操作都有自己的线程 操作打包到 NSOperation 子类中 以便稍后将它们添加到 NSOperationQueue 中 下载管理器类 单例 还公开了一些方法来处理队列并取消符合某些要
  • 在本地文件夹中安装 gem

    我在使用的共享计算机上的权限有限 因此无法按照习惯的方式安装 gem 例如 gem install request log analyzer ERROR While executing gem Gem FilePermissionError
  • 组合的自定义过滤器

    我正在使用 Webix 用户界面 它允许定义组合控件 如下所示 webix ui view combo options One Two Three 它工作得很好 除了一瞬间 默认情况下 组合按文本统计过滤数据 输入 o 后 组合列表将仅显示
  • 如何将不同的类封装在一个类中并保持其独特的方法? (delphi中的多重继承?)

    我目前正在重写一个免费的教育数字电路模拟器 以为其功能添加惯性 我的问题是如何将事件分派到原始类 并向它们添加预先阐述 我有这样的事情 TC1 class ID integer Connections array integer of Pi
  • 向服务器发送数据时 Websocket 与 REST

    背景 我们正在编写一个类似 Messenger 的应用程序 我们已将 Websockets 设置为收件箱和聊天 Question 我的问题很简单 什么时候有什么优点和缺点从客户端向服务器发送数据使用 REST 而不是 Websocket 我