亚马逊 MQ 中 RabbitMQ 的仲裁队列介绍
by Chris Munns 于2024年7月22日发表在 亚马逊 MQ, 事件 和 消息传递永久链接 分享
本文由亚马逊 MQ 的高级产品经理 Vignesh Selvam 和高级软件开发工程师 Simon Unge 撰写。
关键要点
亚马逊 MQ 现在支持仲裁队列,这是一种为提高可用性和数据安全性而设计的复制队列。仲裁队列使用 Raft 共识算法维护数据一致性,提供高可用性和容错能力。该队列适用于对数据持久性和一致性要求高的场景,如金融事务系统和电商数据处理系统。不建议在高队列更换率或对临时队列有需求的场景中使用仲裁队列。亚马逊 MQ 为开源 RabbitMQ 社区贡献了多个改进以增强仲裁队列的运营效率。仲裁队列概述
仲裁队列是一种由开源 RabbitMQ 提供的复制型先进先出队列,使用 Raft 共识算法 维护数据一致性。每个仲裁队列都有一个领导者和多个跟随者副本,确保消息在大多数节点之间复制和持久化,从而抵御节点故障。仲裁队列只需大多数成员节点即仲裁来做出有关数据的决策。如果宿主领导者的 RabbitMQ 节点变得不可用,另一台宿主跟随者节点会自动选为领导者。子节点可在恢复后重新成为跟随者,并与新的领导者同步。仲裁队列能够更快地检测网络故障,相比经典镜像队列更快速地恢复,从而增强消息中介的整体韧性。
仲裁队列共享 RabbitMQ 复制队列的主要功能,例如消费、消费者确认、取消消费者、清除和删除。处理毒性消息是仲裁队列的独特功能,它帮助开发者更有效地管理未处理的消息。毒性消息是指无法处理而被反复重新排队的消息。仲裁队列会跟踪未成功投递的次数,并在任何重新投递的消息中显示在 xdeliverycount 标头中。可以通过策略参数设置投递限制 deliverylimit。如果达到限制,消息可以被丢弃或放入死信队列。此功能进一步提高了仲裁队列的数据可靠性。
您可以通过在运行版本 313 及以上的 RabbitMQ 中显式指定 xqueuetype 参数为 quorum 来开始使用仲裁队列。我们建议您将默认虚拟主机队列类型更改为 quorum,以确保在虚拟主机中默认创建的所有队列都是仲裁队列。
何时使用仲裁队列?
当您需要更高的可用性和一致性时,应使用仲裁队列。仲裁队列特别适用于数据耐久性和容错至关重要的场景,例如金融交易系统、电子商务数据处理系统或任何要求高可靠性的应用程序。它们在节点故障更可能发生或者在分布式系统中维护数据一致性至关重要的环境中尤其有益。
何时不应使用仲裁队列?
仲裁队列不应被视为临时队列。它们不支持临时或独占队列,并不适用于队列更换率高声明和删除率的场景。同时也不建议用于未复制的队列。
仲裁队列的最佳实践
仲裁队列在队列较短时性能更佳。您可以通过政策或队列参数设置最大队列长度,以限制队列的总内存使用情况maxlength,maxlengthbytes。
亚马逊 MQ 建议发布者在仲裁队列上使用发布者确认,消费者使用手动确认。只有在成功复制到大多数节点且被视为在系统中安全时,发布者确认才会发出。此外,发布者确认可以作为一种回压形式,保护中介在高负载下的可用性。手动确认用于确保未处理的消息可以返回队列以供重新处理。
亚马逊 MQ 的开源改进
亚马逊 MQ 向开源 RabbitMQ 社区贡献了多个改进,以提高仲裁队列的运营效率。
自动成员资格调和仲裁队列依赖于大多数副本可用性来支撑 Raft 共识算法。亚马逊 MQ 发现许多用户和运营人员希望始终维护一定数量的副本通常为3个或5个,以确保始终有大多数存在。因此,仲裁队列的副本管理最初仅通过 CLI 工具提供。亚马逊 MQ 工程师引入了自动成员资格调和,以改善这一体验。现在,RabbitMQ 可以配置为识别任何低于目标成员大小的队列,并自动增加或添加节点,以确保始终存在一定数量的副本。

投票者状态RabbitMQ 将仲裁队列成员节点视为完全成员,即使该成员尚未赶上或完全同步到仲裁。CLI 命令 rabbitmqqueues checkifnodeisquorumcritical 可能会误导,表明某个节点可以安全移除,尽管另一个节点的队列成员仍在同步。亚马逊 MQ 引入了一种新的“非投票者”状态,来指示仍在赶上或同步到仲裁的成员节点。如果队列有处于此状态的成员,则不被视为完全成员。一旦成员完全同步,它会自动提升为投票者状态,并被视为完全成员。命令 rabbitmqqueues checkifnodeisquorumcritical 现在会考虑这一点,并正确报告节点能否安全终止而不会因失去大多数而使队列变得不可用。
不一致状态管理当中介过载时,仲裁队列可能会陷入不一致状态,即 Raft 状态机中存储的仲裁队列成员状态与 RabbitMQ 中队列的内部状态不同。亚马逊 MQ 引入了针对每个仲裁队列的定期检查,以识别队列是否处于不一致状态并采取措施加以修复。
默认队列类型RabbitMQ Broker vhost 的默认队列类型是经典队列。您可以通过显式声明 xqueuetype 作为队列创建参数来声明不同的队列类型。亚马逊 MQ 在配置文件rabbitconf中引入了全局默认队列类型,提供了在代理级别定义默认队列类型的能力。现在,如果在创建期间未指定,操作员可以将默认队列类型更改为仲裁队列。
成员管理权限RabbitMQ 用户可以使用管理 API 配置仲裁队列的成员资格,这可能会干扰自动成员资格调和。亚马逊 MQ 引入了允许操作员通过管理 API 关闭成员管理权限的能力,从而防止客户意外影响代理。
结论
RabbitMQ 的仲裁队列在需要高可用性和韧性的场景中提供了坚实的解决方案。通过利用 Raft 共识协议,仲裁队列确保消息在多数节点之间安全存储和复制,使其成为现代分布式消息队列系统的优秀选择。
亚马逊 MQ 建议您在 RabbitMQ 313 Broker 上采用仲裁队列作为首选的复制队列类型。有关更多详细信息,请查看 亚马逊 MQ 文档。想了解更多开源功能,请参见 仲裁队列。
只需几次 点击 即可开始使用适用于 RabbitMQ 313 的仲裁队列。
一元机场app官网下载
利用 Amazon SageMaker 的地理空间能力检测和高频监测甲烷排放点源 机器学习博客
监测甲烷排放源的检测与高频监控关键要点甲烷是主要的人为温室气体,全球变暖潜力是二氧化碳的86倍。早期检测和持续监控甲烷源是应对气候变化的重要环节。利用Amazon SageMaker的地理空间功能和S...