6

我有一个关于如何使 SSE 在多个服务器环境中工作的问题。

在 UI 中,有两个步骤:

1. source = new EventSource('http://localhost:3000/stream');
   source.addEventListener('open', function(e) {
      $("#state").text("Connected")
    }, false);
  1. UI 中的用户可以发布到 api 以更新数据

  2. 用户发布到 api 后,服务器正在向 UI 发送事件以更新 UI

在一个服务器环境中,这工作得非常好,完全没有问题。

但是在多服务器实例环境中,这是行不通的。例如,我有两个服务器实例,UI 订阅了服务器 1,那么服务器 1 记住了连接,但是数据更新是从服务器 2 来的,当数据发生变化时,服务器 2 中的 SSE 没有连接。那么在这个senario,服务器 2 如何将 SSE 发送到 UI?

为了让 SSE 在多个服务器环境中工作,我们是否需要采用任何保存方案来保存连接信息,以便任何服务器实例都能准确地将 SSE 发送到 UI?

让我再澄清一下:是的,服务 1 和服务 2 都位于负载均衡器之后,它们不必具有相同的 URL。UI 是纯前端应用程序,甚至可以是移动应用程序。所以,如果 UI 正在向 server1 的 LB 发送 eventSource 请求,那么只有这个实例可以使用这个连接将事件发送回 UI,对吗?但是如果我们有多个服务器 1 实例,这意味着除当前实例之外的任何服务器 1 实例都不能将事件发送回 UI。我相信这是 SSE 的限制,除非连接可以在所有实例之间共享。但是如何。

谢谢

4

1 回答 1

4

如果您有两台具有不同 URL 的服务器,请与每台服务器建立一个 SSE 连接(来自每个客户端)。

请注意 CORS 限制,即同源策略。(它的工作原理与 xhr2 CORS 相同,因此很容易用谷歌搜索;我的书也详细介绍了它,第 9 章。)

如果负载均衡器后面有两台服务器,它们向客户端显示一个 URL,那么您只需要确保负载均衡器配置正确。即始终通过该套接字到正确的服务器。如果后端服务器死机,需要更换,负载均衡器应关闭 SSE 套接字;然后客户端将自动重新连接,并获得一个新的后端服务器。

负载均衡器后面的多个服务器应该有自己的数据推送套接字连接到主数据源,或者都应该轮询主数据源。

于 2017-04-23T09:49:34.570 回答