服务器发送消息 SSE 如何在多服务器实例环境中工作

how the server send message SSE worked in multiple server instance environments

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

在UI中,有两个步骤:

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

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

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

但在多服务器实例环境中,这将不起作用。例如,我有两个服务器实例,并且 UI 订阅了服务器 1,那么服务器 1 正在记住连接,但是数据更新来自服务器 2,当数据更改时,服务器 2 中的 SSE 没有连接.那么在这个senario中,server 2如何发送SSE到UI?

为了让SSE在多服务器环境下工作,是否需要采用什么保存方案来保存连接信息,让任何服务器实例都能准确的向UI发送SSE?

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

谢谢

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

注意 CORS 限制,即同源策略。 (它的工作原理与 xhr2 CORS 相同,因此相当容易 google;我的书在第 9 章也对其进行了详细介绍。)

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

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