2015-10-14 137 views
1

HTTPWebSockets这个令人愉快的问题再次出现,不过即使退出了几百条关于versus博客文章,SO问题等的阅读之后,我仍然完全丧失了什么我应该为我们的应用而努力。在这篇文章中,我将提供有关应用程序功能的信息,以及当前应用程序中使用的请求/响应类型。我应该使用AJAX还是WebSockets。

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

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

经过一番深入的研究,我决定使用NodeJS这次写入后端。不过,我很难决定HTTPWebsockets。以下是在服务器/客户端之间完成的事务类型。

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

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

目前应用(当使用时),将请求发送到服务器的每一个接口被改变时,其平均为我们的应用程序是每隔几秒钟。我们接口上的每个操作都会向服务器发送另一个请求。应用程序还会每8秒发送一次检查通知/消息的请求(或两秒,具体取决于它们是否位于消息传递界面上)。

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

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

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

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

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

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

重要:

如果使用的WebSockets,将我们能够asynchronously图片下载从服务器喜欢,我们可以用AJAX?例如,我可以使用AJAX向服务器发送5个请求,以获得5个不同的图像,并且他们都将立即开始下载,使用指定的连接,我必须等待每个照片流传送到下一个请求之前?这仅仅是一个单用户还是每个等待请求完成的用户?

+0

对不起,让您的生活困难,但我会重新考虑'Node.js' ...'Node.js'是一个单线程的反应器为基础的框架,除非你有很长处理作业是惊人的,美妙的 - 比如未优化数据库查询会导致您的服务器(而不是数据库)组织或处理数据。如果您有任何请求需要一段时间才能处理(并且您的帖子指出您这样做),则“Node.js”可能不是最佳选择,并且可能会导致您的服务器在每次客户端请求需要很长时间处理的事情时挂起...(无论是你还是付出更多的缩放)。 – Myst

+0

@Myst - 我很清楚NodeJS带来的风险,查询可以像数据库结构一样轻松优化。这一切都将在此过渡期间重做,因为我将从MySQL迁移到MongoDB。另外,值得注意的是Node可以使用'Sticky-session'在所有处理器上使用。我已经建立了自己的机器,它坐落在服务器托管站,虽然技术上是高规格桌面,但我很幸运地知道人们为我的“桌面服务器”获得10Gbit连接和管理。 1TB SSD,32GB Ram,Debian,四核4.6GHz处理器。 – Hobbyist

+0

请注意,应用程序原始版本中的一半性能问题是因为我对开发完全懒惰。我在做迷恋内存复制,讲述数据库中的原始文件数据,而不是链接到文件系统等。显然它会结结巴巴地说。嘿。 – Hobbyist

回答

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

如果您的问题我应该使用HTTP过的WebSockets?,回应是:您不应该

即使是速度更快,因为你不会失去打开连接时,你也失去了所有喜欢的动词(GETPOSTPATCHPUT,...),路径,身体,同时也响应HTTP规范,状态码。这接近简单,但你必须重新实现这些协议的全部或部分。

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

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

+1

这是我正在寻找的建议。 – uchuugaka