【问题标题】:Websocket vs REST when sending data to server向服务器发送数据时的Websocket vs REST
【发布时间】:2018-01-09 16:09:11
【问题描述】:

背景

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

问题

我的问题很简单。 将数据从客户端发送到服务器 使用 REST 而不是 Websockets 有哪些优点和缺点? (我现在对更新不感兴趣。)

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

【问题讨论】:

标签: rest websocket


【解决方案1】:

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

使用 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 vs rest API for real time data?

Ajax vs Socket.io

根据您的要求添加 cmets:

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

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

【讨论】:

  • 嘿@jfriend00,我们已经有了websockets。 我的问题是关于将数据从客户端发送到服务器。我们应该使用 Websocket 还是 REST,为什么?不过感谢您的尝试。
  • @zatziky - 天啊。我给了你使用 REST 的 8 个理由。如果这些都不适用,那么请坚持使用您的 webSockets - 这几乎就是所有要说的。你还想要什么?您绝对没有提供任何类型的要求(除了没有推送),所以所有这些都是一个通用的练习,用来说明 webSocket 架构和 REST 架构之间的差异。我们无能为力。
  • 是的,你确实写了 8 个理由。正如我所写,我们已经将 Websockets 用于某些功能,因此对于数字 1、2、3、4、5、6、7 甚至 8,我们已经有了解决方案。我们有一个 REST/Websocket 架构。我们只是不知道何时准确地使用 REST 请求或 WS SEND 命令到服务器。在任何情况下,我们都不需要响应,但我不认为它会自动指向 WS。也许一个具体的例子更合适:发送消息到聊天。
  • @zatziky - 听起来你期待有人告诉你“正确”的做法。有理由选择一种方式而不是另一种方式。如果这些原因都没有迫使您选择另一种方式,那么这只是一种架构选择,您必须考虑您正在做的事情的整个背景,并决定哪种架构选择对您更有意义。如果您已经建立了可靠的 webSocket 连接,并且 REST 的任何优势都不适用于您的情况,那么您可以优化“效率”并通过 webSocket 连接将数据发送到服务器。
  • @zatziky - 不,我不接受你从答案中删除所有有用的信息,所以我把它回滚了,我很惊讶你甚至被允许丢弃所有这些信息。那对于阅读此答案的所有其他人来说都是有用的信息,无论您是否同意,这都与您问题的某些部分相关。我不明白您为什么坚持要进行更多编辑。所有信息都在这里。您知道答案。我已经写过很多次了。每个人都很清楚。答案中的附加数据(在您编辑之前)对许多人有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2022-09-28
相关资源
最近更新 更多