Websocket与REST在向服务器发送数据时的区别

16

背景

我们正在开发一款类似 Messenger 的应用程序。我们已经设置了 Websockets 来处理收件箱和聊天。

问题

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

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


@jfriend00 感谢您的帮助,但我对客户端→服务器之间的通信感兴趣,而不是关于实时更新服务器→通信的内容。 - Amio.io
可能是在RESTful HTTP的位置上使用Websockets的陷阱是什么?的重复问题。 - Alexandru Marculescu
可能是websocket vs rest API for real time data?的重复问题。 - David Zemens
1个回答

50

以下是我所了解到的权衡利弊的概要。

使用webSocket的原因:

  1. 您需要/希望对数据进行服务器推送。
  2. 您正在从客户端向服务器发送大量小数据,并且每次都这样做。使用webSocket每个传输的开销明显较小。

使用REST的原因:

  1. 您想使用为REST而构建的服务器端框架或模块,而不是为webSocket构建的(例如auth、速率限制、安全性、流媒体等)。
  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用于实时数据?

Ajax vs Socket.io

根据您的要求添加评论:

听起来你期望有人���诉你哪种方法是“正确”的。选择一种方式而非另一种方式是有原因的。如果没有这些理由让你倾向于一种而非另一种,那么这只是一种架构选择,你必须全面考虑你正在做的事情并决定哪种架构选择更合理。如果你已经有了可靠的webSocket连接,并且REST的所有优点都不适用于你的情况,那么你可以优化“效率”,通过webSocket连接将数据发送到服务器。

另一方面,如果你希望在服务器上有一个简单的API,可以通过其他客户端的Ajax调用到达,那么你希望你的服务器支持通过REST进行这个操作,以便其他客户端最简单地执行这个操作。所以,一切都取决于你的需求将你驱使向哪个方向发展,如果没有特定的驱动原因让你选择其中之一,你就自己做出一个架构选择。


1
嘿@jfriend00,我们已经有了Websockets。我的问题是关于从客户端发送数据到服务器。我们应该使用Websocket还是REST,为什么?但是感谢你的尝试。 - Amio.io
8
@zatziky - 哎呀,我已经给你提供了8个使用REST的理由。如果这些都不适用于你,那就继续使用webSockets吧——这基本上就是所有可以说的了。你还想要什么?你没有提供任何类型的需求(除了不需要推送),所以这只是一个泛泛而谈WebSocket架构和REST架构之间差异的练习。我们没有其他的选择。 - jfriend00
3
@zatziky - 听起来你期望有人告诉你做这件事的“正确”方式。选择一种方式而不是另一种方式有其原因。如果这些原因都不能让你倾向于其中一种,那么这只是一种架构选择,你必须考虑整个上下文并决定哪种架构选择更合理。如果你已经有了可靠的建立的webSocket连接,并且REST的优势都不适用于你的情况,那么你可以优化“效率”,通过webSocket连接将数据发送到服务器。 - jfriend00
10
@zatziky - 不,我不接受你从答案中删除所有有用信息,因此我回滚了它,并且我很惊讶你竟然可以随意删除所有那些信息。对于阅读此答案的其他人来说,所有这些都是有用信息,无论你是否同意,它们都与你的问题的某些部分相关。我不明白为什么你坚持要进行更多编辑。所有信息都在这里。你知道答案。我已经写过多次了。对于许多人来说,答案中的附加数据(在你的编辑之前)非常有用。 - jfriend00
3
绝对不应该删除先前的答案。这正是我在其他网站上找不到的内容。 - Chris Rahmé
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接