那些年学过的消息队列(4) | 青训营

55 阅读2分钟

上一节消息队列的内容和大家介绍了一些Exchange概念知识,本节主要想和大家分享一下RabbitMQ生产端是怎么保障消息可靠传输的。

消息如何保证100%投递成功

需要保证消息的成功发送;保障MQ节点的的成功接收;发送端收到MQ节点确认请求;完善的消息进行补偿机制

大厂解决可靠性传递主要的两种方式:

  • 消息落库,对消息状态进行打标
  • 消息的延迟投递,做二次确认,回调检查

消息落库,对消息状态进行打标

这个过程首先不是发送消息,而是将数据写入到数据库中,当数据库中写入成功以后才会将消息发送到消息队列中,然后生产者中的confirm listener监听是否发送给broker成功,当broker回复一个确认发送成功以后,异步处理这个过程,将MSG DB中的状态修改为1;如果网络波动等原因导致broker会送消息的时候listener没有收到确认消息,这时分布式定时任务会将status取出进行重新发送,直到发送成功,但是这个分布式任务会这只重试的次数。

消息的延迟投递,做二次确认,回调检查

上面介绍的第一种方式保障消息的可靠投递,在高并发场景并不适用,因为需要两次数据库的操作,高并发的场景下,需要尽量减少数据库的写入操作,所以有了以下的延迟投递,主要是为了减少数据库的操作提高性能,只对业务进行落库。

首先在发送消息之前,会将业务消息落入数据库中,一定先落库在发送消息,发送第一个消息到消息队列服务器后,第二条消息是延迟投递到消息队列服务器中,第三步则是消费端将监听到的消息消费以后,重新生成一个消费成功消息回送给消息队列中,回调服务会监听确认消息有没有收到,如果一直没有监听到confirm消息此时延迟消息就起作用,回调服务会check detail查看延迟消息,这时就会进行补偿,此时回调服务会发送一个RPC请求,让生产者重新走一遍发送流程。