我有一个使用 Spring Framework/Spring Boot/Spring Messaging/Websockets 的应用程序,我将把它部署到 Elastic Beanstalk。您可以将该应用程序视为聊天应用程序(它实际上确实具有聊天功能)
场景
这是一个示例场景:
Client A <-> Server A
Client B <-> Server B
Client C <-> Server B
现在,如果 Client A
使用 spring messaging 发布一条消息,如果我将该消息发送给所有连接的客户端,则只有 Client A
会看到它,因为只有 客户端 A
连接到 服务器 A
,同样如果 客户端 B
连接,则只有 客户端 B 和 C
会看到它,不是客户端A
。
所以这给我留下了一个问题,我有哪些选择。
可能的解决方案
如果可能的话,我想使用亚马逊的服务,因为我已经在他们的云平台上了。
我考虑过使用 Amazon SQS,让每个服务器都订阅同一个队列,然后通过它发送所有通知,但我相信所有使用 SQS 的请求都是事件的,所以我必须进行轮询,并且会创建一个重要的延迟。
有谁知道解决这个问题的好办法吗?我可以设置一个服务器来处理所有网络套接字,但这不是最佳选择。
提前致谢!
最佳答案
我几乎完全按照您的描述成功地做了。
虽然我没有使用 spring boot,但我正在使用 spring 和 web sockets 通过 elastic beanstalk 在集群中运行时向浏览器客户端发送推送消息。
我处理集群的方式是构建一个子系统,我可以在其中向其他节点发送消息。
因此,当我想从节点 A 发送网络套接字消息时,我从该节点发送网络套接字消息(它将发送到所有已注册的客户端),然后将消息发送到其他节点,以便它们发送到所有节点客户。
“集群内”消息传递是使用 SNS + SQS 完成的。在启动时,每个节点创建一个队列(由它的 instanceid 标识),在主题上注册该队列(所有节点使用相同的主题),然后启动该队列上的新消息的监听器。这个监听器使用长轮询。不久前,亚马逊在其队列中添加了对其“长轮询”的支持,但起初并不可用。这意味着客户端最多可以阻塞 20 秒以等待消息,一旦收到消息,就会处理该消息——因此您的延迟非常低。当我想向主题发送消息时,消息会被路由到在该主题上注册的所有队列。然后,我还在监听器中构建了过滤功能,以允许消息仅发送给“其他”客户端(即不要将其发送给自己选项)。
我看到你确实提到了 RabbitMQ...我的方法的弱点是它不支持如果你使用支持 STOMP 消息协议(protocol)的消息代理可能的丰富性。这样做意味着您根本不必担心集群,您只需发送给代理,它就会处理繁重的工作。如果我需要更丰富的解决方案,我想这将是我的下一步。
如果有人可以构建一个由 SQS 支持的 STOMP 客户端,这将有助于在 AWS 的 spring 上执行 Web 套接字消息。
关于spring - 在 Amazon Beanstalk 上处理 Spring Boot 集群 Websocket,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28243987/