【问题标题】:Should I be using AJAX or WebSockets.我应该使用 AJAX 还是 WebSockets。
【发布时间】:2016-01-12 12:53:08
【问题描述】:

哦,HTTPWebSockets 的有趣问题又来了,但是即使在阅读了数百篇 versus 博客文章、SO 问题等之后,我仍然完全不知道我应该为我们的申请做些什么。在这篇文章中,我将提供有关应用程序功能的信息,以及我们当前应用程序中使用的请求/响应类型。

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

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

经过大量研究,我决定这次使用NodeJS 编写后端。但是我很难决定HTTPWebsockets。这是服务器/客户端之间完成的事务类型。

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

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

目前,应用程序(在使用时)每次接口更改时都会向服务器发送一个请求,对于我们的应用程序来说,平均每几秒一次。我们接口上的每个操作都会向服务器发送另一个请求。该应用程序还每 8 秒发送一次检查通知/消息的请求(或两秒,具体取决于它们是否在消息界面上)。

目前,我看到stated 连接优于stateless 连接与我们的应用程序的好处。

  • 如果声明了连接,我可以消除对通知和消息的请求,因为服务器可以在有可用时通知客户端。这可以消除每秒对服务器的x(n)/4 请求。

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

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

但是,我是通过 TCP 游戏服务器仿真开始学习编程的人。所以我了解some STATED 连接的好处,而我完全不了解 STATELESS 连接的好处。我知道他们都有自己的优点和怪癖,但我很好奇对我们来说最好的方法是什么。

我们主要寻求可扩展性,因为我们有一个本地应用程序启动,并在 48 小时内设法达到近 10,000 名用户的瓶颈。幸运的是,我以BETA 的形式宣布了这一消息,并且在得知我作为一个学习项目自己完成了这一切之后,用户们让我松了一口气。我在考虑改进应用程序的前端和后端时禁用了注册。

重要提示:

如果使用 WebSockets,我们是否可以像使用 AJAX 一样从服务器下载图片 asynchronously?例如,我可以使用 AJAX 向服务器发出 5 个请求,获取 5 个不同的图像,它们都会立即开始下载,使用指定的连接,我是否必须等待每张照片流式传输才能移动到下一个请求?这只会限制单个用户,还是等待完成请求的每个用户?

【问题讨论】:

  • 很抱歉让你的生活变得更艰难,但我会重新考虑Node.js...Node.js 是一个基于单线程反应器的框架,除非你有长时间的处理工作,否则它是惊人的和美妙的 - 例如导致您的服务器(而不是数据库)组织或处理数据的未优化数据库查询。如果您有任何需要一段时间来处理的请求(并且您的帖子表明您这样做),Node.js 可能不是最佳选择,并且可能会导致您的服务器在每次客户端请求需要很长时间处理的内容时挂起.. . (要么这样,要么你为扩展支付更多费用)。
  • @Myst - 我很清楚 NodeJS 带来的风险,查询可以像数据库结构一样轻松优化。这一切都将在此过渡期间重做,因为我将从 MySQL 迁移到 MongoDB。此外,公平地指出,Node 可以使用 Sticky-session 的所有处理器。我已经构建了自己的机器,它位于服务器托管站,虽然从技术上讲是一个高规格的桌面,但我很幸运认识人们为我的“桌面服务器”获得 10Gbit 连接和管理。 1TB SSD、32GB Ram、Debian、四核 4.6GHz 处理器。
  • 请注意,在应用程序的原始版本中,有一半的性能问题是因为我完全懒于开发。我正在做着强迫性的内存复制,在数据库中记录原始文件数据而不是链接到文件系统等。显然它会结结巴巴。呵呵。
  • 酷!听起来你已经考虑过了。这只是人们在迁移到 node 时经常忘记的事情,他们最终使用长阻塞调用而不是带有链式回调的短部分......而不是他们想知道为什么他们的应用程序没有尽可能地响应。
  • 这是第一次设计 Websockets 协议时的一个已知问题。要解决此问题,请使用 wss 而不是 ws。拥有一个安全的 TLS 连接会导致流量“直通”代理和缺乏 Websocket 支持的路由器......这是一个非常有效和常见的解决方案,因为中介(代理/路由器)不应该能够读取和“更正"(也不缓存)流(撇开“中间人”攻击和此类问题)。

标签: ajax node.js websocket network-programming


【解决方案1】:

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

这里有一些链接可以让您深入了解,但不能具体回答您的问题,因为正如我所说,这取决于您的期望。

Hard downsides of long polling?

WebSocket/REST: Client connections?

Websockets, and identifying unique peers[PHP]

How HTML5 Web Sockets Interact With Proxy Servers

【讨论】:

    【解决方案2】:

    如果您的问题是我应该在 Websockets 上使用 HTTP 吗?,回答是:你不应该

    即使它更快,因为你不会浪费时间打开连接,你也会失去所有 HTTP 规范,比如动词(GETPOSTPATCHPUT,...),路径,正文,以及响应,状态代码。这看起来很简单,但您必须重新实现这些协议的全部或部分内容。

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

    当您需要每 2 秒发出一次 ajax 请求时,实际上您需要服务器向您发送数据,而不是您请求服务器检查 Api 更改(如果更改)。所以这表明你应该实现一个 websocket 服务器。

    【讨论】:

    • 这是我一直在寻找的建议。
    猜你喜欢
    • 2016-02-06
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 2018-09-05
    • 1970-01-01
    • 2015-07-18
    相关资源
    最近更新 更多