SPA应该使用Ajax还是socket.io?

时间:2015-11-07 12:51:24

标签: node.js single-page-application

浏览GitHub存储库,我经常看到使用Ajax而不是socket.io的SPA实现。令我感到惊讶的是,我认为socket.io的实现速度应该更快(因此每次更改路径时都不必打开连接),从而提供更好的用户体验。或者我会错过什么?基于Ajax的SPA有什么优势吗?

2 个答案:

答案 0 :(得分:3)

此决定完全取决于您的要求,应该。它甚至不是......或者"决定,在某些情况下,使用混合方法可能是一个好主意。

  

基于Ajax的SPA有什么优势吗?

一些想法:

  • 可重用性:您可能知道,socket.io不仅仅是WebSockets的包装器。实际上,它使用的自定义协议与其他WebSocket实现不兼容 - 您的(Web)客户端必须支持socket.io。另一方面,当使用Ajax时,您可以创建一个可重用的REST接口,该接口同时由不同类型的应用程序使用,例如,通过您的SPA以及原生移动应用程序。
  • 客户端和服务器端的复杂性:用于构建SPA的大多数Javascript框架为与Ajax相关的通信提供了出色的开箱即用支持,而Ajax调用只是普通的旧HTTP请求,每个网络服务器都在那里。
  • 性能:正如您所指出的,不需要socket.io来为每个请求建立新连接。但问题是,使用HTTP时也不一定如此。现代浏览器使用(或多或少)智能连接管理,如果请求之间的空闲时间不是太长,则可能对后续请求使用相同的连接。如果您有许多并发用户,这可能比使用socket.io更节省资源,即使没有流量,也会使连接长时间保持打开状态。

答案 1 :(得分:2)

添加@alapeno发布的绝对正确的答案,这里没有“最佳实践”。这是你的用例的问题。

使用 Websockets (其中socket.io只是一个实现,而IMHO有更好的实现)允许您在客户端和服务器之间进行双向通信,服务器可以在其中启动通信只要插座已启动。

另一方面,Ajax要求客户端每次都启动通信。

两者都有优点和缺点。

<强>的WebSockets

一些优点

  • 发送和接收数据的开销很低
  • 可以使用SwaggerSockets
  • 等消息格式替换“传统Ajax”
  • 服务器可以将事件推送到客户端

一些缺点

  • 在服务器上使用内存效率低下。如果您有大量套接字连接,则服务器进程使用的RAM量将迅速增加。一些Websocket库在内存管理方面比其他库差。 (即你需要更多服务器/资源)
  • 没有“标准化”的方式来记录发送和接收数据的格式。您需要明确如何通过已建立的套接字在服务器上调用函数,或者使用SwaggerSockets之类的东西进行探索。
  • 如果第三方需要使用您的API,Websockets可能是数据交换的一个特别糟糕的选择,因为大多数应用程序可以轻松调用REST API,但使用基于套接字的方法设置的更少。

<强>的Ajax

一些优点

  • 降低服务器的内存要求。由于连接不是“永久”持久的,并且设计用于拉取而不是推送,因此与使用Websockets相比,您可以处理更多客户端。
  • 标准化文档格式。使用Swagger,Slate等为您的API创建漂亮,可读的文档,这对您未来以及任何潜在的第三方都有用。
  • 大多数Web开发人员都熟悉Ajax。
  • 总体复杂程度降低

一些缺点   - 更多的开销。对于每个请求,您将拥有各种标头,TCP开销等,尽管这不是一个很大的问题。正如@alapeno所说,现代浏览器在连接管理方面非常聪明。   - 没有推送通知。如果您想知道服务器上是否发生了某些事情,您将不得不问。 (服务器发送的事件在浏览器支持方面仍然处于起步阶段,但最终将是推送的一个不错的选择。)

我确信可以在每个类别中添加更多分数,但这些是我在选择时所考虑的许多事项。

不同用例的一个很好的例子是Stripe vs. Slack。

Stripe 有一个非常好的REST API,因为它们直接针对事务操作。他们没有在外部使用Websockets,因为它对他们的模型没有意义。

另一方面, Slack 是关于实时通信的。他们广泛使用Websockets来发送和接收消息,因为用户必须在发送数据后立即收到数据。当然,Slack也有一个REST API,因此显然有空间可以在一个有意义的服务中使用它们。