在开关插件等可能造成实例重启的场景下,或在小概率的服务异常场景中,如果未配置数据持久化,则可能有数据丢失的风险。本文档演示如何配置数据持久化。
数据持久化指将保存在内存中的数据写入到磁盘上进行长期存储。在消息队列 RabbitMQ版中,持久化或非持久化的消息都会被写入到实例磁盘中,但是在实例重启、更配、服务异常等场景下,未持久化的消息有一定几率被意外删除。配置数据持久化可以提高消息队列 RabbitMQ版实例的可靠性,在异常场景中防止数据意外丢失。在金融业务等对数据可靠性要求较高的场景中,推荐配置数据持久化,提高数据可靠性。
RabbitMQ 数据持久化的方式包括 Exchange 持久化、Queue 持久化和 Message 持久化。推荐全部配置,保障绝大多数的异常场景下不丢失消息。
Queue 和 Message 的持久化设置保障消息的可靠性。Exchange 的持久化保障了 Exchange 在实例重启后仍在存在。如果未设置 Exchange 持久化,服务重启可能导致 Exchange 信息丢失、消息发送者 Producer 无法正常发送消息。
在 RabbitMQ WebUI 中创建 Exchange 时,将 durable 参数设置为 true,表示开启 Exchange 的持久化。
完成配置后,参数属性如下:
Queue 的持久化标识为 durable。当 Queue 的 durable 设置为 true 时,表示开启队列的持久化。配置后,后端服务会将持久化的队列保存在实例磁盘中,RabbitMQ 实例重启后,后端服务会重新加载这些队列,所以持久化的队列仍然会存在。
您可以在 RabbitMQ WebUI 中创建 Queue 时,将 durable 参数设置为 true,开启队列的持久化。
配置示例如下:
完成配置后,参数属性如下:
重启之前队列中如果还存在尚未发送的消息,重启之后消息是否还在队列中保存,取决于发送消息时的消息持久化设置。所以配置队列持久化之后,还需要配置消息的持久化。
注意,由于数据写入磁盘的速度比写入内存的速度慢,大量消息持久化会影响 RabbitMQ 实例的性能。在发送持久化消息时,建议根据业务需求在数据可靠性和吞吐量之间进行权衡。
发送消息时,设置消息的持久化标识,表示设置消息的持久化。消息持久化的详细设置方式请参考 RabbitMQ 官方文档。
以下代码为通过客户端 Java SDK 发送持久化消息的代码示例:
channel.basicPublish("", "test-queue", MessageProperties.PERSISTENT_TEXT_PLAIN, messageBytes);