分布式消息队列的设计:第二部分
了解消息队列的详细设计及其在后端服务器中的管理。
在上一课中,我们讨论了前端服务器和元数据服务的职责。在本课中,我们将重点关注存储队列和消息的主要设计部分:后端服务。
后端服务
这是架构的核心部分,其中进行了重大的活动。当前端接收到消息时,它会参考元数据服务来确定需要发送消息的主机。然后将消息转发到主机,并在相关主机上复制以克服可能存在的可用性问题。在不同主机的集群中复制消息可以使用以下两种模型之一来执行:
- 主备模型
- 独立主机集群
在深入探讨这些模型的细节之前,让我们讨论负责队列管理的两种类型的集群管理器: 内部和外部集群管理器。这两个集群管理器的区别如下表所示。
内部集群管理器 | 外部集群管理器 |
---|---|
它管理集群内队列的分配。 | 它管理跨集群的队列分配。 |
它了解集群中的每个节点。 | 它了解每个集群。但是,它没有有关集群中存在的每个主机的信息。 |
它听取来自每个节点的心跳。 | 它监视每个独立集群的健康状况。 |
它管理主机故障,实例的添加和从集群中删除。 | 它管理和利用集群。 |
它将队列分区成几个部分,每个部分都有一个主服务器。 | 它可以将队列分割到多个集群中,使相同队列的消息在多个集群之间平均分布。 |
主备模型
在主备模型中,每个节点都被视为一个队列集合的主机。主机的职责是接收特定队列的请求并完全负责数据复制。请求由前端接收,前端通过元数据服务与内部集群管理器通信以确定请求的主机。
例如,假设我们有两个标识为101和102的队列,分别驻留在四个不同的主机A、B、C和D上。在此示例中,实例B是队列101的主机,并且将队列101复制到的辅助主机是A和C。随着前端接收到的消息请求,它通过元数据服务从内部集群管理器中识别主服务器。消息从主实例中检索,主实例也负责在使用后删除原始消息及其所有副本。
如下图所示,内部集群管理器是负责主机、辅助主机和队列之间映射的组件。此外,它还有助于选择主机。因此,它需要可靠、可扩展和高性能。
独立主机集群
在独立主机集群中,每个主机都是独立的,无需使用主服务器或辅助服务器。在该模型中,消息复制是通过外部集群管理器来实现的。该管理器将队列消息分配给独立集群。由于每个主机都是独立的,因此这个模型较为灵活,能够扩展到更大的规模。但是,这种模型需要更复杂的管理和监控系统。
警告
问题:
随机主机如何在同一集群中的其他主机的队列中复制数据(即消息)?
答案:
每个主机都包含队列与集群中其他主机之间的映射,从而使复制变得更加容易。
假设我们有一个名为Y的集群,其中包含主机A、B和C。该集群有两个队列,ID分别为101和103,存储在不同的主机上,如下表所示。这个表格存储在集群Y中的每个主机上。当一个随机的主机收到一个消息,比如主机C,针对一个ID为103的队列,主机C会将这个消息复制到存储队列103的其他主机上,即节点A和节点B。
同样的过程被应用于从消费者接收消息请求。与第一种方法类似,随机选择的主机负责在成功处理消息后进行消息传递和清理。
此外,还引入了另一个组件,称为外部集群管理器,该管理器负责维护队列和集群之间的映射,如下图所示。外部集群管理器还负责队列管理和将特定队列分配给集群。
下图说明了独立主机集群。有两个集群A和B,它们由几个节点组成。外部集群管理器具有队列和其相应集群之间的映射表。每当前端接收到队列的请求时,它确定队列对应的集群,并将请求转发到队列所在的集群。该集群内的节点负责相应地存储和发送消息。
警告
问题:
在将消息复制到其他主机时会出现什么样的异常情况?
回答:
将消息复制到多个主机上的队列有两种方式:
- 同步复制
- 异步复制
在同步复制中,主机负责将消息复制到其他主机上的所有相关队列。在辅助主机确认后,主机会通知客户端消息的接收情况。在这种方法中,消息在所有队列副本中保持一致;然而,它会增加通信延迟,并在推选辅助主机作为主机的选举过程中导致部分或无可用性。
在异步复制中,主机一旦接收到消息,就会向客户端发送确认,并在下一步中开始将消息复制到其他主机。但这种方法也会带来其他问题,如复制滞后和一致性问题。
根据应用程序的需求,我们可以选择其中之一。
我们已经完成了一个分布式消息队列的设计,并讨论了两种组织后端服务器的模型。我们还描述了队列管理过程以及后端如何处理消息。此外,我们还讨论了如何通过不同的集群管理器管理后端服务器。
在下一节课中,我们将讨论我们的系统如何满足本章前面描述的功能和非功能要求。