【问题标题】:Server-Sent events in scalable backend可扩展后端中的服务器发送事件
【发布时间】:2015-08-08 03:39:10
【问题描述】:

我在 Heroku 中部署了一个 Java Web 应用程序。

现在,我想更改后端,以便它可以通知连接的用户有关特定事件。我认为我可以使用服务器发送的事件来做到这一点,我认为它的工作方式如下:

  1. 当用户打开前端时,它会为服务器发送的事件建立连接。
  2. 当后端收到这样的请求时,它会创建这样的连接(基本上是EventOutput)并将其与用户 ID 一起存储在某个地方(比如内存中的 Map)。
  3. 当有新事件出现时,后端会找到需要通知的用户,根据他的 ID 检索他的连接并发送通知。

当您只有一台机器处理请求时,这很好用。

当我想扩展我的应用程序并引入更多机器时,我的问题就开始了。然后,我不能再将这些连接真正存储在一台机器的内存中,我需要使用一些集中的位置。但是集中位置需要对连接进行序列化/反序列化,这意味着它不再是同一个连接了!

你通常是怎么做这样的事情的?

【问题讨论】:

    标签: java heroku scalability server-sent-events


    【解决方案1】:

    一种解决方案是使用会话亲和性(也称为粘性会话),这将确保单个会话的请求“始终”路由到同一进程(我说“始终”是因为有一些警告)。您可以通过运行以下命令来打开此功能:

    $ heroku labs:enable http-session-affinity
    

    通过这种方式,您可以将内容保存在内存中,而不必序列化会话。

    这里有一篇文章更详细地描述了这个特性:https://blog.heroku.com/archives/2015/4/28/introducing_session_affinity

    【讨论】:

    • 问题是需要通知的用户可能在不同的测功机上有他们的连接。例如想象一个聊天应用程序,其中 A、B 和 C 在聊天室中,B 的连接在 dyno-1 中,而 C 的连接在 dyno-2 中。现在,A 正在发布一条到达 dyno-1 的消息,它需要通知 B 和 C,但它只有 B 的连接!
    • 这是一个更棘手的问题。我想你可能需要WebRTC
    【解决方案2】:

    您可以使用每个 dyno 都可以访问的 pub-sub 解决方案(例如:Redis pub-sub)。

    启动时,您的应用会订阅相应的频道。当一个事件发生时,它被发布到一个频道。这意味着您的应用程序的所有实例(分布在多个测功机上)都会收到该事件,并且任何打开 SSE 连接的实例都可以响应该事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-22
      • 1970-01-01
      • 2011-03-23
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      相关资源
      最近更新 更多