【发布时间】:2017-11-12 14:40:10
【问题描述】:
我正在使用带有 RabbitMQ 代理的集群 tomcat 环境中使用 Spring Websockets 构建应用程序。我有一个 API 模块,它需要注册要收听的端点。我按照正常的例子,想出了这个配置:
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer
{
@Override
public void configureMessageBroker(final MessageBrokerRegistry config)
{
config.enableStompBrokerRelay("/topic/")
.setRelayHost("localhost")
.setRelayPort(61613)
.setClientLogin("guest")
.setClientPasscode("guest");
}
@Override
public void registerStompEndpoints(final StompEndpointRegistry registry)
{
registry.addEndpoint("/updates")
.setAllowedOrigins("*")
.withSockJS();
}
}
虽然这可行,但它并没有解决我的问题,因为 WebSocket 和中继配置似乎都捆绑到 API 模块中,因此其他层无法重用代理。我需要在服务层进行 stomp 消息代理中继配置,以便我们应用程序的其他模块可以将消息推送到 RabbitMQ 中的主题,然后转身通知 API 模块更新所有打开的 websocket。
下面是我们应用程序中相关层的示例图,以及我想要完成的任务。我需要允许模块“Cron Message Sender”通过我们的其他 API 模块将消息推送给订阅消息主题的每个人。
【问题讨论】:
-
我现在正在探索的另一个可能的想法是将两者分解为完全独立的组件。我的意思是每个 API 模块都将使用一个简单的代理(无中继)运行它自己的独立 websocket 配置。然后,在服务层,我将通过 AMQP 直接与 rabbitmq 对话,将每个服务实例连接在一起。然后,每个 API 模块将侦听传入的 AMQP 消息并通过 Stomp WS 将它们转发给各自的用户。我对消息传递仍然很陌生,不确定这在生产环境中的性能方面是好是坏。
-
假设这种方法有效,如果我决定放弃 RabbitMQ 转而使用其他消息代理(如 AWS SQS),这将允许我解耦组件,从而提供更大的灵活性。
标签: java spring websocket rabbitmq