RabbitMQ死信队列实战:从概念到配置,解决消息丢失问题
做后端开发的兄弟多半都遇到过这种诡异场景消息明明发出去了日志也显示发送成功可业务数据就是少了那么一条。翻遍日志、查遍网络最后才发现是 RabbitMQ 在消息出问题的时候悄悄把它给处理掉了。如果你还没接触过死信队列这篇文章建议认真读完。死信队列是 RabbitMQ 里非常实用又容易被忽略的机制核心作用就是接住那些不该被正常消费的消息给系统一个统一的兜底处理入口。我会从死信队列的基础概念讲起再到创建配置的完整实操最后把实际项目里踩过的坑一并分享出来。适合正在用 RabbitMQ 做异步消息、又对消息可靠性心里没底的开发者。1. 死信队列到底是啥概念先行别急着写代码1.1 死信的定义什么样的消息会被判定为死信死信直译过来就是死掉的信件。在 RabbitMQ 里消息本身不会主动说自己死了而是当它处于某种无法被正常消费的状态时由队列判定为死信。具体来说以下三种情况最常见消费者主动拒绝消费者收到消息后调用basic.reject或basic.nack拒绝并且把requeue参数设为false也就是明确告诉 RabbitMQ这条消息我不处理也别放回队列了。此时消息成为死信。消息超过有效期TTL消息在队列里等待消费的时间超过了预设的有效期系统判定它已经过期。队列超过长度上限队列设置了最大长度如x-max-length当队列已满时再有新消息进来队头最老的消息会被挤出去成为死信。这里有个关键点要先说清楚如果承载死信的队列没有配置死信交换机Dead Letter ExchangeDLX那这些死信消息就会被 RabbitMQ 直接丢弃就像扔进垃圾桶一样没有任何痕迹。而配置了 DLX 之后消息才有机会被转发到另一个队列——也就是标题里说的死信队列。死信队列本身并不是一种特殊的队列类型它就是一个普通队列只不过专门用来接收从业务队列里淘汰出来的消息。1.2 死信队列能解决什么实际问题死信队列最直接的价值是给消息一个善后的通道。没有它消息丢失了就只能靠人工去看日志、捞数据有了它所有异常消息都会集中到一个地方方便跟踪、排查和补偿。举个例子电商下单后如果 30 分钟未支付订单要自动取消。常见做法是下单时发一条延迟消息等 30 分钟后消费者去检查订单状态。如果直接消费这条消息去关单万一订单服务正忙呢更稳的做法是把这条消息投递到一个设置了 30 分钟 TTL 的业务队列消息过期后自动进入死信队列再由死信消费者去执行关单逻辑。这样延迟触发和业务处理就解耦了消息不会提前被消费也不会因为等待而阻塞其他消息。另一个典型场景是异常补偿。业务消费者处理消息时如果抛异常可以把消息拒绝并让它进入死信队列由专门的程序去处理记录日志、发送告警或者稍后手动补偿。比起在业务消费者里写一堆catch和重试逻辑这种方式更干净也更方便统一治理。1.3 为什么很多团队一开始没感受到它的价值说实话在一个消息量小、业务简单的系统里死信队列的收益不明显。消息丢了就丢了重发一次就行。但系统一旦复杂起来消息成千上万消费者五花八门各种超时、序列化失败、业务校验不通过都会冒出来。这时候如果没有死信队列你连哪些消息处理失败了都不知道更别提定位原因。死信队列本质上是一层消息安全的兜底网它不是锦上添花而是消息系统走向成熟之后必须补齐的一块。2. 核心机制拆解TTL、DLX 与 DLK 之间的配合逻辑2.1 消息过期机制TTL 的两种设置方式TTLTime To Live是触发死信最常见的手段。RabbitMQ 支持两种粒度队列级 TTL声明队列时加上x-message-ttl参数单位毫秒。比如设为30000这个队列里所有消息都必须在 30 秒内被消费否则过期。这种方式适合这个队列里所有消息有效期都一样的场景。消息级 TTL在发送消息时给消息属性里的expiration字段设置一个毫秒值。这样同一条队列里的不同消息可以有不同的有效期。这两种可以同时设置以两者中较小的值为准。比如队列 TTL 是 30 秒某条消息自己设置的expiration是 10 秒那这条消息 10 秒就过期了。一个容易被忽略的细节RabbitMQ 并不保证过期消息会被立刻清除。它判断过期消息的时机是消息到达队列头部并在被投递之前。如果队列头部的消息还没过期排在它后面的消息就算已经过期了也得等排到头部才会被处理。这个特性在消息积压多的队列里尤其要留意别指望 TTL 一毫秒不差。2.2 死信交换机 DLX消息被抛弃之后往哪走DLX 就是一个普通的交换机类型可以是 direct、topic、fanout 都可以。它没有特殊的实现唯一的特殊之处在于某个队列把它设置为自己的死信交换机之后一旦该队列里的消息变成死信消息就会被重新发布到这个 DLX再由 DLX 根据路由键投递给绑定它的队列。配置 DLX 的方式是在声明业务队列时加上x-dead-letter-exchange参数值就是交换机的名字。这个动作是在队列上做的不是在交换机上做的。很多人第一次会搞反以为要在 DLX 上配置点什么其实不需要。队列在创建时把 DLX 的名字记下来之后死信消息就交给这个名字对应的交换机。2.3 死信路由键 DLK路由规则的关键点光有 DLX 还不够交换机怎么知道把死信消息投给哪个队列这就需要死信路由键Dead Letter Routing KeyDLK。在声明业务队列时可以通过x-dead-letter-routing-key参数来指定。如果不设置RabbitMQ 会使用消息原来的路由键也就是生产者发送时用的 routing key。这里坑很多。比如业务消息的 routing key 是order.create死信交换机绑定死信队列时用的 binding key 是order.dead如果死信路由键没有单独设置消息还是会带着order.create去匹配结果匹配不上死信消息在交换机里被丢弃。所以实操时要么在业务队列显式设置x-dead-letter-routing-key要么让死信交换机的绑定键和业务 routing key 保持一致。很多死信队列收不到消息的问题根因就是这里。2.4 为什么要用 DLX 而不是直接丢弃有人会问既然消息都死了直接扔掉不就行了干嘛还要专门配一套交换机、路由键、队列答案是丢弃是最省事但也最不负责任的做法。生产环境里消息可能承载着订单、支付、积分等核心业务。一条消息处理失败背后可能是一笔钱没到账、一个订单没发货。如果直接丢弃没有任何记录事后连问题都复盘不了。用 DLX 转发到死信队列至少做到了三点保留消息现场可以查到原始内容和失败原因、提供统一处理入口死信消费者集中处理、支持后续补偿人工或者自动补发。这套机制让消息系统从不知道丢没丢变成丢了也能找到。3. 创建配置全流程实操从零搭一个死信队列3.1 准备工作环境、依赖和基础认识实操前先确认环境。我这里用的方案是 RabbitMQ 3.x Spring Boot 2.x spring-boot-starter-amqp这也是后端团队最常见的组合。首先是依赖在pom.xml里加dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-amqp/artifactId /dependency然后在application.yml里配置连接信息spring: rabbitmq: host: 127.0.0.1 port: 5672 username: guest password: guest virtual-host: /RabbitMQ 的管理控制台默认在 15672 端口可以用它观察队列、交换机和绑定关系后面验证环节会用到。3.2 核心配置声明交换机、业务队列和死信队列在 Spring Boot 里声明这些组件最常用的方式是写一个配置类用Bean注册交换机、队列和绑定关系。我直接贴一个完整配置注释里写清楚每个部分的作用Configuration public class RabbitDeadLetterConfig { public static final String BUSINESS_EXCHANGE business.exchange; public static final String BUSINESS_QUEUE business.queue; public static final String BUSINESS_ROUTING_KEY business.routing.key; public static final String DLX_EXCHANGE dlx.exchange; public static final String DLX_QUEUE dlx.queue; public static final String DLX_ROUTING_KEY dlx.routing.key; // 1. 声明业务交换机direct 类型 Bean public DirectExchange businessExchange() { return new DirectExchange(BUSINESS_EXCHANGE); } // 2. 声明业务队列绑定额外参数死信交换机 死信路由键 Bean public Queue businessQueue() { return QueueBuilder.durable(BUSINESS_QUEUE) .deadLetterExchange(DLX_EXCHANGE) .deadLetterRoutingKey(DLX_ROUTING_KEY) .build(); } // 3. 将业务队列绑定到业务交换机 Bean public Binding businessBinding() { return BindingBuilder.bind(businessQueue()) .to(businessExchange()) .with(BUSINESS_ROUTING_KEY); } // 4. 声明死信交换机 Bean public DirectExchange dlxExchange() { return new DirectExchange(DLX_EXCHANGE); } // 5. 声明死信队列 Bean public Queue dlxQueue() { return QueueBuilder.durable(DLX_QUEUE).build(); } // 6. 将死信队列绑定到死信交换机绑定键必须与死信路由键一致 Bean public Binding dlxBinding() { return BindingBuilder.bind(dlxQueue()) .to(dlxExchange()) .with(DLX_ROUTING_KEY); } }注意第 2 步和第 6 步的对应关系业务队列声明的deadLetterRoutingKey是dlx.routing.key死信交换机绑定队列的 binding key 也是dlx.routing.key。两者一致死信消息才能被成功路由。我在这个配置里没有在队列层设置 TTL因为延迟时间更希望通过发送消息时单独控制灵活一些。如果你的业务所有消息统一延迟可以把.ttl(30000)也加到QueueBuilder上。这里补一句Spring Boot 的RabbitAdmin会自动把这些Bean声明的交换机、队列、绑定关系在应用启动时注册到 RabbitMQ 上所以不需要手动去控制台创建。这也是很多团队喜欢用代码管理 RabbitMQ 资源的原因避免开发和测试环境资源不一致。3.3 生产者发送一条带过期时间的消息业务队列本身没有 TTL 时延迟时间靠生产者设置。用RabbitTemplate发送时通过MessageProperties指定expiration属性Service public class MessageProducer { private final RabbitTemplate rabbitTemplate; public MessageProducer(RabbitTemplate rabbitTemplate) { this.rabbitTemplate rabbitTemplate; } public void sendDelayedMessage(String content, long ttlMillis) { MessageProperties properties new MessageProperties(); // 设置消息过期时间单位毫秒字符串形式 properties.setExpiration(String.valueOf(ttlMillis)); Message message new Message(content.getBytes(StandardCharsets.UTF_8), properties); rabbitTemplate.send( RabbitDeadLetterConfig.BUSINESS_EXCHANGE, RabbitDeadLetterConfig.BUSINESS_ROUTING_KEY, message); System.out.println(消息已发送: content , TTL ttlMillis ms); } }有几个细节值得说明。setExpiration接收的是字符串不是 long这是一个很容易踩的坑赋值时一定要String.valueOf。另外如果同时设置了队列级 TTL 和消息级 TTL以较小的值为准消息进入死信队列后原来的expiration属性会被移除避免二次过期造成混乱。3.4 消费者业务处理和死信处理分开业务消费者负责处理正常消息遇到处理失败的情况要让消息进入死信队列就不能简单地记录日志后手动 ack。正确做法是抛出一个让 Spring AMQP 拒绝消息的异常Component public class BusinessConsumer { RabbitListener(queues RabbitDeadLetterConfig.BUSINESS_QUEUE) public void handleBusinessMessage(String content, Channel channel, Message message) { try { // 这里模拟业务处理 System.out.println(处理业务消息: content); if (content.contains(error)) { throw new RuntimeException(模拟业务处理失败); } } catch (Exception e) { // 抛出该异常后Spring AMQP 会 basic.reject 并且 requeuefalse // 消息不会回到业务队列而是进入死信队列 throw new AmqpRejectAndDontRequeueException(e); } } }死信消费者就简单多了它的职责很单一接收死信消息记录现场、告警、或者进入人工补偿流程Component public class DeadLetterConsumer { RabbitListener(queues RabbitDeadLetterConfig.DLX_QUEUE) public void handleDeadMessage(Message message) { String body new String(message.getBody(), StandardCharsets.UTF_8); System.out.println(收到死信消息: body); System.out.println(死信原因: message.getMessageProperties().getHeader(x-first-death-reason)); } }这里用到了x-first-death-reason这个 header它记录了这条消息第一次变成死信的原因可选值有expired过期、rejected被拒绝、maxlen队列溢出。这个信息对排查非常有用建议死信消费者至少把它记到日志里。3.5 验证全流程消息是怎么一步步走进死信队列的配置和代码都写好之后实际跑一遍验证。我通常在管理控制台直接观察。流程如下启动应用到控制台的 Queues 页面能看到business.queue和dlx.queue两个队列Exchanges 页面有business.exchange和dlx.exchange。调用生产者的接口发送一条内容为normal的消息再到 Queues 页面点business.queue能看到 Ready 状态有一条消息。等待消息过期或者故意不启动业务消费者观察business.queue的 Ready 数量变成 0dlx.queue的 Ready 数量变成 1。这说明消息已经成功进入死信队列。启动死信消费者控制台输出收到死信消息整个链路闭环。如果是通过消费者拒绝触发的死信处理方式类似发送一条带error关键字的消息业务消费者会抛出AmqpRejectAndDontRequeueException消息进入死信队列。整个过程不需要重启服务RabbitMQ 的动态特性允许运行时改变消息流向这也是为什么死信机制在生产环境非常实用。4. 常见问题与排查技巧实录4.1 高频问题速查表直接把我在项目里遇到的高频问题整理成一张表方便对照排查。现象可能原因排查与解决死信队列一直收不到消息队列没配x-dead-letter-exchange或死信路由键与绑定键不一致在管理控制台查看队列 Arguments确认dead-letter-exchange和dead-letter-routing-key是否正确再查交换机绑定关系消息在业务队列里消失了但死信队列也没有队列没有配置 DLX消息被直接丢弃给业务队列补上 DLX 配置或者用 Tracing 插件观察消息走向死信消息路由不到死信队列死信交换机类型与绑定方式不匹配比如交换机是 fanout 却绑了 routing key确认交换机类型fanout 忽略路由键direct/topic 必须路由键匹配过期时间不生效消息迟迟不进入死信队列队列头部有大量未过期消息过期消息排在后面这是 TTL 判断机制的特性结合max-length和其他手段控制或者发送时就把过期时间设准确消息被重复消费消费者里捕获异常后没有重新抛出又手动 ack 了不要吞异常确认 ack 模式需要重试的场合专门设计重试队列死信消息的原始业务参数看不到查看消息 headers不要只看 body死信消息 body 不变但 headers 里新增了x-death、x-first-death-reason等字段4.2 几个容易踩的坑第一个坑是死信交换机没绑定任何队列。配置类里如果只声明了 DLX 交换机、没有声明绑定关系死信消息照样会被丢弃。RabbitMQ 的规则是交换机必须能路由到至少一个队列消息才会被投递路由不到就丢弃。很多第一次配置的人以为声明了 DLX 就万事大吉结果死信队列空荡荡。这个坑我建议在写完配置后立刻去控制台的 Exchanges 页面点开dlx.exchange看 Binding 列表确保有绑定。第二个坑是消息级 TTL 的单位和格式。setExpiration的参数是字符串值是多少毫秒就是多少毫秒。曾经有同事把30000写成了30结果消息 30 毫秒就过期了业务还没开始处理就进了死信队列排查了半天才发现是这个低级错误。第三个坑是死信消息进入死信队列之后如果死信队列也满了消息会被继续丢弃。死信队列本身是个普通队列它同样可以有 TTL、max-length参数甚至也可以配置自己的 DLX。如果业务量大、异常多建议把死信队列的容量监控起来别让兜底机制自己先死了。第四个坑是关于requeue的认知。很多人以为消费者抛异常消息就会自动进入死信队列其实不一定。Spring AMQP 默认的异常处理会根据监听容器设置决定消息是否重新入队。如果容器配置了defaultRequeueRejectedfalse异常消息才会被拒绝并不入队从而触发死信如果没配置部分异常会让消息反复重新入队造成无限循环消费。所以要么显式抛AmqpRejectAndDontRequeueException要么在容器工厂设置defaultRequeueRejected(false)。4.3 排查工具和习惯日常排查死信问题我习惯按这个顺序来打开管理控制台先看 Queues 页面里各队列的 Ready/Unacked 数量判断消息卡在哪一环。点开具体队列的 Arguments看x-dead-letter-exchange和x-dead-letter-routing-key是否齐全。点开交换机页面的 Binding 列表确认绑定键和死信路由键能不能匹配上。如果还找不到原因用 RabbitMQ 的 Tracing 插件开启追踪观察消息的 publish、deliver、reject 轨迹。这套流程基本能覆盖绝大多数死信队列问题。比直接翻业务日志快得多因为消息的生死发生在 Broker 这一层业务日志根本看不到。5. 写在实际项目之后的一点经验最后聊点个人体会。死信队列这东西配置本身不复杂真正考验人的是出了死信之后怎么办。我在实际项目里的习惯是每个业务队列都配 DLX但死信消费者不参与核心链路它只做三件事——记录、告警、标记。记录是把死信消息的 body、headers、失败原因落库方便事后查证告警是死信一旦出现就通知值班的人不能让它默默堆积标记是把死信做成可追踪的状态后续如果写补偿脚本可以按状态捞出来处理。另外一个建议是别把死信队列和重试逻辑混为一谈。死信队列是最后一道防线重试是故障恢复手段。优先做好消费重试实在不行再进死信队列。把两者分开设计系统才不会在极端情况下出现消息风暴。这套机制我用了很久最直观的收益是以前出了问题靠猜现在出了问题有据可查。希望这篇 RabbitMQ 死信队列的基础概念与创建配置能帮你把消息这块短板补上。

相关新闻

Linux网络编程实战:从HTTP到自定义TCP协议的计算器重写

Linux网络编程实战:从HTTP到自定义TCP协议的计算器重写

最近我把一个经典的“网络版计算器”小项目从HTTP JSON接口重写成了纯Linux下的自定义TCP协议版本。这个项目几乎每个学C语言网络编程的人都会遇到,但大多数实现都是直接拼一个HTTP请求、用JSON做序列化,真正卡住人的地方反而不是计算逻辑,而…

2026/10/10 16:48:16 阅读更多 →
SpringBoot+Vue+MySQL文物征集管理系统设计与实现全解析

SpringBoot+Vue+MySQL文物征集管理系统设计与实现全解析

做毕设或者课程设计,选管理系统项目是一个非常稳妥的方向,而“SpringBoot Vue MVC Java MySQL”这套组合,基本算是全栈入门项目的黄金搭配。但大多数同学在网上找到的源码要么过于简陋,要么结构混乱只能跑通却讲不清原理。这篇…

2026/10/10 16:48:16 阅读更多 →
被误读的AGI声明:黄仁勋的真实立场与AI工程化评测方法

被误读的AGI声明:黄仁勋的真实立场与AI工程化评测方法

如果你最近在技术圈刷到过这样一条消息——Nvidia CEO 说“我们已经实现了 AGI,但这并不重要”——先别急着转发,也别急着站队。因为这个标题大概率是二手转述的产物,语境已经被裁剪掉了。从目前可查的公开演讲和报道看,黄仁勋并没…

2026/10/10 16:47:14 阅读更多 →

最新新闻

GPU算力怎么选?从并行计算到AI大模型实战指南

GPU算力怎么选?从并行计算到AI大模型实战指南

今年明显感觉身边聊GPU算力的人变多了。以前大家问显卡,翻来覆去就是“能不能流畅玩XX游戏”“帧率多少”,现在画风完全不一样了,开口就是“这卡能跑多少B参数的模型”“显存够不够微调”“深度学习吃不吃得消”。说白了,不管游戏…

2026/10/10 21:45:34 阅读更多 →
人脸识别门禁考勤系统毕设实战:OpenCV+MTCNN+FaceNet全解析

人脸识别门禁考勤系统毕设实战:OpenCV+MTCNN+FaceNet全解析

简介:一套完整的人脸识别系统毕业设计资料包,面向计算机视觉、图像处理与模式识别方向的本专科学生,尤其适合需要完成从算法原理到工程实现全流程毕业设计的读者。压缩包共80个文件,约2.18MB,以C源码为主,包…

2026/10/10 21:45:34 阅读更多 →
Agent Router 免费接入 codex、claude 后,如何把 API Key 配置到 CC Switch

Agent Router 免费接入 codex、claude 后,如何把 API Key 配置到 CC Switch

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 21:45:34 阅读更多 →
Operator 之后,开源社区半年追平 OpenAI:『看屏操作』CUA 开源化全面复盘

Operator 之后,开源社区半年追平 OpenAI:『看屏操作』CUA 开源化全面复盘

Operator 之后,开源社区半年追平 OpenAI:『看屏操作』CUA 开源化全面复盘 【免费下载链接】cua Scale computer-use 2.0 with open-source drivers, cross-OS fleets, and benchmarks for training, evaluation, and data generation. 项目地址: https…

2026/10/10 21:45:34 阅读更多 →
红黑树原理与实现:从2-3-4树到插入删除,对比B+树

红黑树原理与实现:从2-3-4树到插入删除,对比B+树

红黑树这名字起得挺贴切,它确实是一门“平衡的艺术”。但这门艺术折磨过的人也不少——网上关于红黑树的博客一搜一大把,有人上来就甩五个性质,有人画各种旋转图,你从头看到尾,脑子说懂了,手一写代码就懵。…

2026/10/10 21:45:34 阅读更多 →
ComfyUI 零插件跑通 H3:文生视频、图生视频、首尾帧一条龙实战

ComfyUI 零插件跑通 H3:文生视频、图生视频、首尾帧一条龙实战

ComfyUI 零插件跑通 H3:文生视频、图生视频、首尾帧一条龙实战 【免费下载链接】Minimax-h3_Singularity 项目地址: https://ai.gitcode.com/hf_mirrors/WarmBloodAban/Minimax-h3_Singularity MiniMax H3 开源后迅速成为开源社区关注度最高的视频生成模型&…

2026/10/10 21:44:33 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →