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

How to asynchronously send data to a client via a different application path?

我目前正在研究大规模应用程序优化和扩展,通过我的研究,我已经掌握了使用 DNS Round Robin 进行大规模应用程序的标准方法,用于在负载均衡器之间分配负载,使用负载均衡来划分跨 Web 服务器(如 Nginx)的流量,它再次使用负载平衡技术来划分应用程序服务器池上的流量等等,直到你访问数据库。

这在负载均衡器自身达到极限的情况下效果很好。有人告诉我,这就是要点,人们通常会在其中实现事件队列和工作人员来代替负载均衡器。工作人员从一个或多个队列中挑选工作,他们完成工作并将结果放入传出队列。其他工作人员获取这些结果,处理它们并将结果放入另一个传出队列等等,直到最终格式化数据(JSON、HTML 等)将被发送到客户端。

这是我目前有点困惑的地方。当一个人不遗余力地从前端到后端,再到前端,拥有一个超级可扩展、非阻塞的架构时,如何迈出最后一步,真正将数据提供给用户?用户连接到例如服务器 A,而服务器 B 上的工作人员可能是完成数据处理的人,因为它比服务器 A 有空闲时间。服务器B如何在不等待服务器A获得空闲时间的情况下获得对客户端的响应?

我希望这是有道理的。如果没有,请随时询问跟进。

谢谢!

不确定

是什么意思

in a typical web environment the client is connected, or tethered, to a specific server, say server A

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

您有两个网络服务器:Web1Web2
两个 Worker 服务:Worker1Worker2
两个队列:Q1 用于传入请求,Q2 用于结果。

当用户点击按钮保存一些更改时,请求将被重定向到,比方说,Web1Web1 将请求发送到 Q1 并将 OK 状态发送回客户端。然后任何工作人员从队列中拉取请求,处理它并将结果放入Q2。然后其中一个 Web 服务器,假设它是 Web2,从 Q2 中提取结果并将其发送给客户端。

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

  1. 长轮询
  2. WebSockets
  3. 服务器发送事件
  4. 永远的画面
  5. 多部分 XMLHTTPRequest
  6. XMLHTTPRequest,交互状态
  7. 等等

我不打算描述每个选项,因为它超出了问题的范围,但您可以 google 了解有关该主题的更多信息。但是,为了清楚起见,让我们从客户端的角度考虑使用长轮询的相同示例。

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

请注意,所描述的场景只是许多可能场景中的一个,但我希望它能很好地解释这种情况下的工作原理。