spring - 在 Amazon Beanstalk 上处理 Spring Boot 集群 Websocket

标签 spring amazon-web-services spring-boot amazon-sqs amazon-elastic-beanstalk

我有一个使用 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/

相关文章:

java - 严重 : Could not dispatch event: Eventbus com. google.common.eventbus.SubscriberExceptionContext

mysql - 设置用于在家中托管 Java EE 应用程序的服务器

performance - 衡量 ec2 实例之间 tcp 性能的正确方法

java - MyNotificationService 需要类型为 'org.springframework.mail.javamail.JavaMailSender' 的 bean,但无法找到

java - @Required 属性检查一个 bean,但不检查另一个 bean

java - 如何在 MethodInterceptor 中访问 SecurityContext?

amazon-web-services - Dynamodb 中的 3 个字段复合主键(唯一项)

mysql - 使用 Amazon RDS Aurora 进行复制是否需要 GUID?

java - Spring Boot/Spring Security、登录表单、密码检查

java - Spring Boot从mysql创建重复记录