通过 SockJS ActiveMQ 中继到多个服务器

时间:2021-03-05 19:32:11

标签: spring-websocket stomp activemq-artemis sockjs

我正在尝试为我们现有的基础设施创建一个合理的客户端-客户端-通信设置。一个多星期以来,我一直在阅读 Spring、Websocket、STOMP、SockJS 和 ActiveMQ 的文档,但我不确定我正在尝试做的事情是否可行或明智。 Spring 服务器和 JavaScript 客户端的启动和运行速度相对较快,客户端之间发送消息正常(从 JS 客户端直接连接到 Spring 服务器)。这种设置不足以满足我们的需求,所以我们决定在两者之间放置专门的经纪人。配置 ActiveMQ 是一场噩梦,可能是因为我真的不知道从哪里开始。到目前为止,我还没有与专门的经纪人合作过。

环境

  • 170 个独立服务器(Tomcat、Spring、SockJS、STOMP)
  • 2 个 ActiveMQ (Artemis) 代理(负载平衡、故障安全)
  • 几千个客户端(JavaScript/.NET、SockJS、STOMP)

要求

我需要每个客户都能够与其他每个客户交谈。每条消息都必须由其中一台服务器进行管理。我希望客户端连接到 ActiveMQ 代理之一。 ActiveMQ 代理将保持与每个服务器的单一连接。关键是要避免我的所有客户端都必须打开到所有服务器的 170 个 WebSocket 连接。服务器不需要相互通信(但/必须),因为它们是独立的,具有不同的职责。

问题

ActiveMQ 或任何其他专用代理是否可用作透明代理/中继,即它是否可以处理这种情况,是否有办法动态决定正确的接收者,或者我应该走另一条路线,例如滚动我自己的基于 Spring 的中继?

1 个答案:

答案 0 :(得分:0)

在传统的消息传递用例中(例如使用 ActiveMQ Artemis 和 STOMP),代理管理“目的地”和发送到这些目的地的任何消息。仅当客户端专门在目标上创建消费者时,才会将消息分派给客户端。

在您的用例中,您所有的 170 个“服务器”实际上都是向客户端发送消息。他们需要在代理上创建一个消费者才能接收消息。需要明确的是,一旦创建了消费者,代理就会在消息到达时立即向它发送消息。

我不确定你所说的“透明”到底是什么意思,但如果它意味着接收消息的进程不必做任何事情那么没有消息经纪人将处理您的用例。