集群
集群是一个很大的主题,通常对不同的人来说意味着不同的东西。我们将尝试列出集群的各个方面以及它们与 ActiveMQ Classic 的关系。
队列消费者集群
ActiveMQ Classic 支持在消费者之间对队列上的消息进行可靠的高性能负载均衡。在企业集成中,此场景被称为 竞争消费者 模式。下图说明了这个概念
此解决方案接收生产者发送的消息,将其入队并将其分发到所有注册的消费者之间。这有许多好处
- 负载以非常动态的方式分配。可以在高负载期间配置额外的消费者并将其附加到队列,而无需修改队列中的任何配置,因为新的消费者将表现得像另一个竞争消费者。
- 比使用负载均衡器的系统具有更好的可用性。负载均衡器通常依赖于监视系统来找出哪些真实服务器不可用。对于竞争消费者,失败的消费者不会竞争消息,因此即使没有监视,消息也不会传递到它。
- 高可靠性,如果消费者失败,任何未确认的消息将重新传递到队列上的其他消费者。
缺点是,这种模式可能不适合需要处理顺序的系统。为了在保持优势的同时缓解此问题,应将竞争消费者模式与其他 ActiveMQ Classic 特性 结合使用,例如 独占消费者 和 消息组,如 ActiveMQ Classic 的常见问题解答 中所述。
代理集群
JMS 上下文中集群的最常见思维模型是,存在一个 JMS 代理集合,并且 JMS 客户端将连接到其中一个代理;然后,如果 JMS 代理关闭,它将自动重新连接到另一个代理。
我们在 JMS 客户端中使用 failover://
协议实现此功能。有关如何配置故障转移协议的详细信息,请参阅 故障转移传输参考 页面。**注意:**ActiveMQ Classic 3.x 中的 reliable://
协议现已更改为 failover://
协议
如果我们只是在网络上运行多个代理并使用 静态发现 或 动态发现 告诉客户端有关它们的信息,那么客户端可以轻松地从一个代理故障转移到另一个代理。但是,独立代理不知道其他代理上的消费者;因此,如果某个代理上没有消费者,消息可能会堆积起来而不会被消费。我们有一个未解决的 功能请求 来解决客户端的这个问题 - 但目前解决这个问题的方法是创建一个代理网络来存储和转发代理之间的消息。
代理发现
我们支持使用 静态发现 或 动态发现 进行 自动发现 代理,因此客户端可以自动检测和连接到逻辑代理组中的代理,以及代理发现并连接到其他代理以形成大型网络。
代理网络
如果您使用的是 客户端/服务器或中心/辐射式拓扑 并且您有很多客户端和代理,则可能一个代理有生产者但没有消费者,因此消息会堆积起来而不会被处理。为了避免这种情况,ActiveMQ Classic 支持 代理网络,它提供 *存储和转发* 功能,将消息从带有生产者的代理移动到带有消费者的代理,这使我们能够支持跨代理网络的 分布式队列和主题。
这允许客户端连接到任何代理 - 并在发生故障时故障转移到另一个代理 - 从客户端的角度提供代理集群。
代理网络还允许我们在网络中扩展到大量的客户端,因为我们可以根据需要运行尽可能多的代理。
您可以将其视为一个客户端集群与一个代理集群连接,并具有自动故障转移和发现功能,从而构成一个简单易用的消息传递结构。
主从
运行大量独立代理或网络中的代理的问题是,消息在任何时刻都由单个物理代理拥有。如果该代理关闭,您必须等待它重新启动才能传递消息。(如果您使用的是非持久性消息传递,并且代理关闭,您通常会丢失消息)。
背后的理念 主从 是将消息复制到从代理,以便即使主服务器的机器、文件系统或数据中心发生灾难性硬件故障,您也可以立即故障转移到从代理,而不会丢失消息。
复制消息存储
一种替代方法 主从 是以某种方式复制消息存储;因此,磁盘文件以某种方式共享。例如,使用 SAN 或共享网络驱动器,您可以共享代理的文件,以便如果代理失败,另一个代理可以立即接管。
因此,通过支持 复制的消息存储,您可以降低消息丢失的风险,以提供 HA 备份或完整的 DR 解决方案,能够承受数据中心故障。