事务消息机制只能保证在生产者往消息中间件Broker发送消息的时候,消息不会丢失。
但是,消息在Broker机器上,因为配置异步刷盘的原因,以及没有多集群备份消息的情况下,消息还是会丢失。
通过事务消息的机制,最后会通过half消息+commit的方式,把消息在MQ提交到指定Topic的ConsumeQueue,这种情况下,消息就已经进入了MQ的存储层,并可以被消费者系统看到。
如果消费者系统还未拉取消息,同时消息也只单单存储在os cache中,还没进入到ConsumeQueue磁盘文件里,此时Broker机器突然宕机,os cache中的数据就会全部丢失。 —— 这种情况下必然就导致了消息的丢失,消费者系统也就无法拉取到这条消息了。 —— 解决方案:同步刷盘。只有消息进入磁盘才算消息写入成功。(broker配置文件, flushDiskType设置为SYNC_FLUSH(同步刷盘), ASYNC_FLUSH(异步刷盘))
同步刷盘:在发送half消息时候,只要MQ返回响应是half消息发送成功,那么久说明消息已经进入了磁盘文件了,不会停留在os cache里。
消息进入了磁盘也不能保证消息百分百不会丢失,可能磁盘损坏,那存储在磁盘里的消息也会丢失。——解决方案:使用Raft协议实现主从同步,完成消息的备份。 —— 保证一条消息写入成功,必须让Slave Broker也写入成功,保证数据有多个副本的冗余。