当前位置: 首页 > news >正文

【星海出品】RabbitMQ 死信 - 教程

【开篇一段小独白】

今天想专门开一期讲一下死信,基于我记得在我刚毕业的时候,面试会有一些大厂面试,暴露了最近几年没有大厂面试了【】

所以这里问一下
特别钟爱面试刚毕业的大学生。就是Q:大厂是不
A:评论区告诉我

注: 任何真理都是有 时间、空间 和 对象限制的。
当前时间:2025年9月26日


死信

一项比较高级的功能,一般小微企业和初级工程师很难遇到,比如小微企业业务单一,很难出现无法消费的消息,又或者初级工程师不会用到 高级功能 既短期无法消费重新入队,等待其他进程消费后再消费的功能。就是死信 其实

【死信】顾名思义就是没办法被消费的消息。
一个需要注意的指标:TTL(Time To Live)

指消息在队列中可能存活的时间,假设消息在队列中存活的时间超过了TTL,那么消息就会被标记为死信,继而进入死信队列

【死信的存在】
通过 先入先出 的处理模型,所以能够有效的调整代码运行顺序。就是来源于异步任务中,需要大量的颗粒度代码入队,但是代码存在顺序性,也就是收到该任务的key和关键字,判断其前置条件,如果没有完成则使其重新入队,因为 队列的特性

但是如果超过了TTL 的时间,则会将这个消息放入死信队列

我们许可设置一个时间,比如我们想让这个消息延迟10分钟再发送到死信队列中,那么我们就可以将这个消息发送到延迟队列中,然后定时去消费延迟队列中的消息,然后进行相应的处理

有些人初级工程师可能会说我这边服务器内存足够直接调用 restful API 不就好了,为什么需要前置队列。
A:

1.最初有前置队列行搭建耗时任务的解耦,不会占用大量的时间去等待,当然接收消息后也允许去发送后台进程去完成,只是如果不解耦那么就需要对整个代码进行调整,增大了开发周期,尤其是代码越来越大的时候,有时候可能你写的函数会被别人复用,那么你要怎么改怎么调整,为了快捷可能就是复制粘贴一块代码改个名字继续修改,好了,你的代码成功变成了屎山代码。
2.分布式的合作,任务颗粒度的入队处理。
3.解决端口及单点压力处理复杂的网页业务场景。

通过比如: netstat -an 能够查看 大量TIME_WAIT连接:127.0.0.1本地环回接口存在大量TIME_WAIT状态(如127.0.0.1:56778 -> 127.0.0.1:8000),表明短连接未复用,可能触发TCP端口耗尽(Linux默认本地端口范围32768-60999,约2.8万可用)。
CLOSE_WAIT堆积:存在多条CLOSE_WAIT记录(如127.0.0.1:51920 -> 127.0.0.1:8000),说明服务端已关闭连接但客户端未发送FIN,可能由客户端超时或网络中断导致。
本地127.0.0.1:8000与多个客户端端口建立ESTABLISHED连接,暗示服务端内部处理队列可能积压(如线程池饱和、数据库查询慢)。

【DLX(死信交换机)】是RabbitMQ中用于处理消息过期或被拒绝后转发的机制,结合消息TTL(生存时间)和死信队列可实现延迟消费功能。
实现:
死信队列(DLX):当消息满足特定条件(如被拒绝、TTL 过期、队列满)时,RabbitMQ 将其重新路由到一个指定的 Dead Letter Exchange(死信交换机),再由该交换机根据绑定规则投递到对应的“死信队列”。

比如:
被消费者拒绝 调用 basic.reject 或 basic.nack 且 requeue=false
TTL(生存时间)过期 消息或队列设置了 x-message-ttl,超时未被消费
队列达到最大长度 队列设置了 x-max-length,新消息无法入队

创建死信交换机和队列‌
设置死信路由键(如deadExchange),并指定x-dead-letter-exchange参数为该死信交换机。 ‌
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
# 1. 创建死信交换机(Topic 类型)
channel.exchange_declare(exchange='dlx_topic_exchange', exchange_type='topic')
# 2. 创建死信队列
channel.queue_declare(queue='dead_letter_queue')
# 3. 绑定死信队列到 Topic 交换机(使用通配符)
channel.queue_bind(
exchange='dlx_topic_exchange',
queue='dead_letter_queue',
routing_key='dead_letter.*'  # 匹配所有死信消息
)
# 4. 创建主队列,指定死信交换机
channel.queue_declare(queue='main_queue', arguments={

'x-dead-letter-exchange': 'dlx_topic_exchange',      # 指向 Topic 交换机
'x-dead-letter-routing-key': 'dead_letter.orders'    # 设置死信路由键
})
connection.close()
# 监控死信队列消息
http://www.jsqmd.com/news/6342/

相关文章:

  • 【研发规范】Git 提交(commit)、CodeReview规范
  • Windows 11 局域网打印机共享设置
  • DailyPaper-2025-9-29
  • MySQL版本选择
  • gpd winmax2 fedora42 睡眠秒唤醒问题
  • 国企人力资源管理系统怎么选?内行人推荐这8款,功能、服务双保障
  • linux查询磁盘空间,查询指定目录的空间 df命令
  • milvus使用的etcd空间整理
  • k8s使用的etcd空间清理
  • MyBatis 与 JPA 的核心对比
  • 完整教程:Redis 提供了两种主要的持久化机制:RDB 和 AOF
  • 本土化战略赋能:Gitee如何领跑中国DevOps黄金赛道
  • 打印机错误0x0000709,问题排查和修复指南
  • 2025.9.29 测试
  • 深度学习(CVAE)
  • c# aot orm 框架测试 mysql
  • 深入解析:论文阅读:硕士学位论文 2025 面向大语言模型的黑盒对抗性攻击与防御关键技术研究
  • VC++ 使用OpenSSL创建RSA密钥PEM档案
  • CF1699D Almost Triple Deletions
  • QMT回测模式为什么要在副图进行
  • 详细介绍:支持17种方言10种外语!阿里最新AI语音合成模型Qwen3-TTS-Flash震撼发布
  • 判断权限通过遍历二叉树路由删除权限不展示的前端组件
  • DSA:DeepSeek Sparse Attention
  • 荒野猎手出击!启明智显ZX7981PO:专治各种恶劣环境的5G插卡路由器
  • AWS CDK重构功能发布:安全重构基础设施即代码
  • 开发即时通社交软件APP首选系统,可定制开发,可提供源码
  • 死锁的处理策略-死锁的检测和解除
  • 实用指南:上下文工程驱动智能体向 “连续性认知”跃迁
  • 实用指南:基于STM32单片机的OneNet物联网粉尘烟雾检测系统
  • springboot3 mybatis 数据库操控入门与实战