正文
当master queue 所在节点宕机后,其正在被消费的消息的相关信息全部丢失,即服务端不知道消费者对那一瞬间消费的消息是否进行了ACK,所以在mirror queue被提升为master queue时,会把宕机前正在进行消费的的消息全部重新发送一遍,即客户端重连后,消息可能被重复消费,这个时候就必须依靠应用层逻辑来判断来避免重复消费。
在持久化方面,RabbitMQ的master queue每次收到新消息后,都会立刻写入磁盘,并把消息同步给mirror queue。假设在master queue 收到消息后,消息未同步到mirror queue 之前master queue 宕机,则此时mirror queue中就没有刚刚master queue收到的那条消息,当这个mirror queue被提升为master queue时,消费者连接到新的master queue上进行消费时就丢了一条消息。所以,RabbitMQ也会丢消息,只不过这个丢消息的概率非常低。
Kafka可靠性
我们知道Kafka中的每个队列叫做Topic,一个Topic有多个主分片和副分片,当主分片所在机器宕机后,服务端会把一个副分片提升为主分片,如下图所示。