引言
在使用消息中间件的过程中,大家都希望消息能准确的发送到对应的消息服务器中,并且保证消息能正确消费。但使
用消息中间件的过程中,或多或少都会遇到不同的问题,常见的譬如:生产端的消息没有被发送到服务端导致丢失、消息
没有被消费端正确消费、消息重复推送给导致重复消费、消费消息太慢导致堆积在服务端过多使服务端压力过大等等。
本文主要介绍消息能够成功推送到服务端,保证消息能够不丢失。如果在服务端出现异常情况能够对消息进行异常处
理,并通过一些补偿机制来对该笔消息重新处理。
mandatory说明
相信大家在使用消息中间件过程中,会为了让消息保证推送到服务端或者消息队列中,做过不同的工作。 而作者在
设计消息中间件的时候也会考虑这些场景。比如kafka在为了保证推送到服务端的时候,可以通过制定不同的策略来提高
消息推送的成功率。一般有ack确认,如果没有收到ack确认则通过回调异常场景处理。而rabbitmq也有对应的操作,
通过设定参数manadatory,来完成消息推送。当mandatory标志位设置为true时,如果交换器根据自身类型和消息路
由键不能找到一个满足条件的队列,那么就会调用basic.return方法将消息返回给生产者,生产者就需要对该笔消息
重新处理或则自定义处理逻辑;而mandatory设置为false时,出现异常情况服务端会直接将消息扔掉。
immediate说明
对于immediate的使用,在rabbitmq 3.0.0及后续版本中已经抛弃了,但是使用方式是当immediate标志位设置为
true时,如果交换器根据自身类型和消息路由键在队列上不能找到一个消费者,那么这笔消息就不会存放到队列中。就会
调用basic.return方法将消息返回给生产者,生产者自定义处理逻辑;而immediate设置为false时,出现异常情况服
务端会直接将消息扔掉。