我应该使用AJAX还是WebSockets?

呵呵, HTTPWebSockets这个令人愉快的问题再次出现,但是即使在阅读数百篇关于博客文章,SO问题等等之后,我仍然完全丧失了我应该做的事情正在努力为我们的应用程序。 在这篇文章中,我将提供有关应用程序function的信息,以及当前在我们的应用程序中使用的请求/响应的types。

目前我们的应用程序是一个草率的工作,一起使用AngularJSAJAX请求到一个运行PHPApache服务器,即XAMPP 。 随着我们的应用程序的启动,我注意到,当服务器处于任何负载下时,我们遇到了响应时间的问题。 这可能与我们服务器的臃肿架构,硬件以及我们的MySQL数据库没有完全优化的事实有关。

然而,有了这样一个忠实的粉丝群和投资者看到我们的应用程序的潜力,并给我们一个机会推出2.0我一直在努力研究如何将这个应用程序变成一个低延迟的可扩展性的强大。 老实说,最好的select是hire someone with experience ,但不幸的是,我是一个业余爱好者,也是一个没有太多经验的一人军队。

经过一番广泛的研究,我决定这次使用NodeJS编写后端。 但是,我很难决定HTTPWebsockets 。 以下是在服务器/客户端之间完成的事务types。

  • 客户端以JSON格式向服务器发送请求。 请求有几个不同的东西。

    • 请求ID(用于基于请求的处理逻辑)
    • 与请求ID关联的数据。
  • 服务器接收请求,轮询数据库(如有必要),然后以JSON格式响应客户端。 有时服务器正在向客户端提供文件。 即Base64格式的图像。

目前,应用程序(在使用时)每次更改接口时都会向服务器发送请求,平均而言,我们的应用程序每隔几秒就会发送一次请求。 我们接口上的每个操作都会向服务器发送另一个请求。 应用程序还会每隔8秒发送一次检查通知/消息的请求(或者根据消息接口是否为2秒)。

目前这里是我看到的与我们的应用程序stateless连接的一个stated连接的好处。

  • 如果连接被声明,我可以消除对通知和消息的请求,因为服务器只要有一个可用就告诉客户端。 这可以消除每秒x(n)/4请求到服务器。

  • 处理类似从服务器断开连接的事情就像试图重新连接一样简单,而不是每个请求处理超时/错误,这只能在套接字上处理。

  • 通过删除用于数据库交互的安全密钥可以获得额外的安全性,这可以防止Hijacking(?) session_key并使用它来操纵或访问其他用户数据的可能性。 由于AJAX设置中没有状态,因此只需要session_key。

不过,我是通过TCP游戏服务器仿真开始学习编程的人。 所以我理解STATE连接的some好处,但是我根本不明白STATELESS连接的好处。 我知道他们都有他们的好处和怪癖,但我很好奇什么是对我们最好的方法。

我们主要是在寻找可伸缩性,因为我们有一个本地应用程序的启动,并在48小时内成为近10,000个用户的瓶颈。 幸运的是,我宣布这是一个BETA ,用户在了解到我自己作为一个学习项目完成之后,正在削减我很多的负担。 我已经禁用注册,同时考虑改进应用程序的前端和后端。

重要:

如果使用WebSockets,我们可以像使用AJAX那样asynchronously从服务器上下载图片吗? 例如,我可以使用AJAX为5个不同的图像向服务器发出5个请求,并且他们都将立即开始下载,使用一个规定的连接,我将不得不等待每个照片进行stream式传输,然后才能转到下一个请求? 这仅仅是一个单一用户,还是等待请求完成的每个用户?

如果你的问题是我应该使用HTTP通过Websockets? ,回应是: 你不应该

即使速度更快,因为您不会失去打开连接的时间,也会丢失所有HTTP规范,如动词( GETPOSTPATCHPUT ,…),path,主体以及响应,状态码。 这接近简单,但你必须重新实施这些协议的全部或部分事情。

所以你应该使用Ajax,只要它是一个实用的请求。

当你需要每2秒发一个ajax请求时,你实际上需要服务器向你发送数据,而不是你请求服务器来检查api的变化(如果改变的话)。 所以这是一个标志,你应该实现一个websocket服务器。

这一切都归结于您的应用程序如何工作,以及如何扩展。 我会使用纯WebSockets而不是任何包装,因为它是一个已经很容易使用的API,当你需要扩展时,你的手不会被束缚。

这里有一些链接会给你提供见解,虽然不是你的问题的具体答案,因为正如我所说,这取决于你的期望。

长期投票的严重缺点?

WebSocket / REST:客户端连接?

Websockets,并识别独特的同行[PHP]

HTML5 Web套接字如何与代理服务器交互