知识卡片
持久化不是数据不丢的充分条件
内容
RabbitMQ的持久化分交换器、队列、消息三层,都设置为持久化才能保证服务重启后数据不丢——但即便三者都持久化,仍不能百分之百保证不丢消息:消费者若在autoAck=true下于处理消息前宕机,消息已被视为确认因而丢失;即便消息已存入RabbitMQ,写入操作系统缓存到真正落盘之间存在时间差,若此时节点宕机,尚未落盘的消息依然会丢。要进一步降低风险,需要配合镜像队列做副本(不丢消息与可用性的取舍见[[可用性与不丢消息的显式取舍开关]]),以及在发送端使用事务或publisher confirm机制([[确认机制吞吐量与复杂度权衡]])确认消息真正到达。发散:持久化常被误当作”数据安全”的代名词,但可靠性其实是发送确认、存储持久化、消费确认三个环节共同兜底的结果,任何一环缺失都会留下丢失窗口。
参考来源
《RabbitMQ实战指南》第4章《RabbitMQ进阶》