消息存储和清理
本主题描述了 Apache RocketMQ 如何存储消息,包括存储粒度、确定标准和处理策略。
背景信息
根据 Apache RocketMQ 中 消息队列 的定义,消息按消息到达代理的顺序存储在队列中。理论上,一个队列可以存储的消息数量是无限的。
在实际部署场景中,消息无法永久存储,因为代理的物理存储空间有限。因此,在部署消息时,您需要回答三个问题:什么标准用于确定如何在代理上存储消息?使用什么粒度来管理存储的消息?当消息存储使用量超过限制时,必须采取什么措施?Apache RocketMQ 的消息存储和清理机制为上述问题提供了答案。
您可以根据以下方面,使用消息存储和清理机制更好地执行 O\&M
存储 SLA:存储持续时间是指用户可以获取消息的时间段。此功能适用于需要较长消费时间、消息累积和需要故障恢复的场景。
存储成本的评估和控制:Apache RocketMQ 将消息存储在磁盘上。您可以提前评估存储空间并预留存储资源。
消息存储机制
工作机制
Apache RocketMQ 的每个节点都会将消息存储特定时间段。这段时间称为存储持续时间,用于确定消息存储多长时间。存储持续时间内的消息将被保留,而超过持续时间限制的消息将被清理,无论它们是否被消费。
以下部分描述了与消息存储机制相关的项目
管理粒度:Apache RocketMQ 基于节点管理消息存储持续时间。
确定标准:消息存储持续时间用作确定标准。与消息数量或大小相比,存储持续时间可以帮助您更有效地评估消息的值。
消息存储和消费状态无关:Apache RocketMQ 中的消息存储持续时间从消息生成的时间点开始,与消费状态无关。您可以使用统一的计算策略来简化消息存储机制。
下图显示了消息如何在队列中存储。
管理粒度
Apache RocketMQ 基于代理节点管理存储持续时间,原因如下
消息存储的优势:Apache RocketMQ 使用统一的二级组织方法来管理物理数据,该方法由物理日志队列和轻量级逻辑队列组成。这种方法提供了有序读写操作、高吞吐量和高性能的优势。但是,使用这种方法无法基于主题或队列管理消息存储。
容量保证和数据安全:即使 Apache RocketMQ 基于主题或队列生成独立的存储文件,但这些文件共享相同的底层存储介质。您可以以灵活的方式基于主题或队列管理存储持续时间。如果集群的存储容量不足,则可能无法满足存储 SLA。如果您想以安全的方式管理消息,最好的方法是在不同的集群中使用不同的存储持续时间来存储消息。
消息存储和消费状态之间的关系
Apache RocketMQ 以集中方式管理消息存储持续时间,无论消息是否被消费。
由于消费者不活跃或消费异常,消息可能会在队列中累积。目前还没有有效的解决方案。如果保留所有未消费的消息,存储空间将很快用完。这会影响新消息的读写操作速度。
消费者可以基于存储持续时间管理消息,以确定每条消息的生命周期。消费者可以在存储持续时间内的任何时间消费消息,或者使用 重置消费者偏移量 功能多次消费消息。
消息存储文件结构 Apache RocketMQ 消息默认存储在本地磁盘文件中,存储文件的根目录由配置参数 storePathRootDir 确定。存储结构如下图所示,其中 commitlog 文件夹存储物理消息文件,consumeCQueue 文件夹存储逻辑队列索引。
消息清理机制
在 Apache RocketMQ 中,消息的存储持续时间与实际存储持续时间不同。这是因为消息存储在本地磁盘中。当本地磁盘空间不足时,系统会强制删除消息以确保服务稳定性。因此,实际存储持续时间比指定的存储持续时间短。
Apache RocketMQ 存储系统基于阿里云的云原生技术开发。这允许所有实例使用存储空间,而不会对存储容量施加限制。所有消息都根据其指定的存储持续时间存储。您无需担心由于存储空间不足而导致的消息删除。
使用说明
根据您的业务需求增加存储持续时间
Apache RocketMQ 基于存储持续时间控制是否保留消息。我们建议您根据您的业务需求指定更长的存储持续时间。更长的存储持续时间可以让您有更多空间来执行紧急故障恢复、紧急故障排除和消息回溯的操作。