如何保证消息的可靠性传输(如何处理消息丢失的问题)
我们在使用MQ的时候有个原则:数据不能多一条,不能少一条,不能多就是不能重复消费以及幂等性问题。不能少,就是说这数据不能搞丢。 如果说我们是用mq来传递非常核心的消息,比如说计费扣费的一些消息,计费系统是很重要的一个业务,操作很耗时。实际上我们将计费系统做成异步化,然后中间就是加一个MQ。 以下是消息丢失的一些分析: 这个丢失数据,mq一般分为两种,要么是mq自己弄丢的,要么是我们消费的时候弄丢了。 rabbitmq这种mq,一般来说都是承载公司的核心业务的,数据是绝对不能弄丢的。 1.rabbitmq (1)生产者弄丢了数据 生产者将数据发送到rabbitmq的时候,可能数据就在半路给搞丢了,因为网络啥的问题,都有可能。 此时选择用rabbitmq提供的事务功能,就是生产者发送数据之前开启rabbitmq事务,然后发送消息,如果消息没有成功被rabbitmq接收到,那么生产者会收到异常报错,此时就可以回滚事务,然后重试发送消息;如果收到了消息,那么可以提供事务。但是问题是,rabbitmq事务机制一搞,基本上吞吐量会下来,因为太耗性能。 所以一般来说。如果我们要确保说写rabbitmq的消息别丢,可以开启confirm模式,在生产者那里设置开启confirm模式之后,你每次写的消息都会分配一个唯一的id,然后如果写入了rabbitmq中,rabbitmq会给你回传一个ack消息