Rabbitmq消费失败死信队列

    xiaoxiao2022-06-29  49

    Rabbitmq 重消费处理

    一 处理流程图: 业务交换机:正常接收发送者,发送过来的消息,交换机类型topic

    AE交换机: 当业务交换机无法根据指定的routingkey去路由到队列的时候,会全部发送到AE交换机.发送到此队列的消息属于,业务垃圾消息,或者攻击消息类型,交换机类型fanout

    死信交换机:用于处理消费者,消费失败回退的消息,根据死信交换机的routingkey发送到死信队列,交换机类型 topic EXAMPLE: 业务routingkey: hello/task_queue 生产者发送routingkey: hello task_queue michael 最后业务交换机根据routingkey 会把匹配 hello 和task_queue的发送到业务队列1和业务队列2,michael routingkey没匹配,直接发送到AE交换机,AE交换机的类型为fanout,直接到了告警队列里面,这时候就说明,生产者有问题,或者有一些非法生产者在猜测routingkey,这时候就可以告警处理. 当正常的消息到了业务队列后,消费者监听这个队列进行处理,在消费者处理的过程中,难免会有一些消息处理失败,因为业务的种种原因,但是这些消息一旦失败,那么就会影响性能和后面的消息的消费,这时候就需要一个死信队列,来存放这个消费不了的消息,进入死信队列后,在进行其他处理. 消息消费失败处理方式: 一 进入死信队列(进入死信的三种方式) 1.消息被拒绝(basic.reject or basic.nack)并且requeue=false 2.消息TTL过期 3.队列达到最大长度 二 重新发布此消息到对应的队列(low)

    二 处理案例

    基础设置: 业务交换机设置: 设置AE交换机为alter 绑定routingkey到对应的队列 AE交换机设置,设置为internal,表示内部EXchange到EXchange,绑定需要接受的队列alter_message 三个队列都属于常规的队列,其中task_queue业务比较重要,当消费者消费失败的时候要回退到死信队列在进行处理! Task_queue设置 设置:x-dead-letter-exchange 指定死信送往的交换机 设置:x-dead-letter-routing-key 指定死信的routingkey (我在消费者处理失败的时候已经修改好了routingkey) 死信队列设置:因为是队列到exchange的所以不能把交换机设置成internal,设置匹配的routingkey,表示消费失败的消息队列,最好可以一眼看出,是什么队列消费失败,所以我这里设置了queue_name.fail 下面开始消息发送和观察现象: 我定义发送的消息和routingkey是一致的,这里我发送了三条消息,其中有两条设置了routingkey,另外一条没做routingkey. 可以看到匹配到routingkey的消息已经进入到了匹配的队列,没有匹配到的消息也就是michael,直接进入了告警队列.

    我这里打印的信息很多,但是可以看到hello这条消息时成功的被获取到和被消费掉了. 针对task_queue我做了特殊处理,匹配到了消息时task_queue就直接进入到死信队列里面,在程序里面消费的时候,可以捕获expection 然后进行退信处理.我这里用的是basic.reject和requeue=false进行处理的! 进过处理后可以看到task_queue的消息已经进入到了死亡队列里面,这样对于消费失败的消息,存放死信队列就成功了, 下面就是进入死信队列的消息,可以看到routingkey已经按照我们设置的 还有queue从哪个队列进来的和原始的routingkey还有一个就是reason表明消息时rejected.

    可以看到在警告队里里面的消息michael.

    所有所设置的功能已经实现! 

    转载请注明原文地址: https://ju.6miu.com/read-1124847.html

    最新回复(0)