【问题标题】:Stomp over SockJS ActiveMQ relay to multiple serversStomp over SockJS ActiveMQ 中继到多个服务器
【发布时间】:2021-06-04 11:46:06
【问题描述】:

我正在尝试为我们现有的基础架构的客户端-客户端-通信创建一个合理的设置。我已经阅读 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 的中继?

【问题讨论】:

  • 我试图重新表述这个问题。也许这更好。我只需要一个起点。

标签: spring-websocket stomp activemq-artemis sockjs


【解决方案1】:

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

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

我不确定您所说的“透明”到底是什么意思,但如果这意味着接收消息的进程不必执行任何操作,则没有消息经纪人将处理您的用例。

【讨论】:

  • 这非常有帮助。我从来没有想过这个想法,但你是完全正确的。我的服务器/控制器现在是消息客户端,中间有一个代理。这就像一个魅力。
猜你喜欢
  • 2019-12-31
  • 1970-01-01
  • 2017-05-27
  • 2017-09-17
  • 2016-12-29
  • 2016-07-26
  • 2016-11-09
  • 2016-07-04
  • 2014-10-18
相关资源
最近更新 更多