分布式队列如何工作

 常见问题解答 > 使用 Apache ActiveMQ Classic > 分布式队列如何工作

您可以使用 ActiveMQ Classic 的各种拓扑结构,其中客户端以各种方式连接到消息代理,例如

  • 对等
  • 客户端服务器
  • 中心辐射式

每个客户端都使用某种客户端库和网络协议与代理通信。

要创建分布式队列或主题,我们需要让消息代理相互通信。有两种不同的代理到代理通信类型…

用于高可用性的主/从

主/从集群用于HA。基本上这意味着所有消息都在主/从集群中的每个代理之间复制。如果主服务器宕机,客户端可以自动故障转移到从服务器,从服务器将拥有所有消息,因此每条消息都具有高可用性。从服务器提供热备用代理,该代理将始终保持同步,准备好在主服务器因硬件故障等原因失效时接管。

主/从通过某种形式的复制来工作;每条消息都由逻辑集群中的每个代理拥有。然后,主/从集群充当一个逻辑消息代理,然后可以通过存储转发连接到其他代理(正如我们将在下一节中看到)。

分布式队列和主题

在主/从模式下,队列和主题在集群中的每个代理之间复制(因此通常复制到主服务器和一个从服务器)。因此,集群中的每个代理在任何时候都具有完全相同的消息可用,因此如果主服务器出现故障,客户端会故障转移到从服务器,并且您不会丢失任何消息。

代理的存储转发网络

代理的存储转发网络意味着消息从一个代理传输到另一个代理,直到它们到达消费者;在任何时候,每条消息都由单个代理拥有。当 JMS 生产者将消息发送到 JMS 消费者时,它可能需要经过多个代理才能到达最终目的地。ActiveMQ Classic 使用消费者优先级,因此本地 JMS 消费者始终比存储转发网络中的远程代理优先级高。

但是请注意,存储转发网络不是解决消息HA问题的方案;如果存储转发网络中的代理出现故障,则该代理拥有的消息将保留在代理的持久性存储中,直到代理恢复联机。如果您需要消息的HA,则需要使用上面描述的主/从模式。

存储转发通常用于大型网络,其中生产者位于一个 LAN 上,消费者位于另一个 LAN 上,并且您希望在每个 LAN 上使用代理作为一种网络集中器,以最大程度地减少它们之间的 WAN 通信(并最大程度地减少跨 WAN 的连接数量)。在使用防火墙或 SSL 跨某些网络等情况下,也可以发现类似的存储转发用途。存储转发网络的另一个用例是,如果您的操作系统不支持许多套接字(并且您无法重新配置),则可以使用存储转发网络将大量的客户端连接到一个逻辑网络中。

存储转发中的分布式队列

当我们在队列上发布消息时,该消息将存储在发布者正在通信的代理的持久性存储中。然后,如果该代理被配置为存储转发到其他代理和客户端,该代理将将其发送到一个这些客户端(根据调度算法,它可能是一个节点或代理)。这种调度算法将持续进行,直到消息最终被调度并被客户端使用。

在任何时候,该消息都将仅存在于一个代理的存储中,直到它被使用。请注意,仅当这些代理上有消费者时,消息才会被分发到其他代理。

例如,如果我们有代理 A、B、C 以及在 A 上的一个队列的发布者。如果我们在 A 和 B 上的队列上拥有消费者,那么该队列的消息将分布在代理 A 和 B 之间;一些消息发送到 B,一些消息在 A 上被使用,没有消息发送到 C。如果在 C 上启动了一个队列的消费者,那么消息也将流向那里。如果消费者停止,则不会再有消息被调度到 C。

存储转发中的分布式主题

对于主题,遵循上述算法,除了每个感兴趣的客户端都会收到消息的副本之外,ActiveMQ Classic 还将检查循环(以避免消息无限地在代理环之间流动)。

另请参阅

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛标志和 Apache ActiveMQ 项目标志是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据Apache 许可证 2.0授权。