在 Amazon Beanstalk 上处理 Spring Boot 集群 Websocket

Posted

技术标签:

【中文标题】在 Amazon Beanstalk 上处理 Spring Boot 集群 Websocket【英文标题】:Handling Spring Boot Clustered Websockets on Amazon Beanstalk 【发布时间】:2015-03-30 09:45:42 【问题描述】:

我有一个使用 Spring Framework/Spring Boot/Spring Messaging/Websockets 的应用程序,并将将其部署到 Elastic Beanstalk。您可以将应用程序视为聊天应用程序(它实际上确实具有聊天功能)

场景

这是一个示例场景:

Client A <-> Server A
Client B <-> Server B
Client C <-> Server B

现在,如果 Client A 使用 spring 消息传递一条消息,如果我将该消息发送到所有连接的客户端,则只有 Client A 会看到它,因为只有 Client A 连接到 Server A,同样如果 @ 987654327@ 会看到,只有Clients B and C 会看到,Client A 不会看到。

所以这给我留下了一个问题,我有哪些选择。

可能的解决方案

如果可能,我想使用亚马逊服务,因为我已经在他们的云平台上。

我考虑过使用 Amazon SQS,让每台服务器订阅同一个队列,然后通过它发送所有通知,但我相信所有使用 SQS 的请求都是活动的,所以我必须进行轮询,并且会创建一个显着的延迟。

有谁知道解决这个问题的好方法吗?我可以设置一个服务器来处理所有网络套接字,但这不是最佳的。

提前致谢!

【问题讨论】:

我也在考虑使用 Firebase 之类的东西,只要延迟不错。 您希望Server AServer B 在同一个实例上运行吗?还是您希望它们彼此完全分开运行? 它们是自动缩放的,因此它们是在负载高时创建的独立服务器,并在负载低时自动删除。 长轮询有意义吗? docs.aws.amazon.com/AWSSimpleQueueService/latest/… 当 Dynamo 在特定频道收到新消息时,为什么不使用 Dynamo 并与 SNS 集成? 【参考方案1】:

我正在成功地完成你所描述的几乎完全一样的事情。

虽然我没有使用 spring boot,但是当通过弹性 beanstalk 在集群中运行时,我使用 spring 和 web 套接字向浏览器客户端发送推送消息。

我处理集群的方式是构建一个子系统,通过它我可以向其他节点发送消息。

因此,当我想从节点 AI 发送 Web 套接字消息时,从该节点发送 Web 套接字消息(它将发送给所有已注册的客户端),然后将消息发送给其他节点,让他们发送给他们的所有节点客户。

“集群内”消息传递是通过 SNS + SQS 完成的。在启动时,每个节点都会创建一个队列(由它的 instanceid 标识),在一个主题上注册该队列(所有节点都使用相同的主题),然后为该队列上的新消息启动一个侦听器。此侦听器使用长轮询。亚马逊不久前在其队列中增加了对“长轮询”的支持,起初它不可用。这意味着客户端最多可以阻塞 20 秒以等待消息,一旦收到消息,就会处理该消息 - 因此您的延迟非常低。当我想向主题发送消息时,消息会被路由到在该主题上注册的所有队列。然后,我还在侦听器中构建了过滤功能,以允许消息仅发送给“其他”客户端(即不要将其发送给我自己选项)。

我看到你确实提到了 RabbitMQ...我的方法的缺点是它不支持如果你使用支持 STOMP 消息协议的消息代理可能实现的丰富性。这样做意味着您根本不必担心集群,您只需发送到代理,它就会处理繁重的工作。如果我需要更丰富的解决方案,我想这将是我的下一步。

如果有人可以构建一个由 SQS 支持的 STOMP 客户端,那将是在 AWS 中在 Spring 上执行 Web 套接字消息的福音。

【讨论】:

感谢您抽出宝贵时间撰写答案!我们确实最终使用了 RabbitMQ 并让它工作得很好:) 将不得不写下我们所做的一些时间 我只是想知道...您是否为 rabbit mq 使用了专用的 ec2 实例,如果是的话,您是否对它进行了集群?用于故障转移等 不幸的是,它是专用的,我们也有我们的 MongoDB 服务器,考虑到当前的用户群规模,在我们需要担心集群之前它可能会增长很多 哇...添加 rabbitmq 比我预期的要容易得多。 Spring Boot FTW

以上是关于在 Amazon Beanstalk 上处理 Spring Boot 集群 Websocket的主要内容,如果未能解决你的问题,请参考以下文章

在 Amazon Elastic Beanstalk 上安装 Anaconda

如何在 Amazon 的 Elastic Beanstalk 上安装 Python 脚本?

运行 cron 作业 (Node.js) 时如何在 Amazon Elastic Beanstalk 中设置环境变量?

在 amazon ec2 (beanstalk) 上编辑已部署文件的权限

在 Amazon Elastic Beanstalk 上使用 Docker 部署 Django

Amazon Elatisc BeanStalk 单实例上的 SSL 端口 NodeJS