24.实践技巧

予早 2025-08-31 14:59:19
Categories: Tags:

批量删除队列

删除以hello开头的queue

由于list_queues会列出队列名称以及对应的消息数目,需要过滤掉消息数目,配合awk命令只取第1列

 rabbitmqctl list_queues| grep ^hello | awk '{print $1}' | xargs -n1 rabbitmqctl delete_queue

使用过期策略删除队列

# 设置规则
rabbitmqctl set_policy delete_gen "amq.gen-.*" '{"expires":1}' --apply-to queues
# 取消规则
rabbitmqctl clear_policy delete_ge

也可以在 UI 界面上 Admin 中进行操作,注意添加完毕后删除策略

使用手动 ACK 而不是 自动 ACK

自动 ACK 时,只要消息被消费者接收就会进行 ACK,若消息处理中途宕机,无法再次处理该消息,相当于丢失处理一条消息

nack 时 requeue 不要设置为 true

假设某消息队列有三个消费者,每个消费者 Qos 均为 5,那么假设有一个消息消费失败,则 nack 且 requeue 该消息,若随后依然消费失败,就构成 消费失败-requeue-消费失败的循环,如果有15个这样的消息,就会阻塞所有消费者,导致队列消息堆积

消费者预取若干消息,这些消息便不计入ready消息总数,不会被其它消费者获取

若获取到这些消息的消费者没有ack,随后断开连接,那么这些消息恢复为ready状态数据,注意ack之前消息并没有被从队列中删除

消费者宕机后,消息不是重新入队而是从untrack变为ready,当然重新投递标记为被置为True,在队列中的顺序还是原来的顺序

reject和Nack的差别只有一种 :reject一次只能拒绝一条消息,Nack支持批量拒绝。

nack时,若requeue为false,这条消息会进入死信队列,若requeue为true,那么就是消息状态从untrack恢复到ready,顺序还是原来的顺序