如何通过不同的应用程序路径异步发送数据到客户端?

时间:2015-06-18 13:33:39

标签: web-applications architecture scalability

我目前正在研究大规模应用程序优化和扩展,通过我的研究,我已经掌握了使用DNS Round Robin进行大规模扩展的标准方法,以便在负载均衡器之间分配负载,使用负载平衡来划分流量像Nginx这样的Web服务器,它再次使用负载平衡技术来划分应用程序服务器池上的流量,直到您点击数据库为止。

这很好地适用于负载平衡器自身达到极限的点。据我所知,这就是通常用事件队列和工作人员代替负载均衡器的地方。工作人员从一个或多个队列中选择作业,他们完成工作并将结果放入传出队列中。其他工作人员获取这些结果,处理它们并将结果放入另一个传出队列等等,直到最终格式化数据(JSON,HTML等)将被发送到客户端。

这是我现在有点困惑的地方。当一个人走到这些长度,从前到后,再到前面,一直有一个超级可扩展的非阻塞架构,如何采取最后一步并实际将数据传递给用户?用户连接到例如服务器A,而服务器B上的工作人员可能是完成数据处理的工作人员,因为它在服务器A之前有空闲时间。服务器B如何在不等待服务器A获得业余时间的情况下获得对客户端的响应?

我希望这是有道理的。如果没有,请随时询问后续行动。

谢谢!

1 个答案:

答案 0 :(得分:1)

不确定你的意思

  

在典型的Web环境中,客户端已连接或连接到   特定服务器,比如服务器A

通常,在负载均衡器后面仍然有几个Web服务器来处理高容量,当用户浏览站点时,请求可以发送到任何Web服务器,除非您专门配置负载均衡器以发送每个用户会话向同一服务器请求,这不是从可伸缩性角度来看的最佳选择。所以让我们考虑一个例子:

您有两个网络服务器: Web1 Web2
两个工作人员服务: Worker1 Worker2
两个队列: Q1 用于传入请求, Q2 用于结果。

当用户点击按钮保存某些更改时,请求会重定向到,请说 Web1 Web1 将请求置于 Q1 ,并将OK状态发送回客户端。然后,任何工作人员从队列中提取请求,处理它并将结果放入 Q2 。然后,其中一个网络服务器,让它说 Web2 ,从 Q2 中提取结果并将其发送给客户端。

我认为很明显,两个Web服务器都可以访问结果队列,并可以将请求发送回客户端。据我所知,您想知道最后一步是如何实现的,即结果如何发送给客户端。有很多方法可以做到:

  1. 长轮询
  2. 的WebSockets
  3. 服务器已发送事件
  4. 永远的框架
  5. Multipart XMLHTTPRequest
  6. XMLHTTPRequest,交互状态
  7. 我不会描述每个选项,因为它超出了问题的范围,但您可以谷歌了解有关该主题的更多信息。但是,为了清楚说明,让我们从客户端角度考虑使用Long轮询的相同示例。

    当用户点击按钮时,会显示进度微调器并将请求发送到后端。然后快速响应请求成功排队。然后我们做一个轮询请求,可以发送到任何Web服务器。由于我们对结果感兴趣,因此仍然显示微调器。然后,只要在后端处理请求,轮询请求就会返回结果,我们现在可以删除微调器并可能显示一条消息。

    请注意,所描述的参议院只是许多可能的,但我希望它能为你提供一个很好的解释,说明在这种情况下的工作原理。