在 Amazon Beanstalk 上处理 Spring 引导集群 Websocket
Handling Spring Boot Clustered Websockets on Amazon 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 消息发送消息,如果我将该消息发送给所有连接的客户端,只有 Client A
会看到它,因为只有 Client A
连接到 Server A
,同样如果 Client B
连接,只有 Clients B and C
会看到它,而不是 Client A
。
所以这给我留下了一个问题,我有什么选择。
可能的解决方案
如果可能的话,我想使用亚马逊的服务,因为我已经在他们的云平台上了。
我考虑过使用 Amazon SQS,让每台服务器都订阅同一个队列,然后通过它发送所有通知,但我相信所有使用 SQS 的请求都是活动的,所以我必须进行轮询,然后创建严重延迟。
有谁知道解决这个问题的好办法吗?我可以设置一个服务器来处理所有网络套接字,但这不是最佳选择。
提前致谢!
我几乎完全按照您的描述成功地完成了工作。
虽然我没有使用 spring 启动,但我正在使用 spring 和网络套接字在 运行 集群中通过弹性 beanstalk 向浏览器客户端发送推送消息。
我处理集群的方式是构建一个子系统,我可以在其中向其他节点发送消息。
因此,当我想从节点 A 发送 Web 套接字消息时,我从该节点发送 Web 套接字消息(它将发送到所有已注册的客户端),然后将消息发送到其他节点,以便它们发送到他们所有的客户。
"intra cluster" 消息传递是通过 SNS + SQS 完成的。在启动时,每个节点创建一个队列(由它的 instanceid 标识),在主题上注册该队列(所有节点使用相同的主题),然后启动该队列上的新消息的侦听器。这个侦听器使用长轮询。不久前,Amazon 在其队列中添加了对 "long polling" 的支持,但起初并不可用。这意味着客户端最多可以阻塞 20 秒以等待消息,一旦收到消息,就会处理该消息——因此您的延迟非常低。当我想向该主题发送一条消息 post 时,该消息被路由到该主题上注册的所有队列。然后,我还在侦听器中构建了过滤功能,以允许消息仅发送给 "other" 客户端(即不要将其发送给自己选项)。
我看到你确实提到了 RabbitMQ...我的方法的弱点是它不支持如果你使用支持 STOMP 消息协议的消息代理可能的丰富性。这样做意味着您根本不必担心集群,您只需发送给代理,它就会处理繁重的工作。如果我需要更丰富的解决方案,我想这将是我的下一步。
如果有人可以构建一个由 SQS 支持的 STOMP 客户端,这将有助于在 AWS 中的 spring 上执行网络套接字消息。
我有一个使用 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
,同样如果 Client B
连接,只有 Clients B and C
会看到它,而不是 Client A
。
所以这给我留下了一个问题,我有什么选择。
可能的解决方案
如果可能的话,我想使用亚马逊的服务,因为我已经在他们的云平台上了。
我考虑过使用 Amazon SQS,让每台服务器都订阅同一个队列,然后通过它发送所有通知,但我相信所有使用 SQS 的请求都是活动的,所以我必须进行轮询,然后创建严重延迟。
有谁知道解决这个问题的好办法吗?我可以设置一个服务器来处理所有网络套接字,但这不是最佳选择。
提前致谢!
我几乎完全按照您的描述成功地完成了工作。
虽然我没有使用 spring 启动,但我正在使用 spring 和网络套接字在 运行 集群中通过弹性 beanstalk 向浏览器客户端发送推送消息。
我处理集群的方式是构建一个子系统,我可以在其中向其他节点发送消息。
因此,当我想从节点 A 发送 Web 套接字消息时,我从该节点发送 Web 套接字消息(它将发送到所有已注册的客户端),然后将消息发送到其他节点,以便它们发送到他们所有的客户。
"intra cluster" 消息传递是通过 SNS + SQS 完成的。在启动时,每个节点创建一个队列(由它的 instanceid 标识),在主题上注册该队列(所有节点使用相同的主题),然后启动该队列上的新消息的侦听器。这个侦听器使用长轮询。不久前,Amazon 在其队列中添加了对 "long polling" 的支持,但起初并不可用。这意味着客户端最多可以阻塞 20 秒以等待消息,一旦收到消息,就会处理该消息——因此您的延迟非常低。当我想向该主题发送一条消息 post 时,该消息被路由到该主题上注册的所有队列。然后,我还在侦听器中构建了过滤功能,以允许消息仅发送给 "other" 客户端(即不要将其发送给自己选项)。
我看到你确实提到了 RabbitMQ...我的方法的弱点是它不支持如果你使用支持 STOMP 消息协议的消息代理可能的丰富性。这样做意味着您根本不必担心集群,您只需发送给代理,它就会处理繁重的工作。如果我需要更丰富的解决方案,我想这将是我的下一步。
如果有人可以构建一个由 SQS 支持的 STOMP 客户端,这将有助于在 AWS 中的 spring 上执行网络套接字消息。