可扩展后端中的服务器推送事件

3
我已经在Heroku上部署了一个Java Web应用程序。
现在,我想改变后端以便通知连接的用户特定事件。我认为我可以使用服务器发送事件来实现这一点,我认为它的工作方式如下:
1.当用户打开前端时,它将建立服务器发送事件的连接。
2.当后端收到这样的请求时,它将创建这样的连接(基本上是一个EventOutput)并将其存储在某个地方,同时还会存储用户的ID(比如说在内存中的Map)。
3.当出现新事件时,后端将找到需要通知的用户,根据他的ID检索他的连接并向他发送通知。
当只有一台机器处理请求时,这样做非常好。
但是,当我想扩展我的应用程序并引入更多机器时,我的问题就开始了。然后,我就不能再在一台机器的内存中存储这些连接了,我需要使用一些集中的位置。但是,集中式位置需要进行序列化/反序列化连接,这意味着它不再是同一个连接!
你通常如何做这样的事情?
2个回答

0
您可以使用发布-订阅解决方案(例如:Redis pub-sub),该解决方案可供每个dyno访问。
在启动时,您的应用程序订阅适当的频道。当事件发生时,它会被发布到一个频道中。这意味着您的应用程序的所有实例(分布在多个dyno上)都会接收到该事件,并且任何打开SSE连接的实例都可以响应该事件。

0
一个解决方案是使用会话亲和性(即粘性会话),这将确保单个会话的请求始终路由到同一进程(我说“始终”是因为有一些附加条件)。您可以通过运行以下命令打开此功能:
$ 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的连接! - Alex Ntousias
那是一个更棘手的问题。我认为你可能需要类似于WebRTC这样的东西。 - codefinger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接