如何保证MQ幂等性?或 如何防止消息重复消费?
幂等性操作指的是多次操作同一个业务,但结果一样,比如删除和查询,但是新增和修改不行,他们会导致数据异常,解决方案有两种,一种是在业务中判断是否需要消费,另一种是设置消息的唯一ID,每条消息都生成一个唯一的id,消费者接收到消息后处理自己的业务,完成后将id保存到数据库或者redis,如果下次又收到数据库或redis中有的消息就放弃处理
如何保证消息的可靠性?可以百分百保证MQ的消息可靠性吗?
可以从三个方面来解决,生产者,MQ和消费者
生产者:1.Publisher Return,到达交换机了没有到队列的一种方案,会返回异常信息
2.Publisher Confirm,抵达交换机返回ack,没抵达返回nack。
MQ方面,为了提高性能MQ都是默认的临时数据,存在内存中,可以让他持久化来解决
消费者,需要向RabbitMQ发送一个回执,告知RabbitMQ消息处理状态
ack是成功,nack是失败,还有一种情况reject,是失败了还咀嚼该消息,因为很极端所以一般不用
但是说了这么多,这么多做法并不能百分百保证消息可靠性,毕竟你服务器烧了我也没办法