Kafka自动提交位移机制深度解析:原理、陷阱与最佳实践
1. 从一次线上事故说起自动提交的“静默”陷阱那天晚上报警系统突然响起提示我们的一个核心数据同步服务出现了严重的消息积压。登录监控一看消费者组的Lag滞后量曲线像坐了火箭一样直线飙升而服务本身却显示运行正常没有抛出任何异常。团队紧急介入排查从网络到Kafka集群状态再到消费者实例的CPU和内存一切指标都显得风平浪静。最终经过近一个小时的日志深潜我们把问题锁定在了一个看似不起眼的配置上enable.auto.committrue配合一个不恰当的auto.commit.interval.ms。正是这个“自动提交位移”的机制在消费者实例因为一次Full GC而短暂卡顿的几十秒内默默地、按照既定的时间节奏提交了尚未被业务逻辑完全处理的位移。当服务恢复后那些已经被“确认”消费的消息就再也回不来了造成了数据丢失和后续流程的连锁故障。这次经历让我彻底明白Kafka的位移自动提交绝非一个“设置完就忘”的简单开关。它是一把双刃剑用好了能极大简化开发用不好就是埋藏在系统里的“静默炸弹”。很多开发者包括曾经的我都习惯于在初始化KafkaConsumer时顺手写上enable.auto.committrue然后就把位移管理的重任完全交给了Kafka客户端却很少去深究这背后的运作机制和潜在风险。今天我们就来彻底拆解Kafka位移自动提交的“黑盒”看看它究竟是如何工作的以及如何通过正确的姿势避开那些常见的深坑。2. 自动提交机制深度拆解不只是定时任务那么简单很多人对自动提交的理解停留在“每隔一段时间提交一次”这虽然没错但过于肤浅。要真正驾驭它必须深入到其触发逻辑和核心组件的交互层面。2.1 核心组件KafkaConsumer与后台心跳线程当你创建一个启用了自动提交的KafkaConsumer时客户端库会启动一个或多个后台线程。其中最关键的一个常被称为“心跳线程”或“协调器线程”它负责两件大事1. 向Broker发送心跳以维持消费者组的成员身份2. 在满足条件时触发位移提交。这个线程独立于你调用poll(Duration)的主线程运行。自动提交的触发严格来说并不是一个纯粹的、独立的定时任务。它紧密关联着主线程的poll循环。常见的客户端实现如Java逻辑是在每次主线程调用poll方法后后台线程会检查自上次提交以来是否已经过去了auto.commit.interval.ms默认5000毫秒配置的时间。如果超过了则异步地发起一次位移提交。请注意这个“异步”提交操作本身不会阻塞你的poll或后续的消息处理它发生在后台。2.2 提交的内容与“至少一次”语义自动提交提交的是什么它提交的是poll方法返回的那一批消息中每个分区对应的位移offset。更准确地说是消费者本地维护的position即下一条将要消费的消息的位移。假设你从分区0拉取了位移为5、6、7、8、9的五条消息在处理完位移9的消息后本地position就变成了10。当自动提交触发时它就会向Kafka的内部主题__consumer_offsets写入“分区0:位移10”。这直接定义了自动提交的默认语义至少一次at-least-once。因为提交是在消息被拉取到客户端、并且可能已经开始处理之后才异步发生的。如果在提交完成前消费者崩溃新的消费者实例会从上次提交的位移比如10开始消费导致位移5到9的消息被再次处理。这就是我们常说的“重复消费”。2.3 关键配置参数及其联动效应自动提交的行为由以下几个关键参数控制它们之间的联动决定了系统的稳定性和数据一致性边界enable.auto.commit(布尔值默认true)总开关。设为false则进入手动提交模式。auto.commit.interval.ms(整型默认5000)自动提交的时间间隔。这是最大延迟的承诺而非精确周期。提交实际发生的时间点取决于poll的调用频率和后台检查逻辑。max.poll.records(整型默认500)单次poll调用返回的最大消息数。这个参数直接影响单批消息的处理时长。如果一批消息太多处理时间可能超过session.timeout.ms导致消费者被踢出组。session.timeout.ms(整型默认45000)消费者与Broker之间会话的超时时间。如果在此时间内协调器未收到消费者的心跳则认为该消费者已死亡触发再平衡。max.poll.interval.ms(整型默认300000)两次poll调用之间的最大允许间隔。如果处理消息的逻辑耗时过长导致超过此间隔未调用poll消费者会被认为失败同样触发再平衡。这是比session.timeout.ms更常遇到的坑。这些参数必须作为一个整体来考量。例如你设置了auto.commit.interval.ms1000希望每秒提交一次以减少重复。但如果你的max.poll.records很大且处理每条消息很耗时可能处理一批消息就需要5秒。那么在这5秒内即使自动提交时间间隔到了也可能因为poll方法未被再次调用处理线程被阻塞而导致提交无法被触发。更糟糕的是这5秒可能已经接近或超过了max.poll.interval.ms直接引发再平衡。3. 自动提交的四大经典陷阱与根因分析理解了机制我们就能清晰地识别那些隐藏在默认配置下的陷阱。3.1 陷阱一消息处理期间的消费者崩溃——数据丢失这是文章开头事故的根源也是最危险的陷阱。场景复现消费者拉取一批消息位移100-199开始处理。在处理到位移150时自动提交的时间间隔到了后台线程异步提交了位移200即position。提交完成后消费者在继续处理位移151-199的过程中突然崩溃如OOM、宿主机故障。后果当消费者组重新平衡新的消费者实例接管分区时它会从上次提交的位移200开始消费。位移151-199这49条已经拉取到客户端但尚未处理的消息就永久丢失了。根因自动提交的位移超前于实际业务处理进度。它提交的是“已拉取”的位移而非“已成功处理”的位移。在异步处理、批处理或处理链较长的场景下这个差距会被放大。注意这与“至少一次”语义并不矛盾。“至少一次”是针对提交后消费者崩溃导致重复而言的。而“数据丢失”是提交后、处理完成前崩溃导致的是自动提交机制在追求吞吐时引入的“至多一次”风险。3.2 陷阱二再平衡期间的位移提交——混乱与重复再平衡Rebalance是消费者组内分区所有权重新分配的过程。在再平衡发生时如果自动提交恰好介入会引发混乱。场景复现一个消费者组有三个成员C1、C2、C3。C1正在消费分区P1。触发再平衡比如C4加入。在再平衡协议执行的短暂窗口内C1的自动提交线程可能刚好执行提交了P1的某个位移。紧接着分区P1被分配给了C2。C2从提交的位移开始消费。但C1可能已经处理了提交位移之后的一些消息这些消息还在内存或线程池中未提交或者C1本地还有未处理完的消息。后果消息可能被重复处理C1处理了但位移未提交C2又处理一次也可能丢失C1提交了位移但未处理完C2跳过了那些消息。结果具有不确定性。根因自动提交作为一个独立的后台活动与由协调器控制的再平衡前端流程不同步。Kafka提供了ConsumerRebalanceListener接口允许我们在再平衡前后执行代码但自动提交无法感知这个监听器的逻辑。3.3 陷阱三长耗时处理与参数配置失配——被动踢出与活锁这是配置不当导致的最常见问题。场景复现一个消费者处理每条消息都需要调用一个外部API平均耗时2秒。max.poll.records保持默认的500。那么处理一批消息可能需要1000秒远远超过了max.poll.interval.ms的默认5分钟300秒。后果在消费者还在辛苦处理第一批消息时协调器就因为超过max.poll.interval.ms未收到新的poll调用而判定该消费者死亡触发再平衡。分区被分配给其他消费者。等这个消费者终于处理完调用poll时会发现它已被踢出组需要重新加入。如果参数不变它会再次拉取消息再次陷入长时间处理再次被踢出……形成“活锁”livelock消费者不断在“处理-被踢-重入”中循环无法取得实质进展吞吐量为零。根因max.poll.interval.ms与max.poll.records*平均单消息处理时间不匹配。自动提交在此场景下几乎失效因为消费者可能永远等不到下一次提交的机会。3.4 陷阱四异步提交的“未来”承诺与位移覆盖自动提交是异步的这意味着commitSync()虽然自动提交内部调用的是异步提交但其效果类似的调用成功返回只代表提交请求被成功接受或放入队列并不代表位移已持久化到__consumer_offsets。在极高并发或Broker压力大时可能会出现意外的位移覆盖。场景复现消费者先后触发了两次自动提交A和BA提交位移100B提交位移200。由于网络或Broker端处理顺序后发起的提交B可能先被持久化。如果此时发生再平衡新的消费者会从位移200开始消费。但提交A的请求可能稍后到达它试图写入一个更旧的位移100。在Kafka的位移主题中后写入的位移会覆盖先前的位移即使它是一个更旧的值。后果位移被意外回滚。新的消费者可能会从位移100如果A最终覆盖了B开始消费导致位移100到200之间的消息被重复消费。根因异步提交无法保证顺序。自动提交机制内部通常使用异步提交且不提供顺序保证。在Kafka中位移主题也是一个普通的Kafka主题其分区内的消息顺序由Broker接收顺序决定但网络延迟和重试可能导致乱序。4. 避坑实战从配置、代码到监控的防御体系知道了陷阱在哪里我们就可以系统地构建防御工事。4.1 配置调优为你的业务场景量身定制没有一套放之四海而皆准的配置。你需要根据业务的消息处理耗时、吞吐要求、数据一致性等级来调整。对于处理逻辑轻量、追求高吞吐的场景enable.auto.committrueauto.commit.interval.ms可以适当调低比如1000-2000毫秒以减少重复消费的范围。max.poll.records可以调高如1000以提高每轮poll的效率。max.poll.interval.ms根据max.poll.records * 单条处理最长时间来设置并留出50%以上的安全余量。例如最坏情况处理一条消息需100ms那么一批1000条最多需100秒。可将max.poll.interval.ms设置为1800003分钟。对于处理逻辑耗时较长如涉及外部RPC调用、复杂计算的场景首选建议是关闭自动提交采用手动提交。这是最稳妥的方式。如果坚持使用自动提交必须大幅调低max.poll.records比如10或50确保单批处理时间远小于max.poll.interval.ms。相应调整auto.commit.interval.ms通常建议小于max.poll.interval.ms/ 2确保在处理周期内有机会提交。示例配置max.poll.records20,max.poll.interval.ms300000,auto.commit.interval.ms30000。通用安全配置建议# 关闭自动提交启用手动提交推荐用于关键业务 enable.auto.commitfalse # 如果启用自动提交请务必设置合理的间隔 # enable.auto.committrue # auto.commit.interval.ms5000 # 根据业务容忍度调整 # 控制单次拉取量防止“巨批”阻塞 max.poll.records200 # 从默认500调低观察处理时间 # 拉取请求等待数据的最大时间避免空等 fetch.max.wait.ms500 # 单次拉取请求的最小数据量不是关键但可配合使用 fetch.min.bytes1 # 最关键的两个超时参数必须大于单批处理最长时间 session.timeout.ms10000 # 心跳超时通常够用 max.poll.interval.ms300000 # 根据 max.poll.records * 单条最慢处理时间 计算并加余量4.2 代码层面的防御性编程即使配置得当代码逻辑也能提供额外保障。优雅关闭钩子Shutdown Hook在JVM关闭或容器终止时确保消费者能完成当前批次的消息处理并同步提交位移consumer.commitSync()。这可以避免在常规关闭时丢失消息。Runtime.getRuntime().addShutdownHook(new Thread(() - { log.info(Starting graceful shutdown...); consumer.wakeup(); // 使下一次poll()抛出WakeupException // 在主线程中捕获WakeupException然后执行commitSync和close }));使用ConsumerRebalanceListener处理再平衡实现onPartitionsRevoked和onPartitionsAssigned方法。在分区被收回前onPartitionsRevoked同步提交位移确保进度不丢失。这是弥补自动提交在再平衡时缺陷的重要手段。props.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false); // 手动提交模式下使用更佳 consumer.subscribe(topics, new ConsumerRebalanceListener() { Override public void onPartitionsRevoked(CollectionTopicPartition partitions) { // 在失去分区所有权前提交已处理消息的位移 consumer.commitSync(); } Override public void onPartitionsAssigned(CollectionTopicPartition partitions) { // 可以在这里初始化分区相关的状态 } });考虑“同步提交”与“异步提交”结合的手动模式对于关键业务彻底放弃自动提交。在消息处理成功后执行consumer.commitAsync()提高吞吐同时在周期性地或关闭时执行consumer.commitSync()进行兜底确保位移最终一致。try { while (running) { ConsumerRecordsString, String records consumer.poll(Duration.ofMillis(100)); for (ConsumerRecordString, String record : records) { // 处理消息 processRecord(record); // 异步提交不阻塞可累积一批后提交一次 consumer.commitAsync(); } // 每处理N批后或定期进行一次同步提交兜底 if (batchCount % 10 0) { consumer.commitSync(); } } } finally { try { consumer.commitSync(); // 最终同步提交 } finally { consumer.close(); } }4.3 监控与告警构建感知系统配置和代码是预防监控则是发现问题的眼睛。核心监控指标消费者Lag这是最重要的指标。监控每个消费者组、每个主题分区的滞后消息数。设置Lag持续增长或超过阈值的告警。可以使用Kafka自带的kafka-consumer-groups脚本或通过JMX暴露的records-lag-max等指标接入监控系统如Prometheus。Poll速率与处理速率监控消费者调用poll的频率和实际处理消息的速率。如果处理速率持续低于消息到达速率Lag必然增长。commit-rate和commit-latency监控位移提交的频率和延迟。提交延迟过高可能意味着Broker压力大或网络问题。max.poll.interval.ms利用率监控每次poll间隔的时间。如果该时间持续接近配置的max.poll.interval.ms说明处理速度堪忧有被踢出组的风险。再平衡频率监控消费者组的再平衡次数。频繁的再平衡是系统不稳定的标志会严重影响吞吐。告警策略Lag突增告警设置一个基于历史数据的动态基线当Lag在短时间内如5分钟增长超过基线的200%时触发告警。消费者实例消失告警监控消费者组内活跃的成员数量。成员数量非预期减少意味着有消费者崩溃或被踢出。Poll间隔超时预警当poll间隔达到max.poll.interval.ms的80%时发出预警提示需要优化处理逻辑或调整参数。5. 进阶思考何时应该放弃自动提交经过以上分析我们可以得出一个清晰的结论自动提交适用于对数据丢失不敏感、允许少量重复、且处理逻辑非常轻量、快速的场景。例如一些实时统计计数、日志转发、状态不那么关键的缓存更新等。而对于以下场景强烈建议使用手动提交位移金融交易、订单处理绝对不允许丢失或未经确认就视为成功。数据库变更同步CDC要求严格有序且不丢失否则会导致数据不一致。任何有状态的消息处理处理结果依赖于之前消息的状态重复或丢失会导致状态混乱。处理耗时波动大或不可预测无法保证在max.poll.interval.ms内完成处理。手动提交给了开发者完全的控制权可以实现精确一次exactly-once或更可靠的至少一次语义。你可以选择在每条消息处理后提交性能最差但最安全或在一批消息全部成功处理后提交推荐甚至可以结合数据库事务将业务处理与位移提交放在同一个事务中实现端到端的精确一次。6. 真实案例复盘从自动提交切换到手动提交的权衡在我负责的一个用户行为分析管道中我们最初使用了默认的自动提交。业务逻辑是从Kafka读取用户点击事件进行一些实时聚合后写入Elasticsearch。起初流量不大相安无事。随着业务增长出现了两个问题一是夜间定时任务触发时会产生流量脉冲导致处理延迟增加偶尔触发再平衡二是我们发现ES写入偶尔因网络抖动失败但位移已经被自动提交导致这部分数据丢失。我们的解决方案是分两步走第一步短期优化我们首先尝试优化自动提交配置。调低了max.poll.records从500到100增加了max.poll.interval.ms并设置了更频繁的auto.commit.interval.ms2000ms。这缓解了再平衡问题但数据丢失的根因处理失败但位移已提交无法解决。第二步长期根治我们重构了消费者逻辑切换到手动提交。核心模式是“批处理同步提交”。ListConsumerRecord batch new ArrayList(); try { ConsumerRecords records consumer.poll(Duration.ofMillis(100)); for (ConsumerRecord record : records) { batch.add(record); if (batch.size() BATCH_SIZE) { // 处理批次 processBatch(batch); // 批次处理成功同步提交位移提交本批次中最大的位移1 consumer.commitSync(); batch.clear(); } } // 处理剩余不足一个批次的消息 if (!batch.isEmpty()) { processBatch(batch); consumer.commitSync(); } } catch (Exception e) { log.error(Processing failed for batch, will retry, e); // 处理失败不提交位移下次poll会重新拉取同一批消息 // 注意需要确保processBatch是幂等的 }同时我们为processBatch方法实现了幂等性确保即使重复处理也不会产生错误数据。切换后数据丢失问题彻底解决虽然峰值吞吐略有下降但系统的数据可靠性得到了质的提升。监控上我们重点关注每批提交的延迟和成功率而不是Lag的短期波动。这个案例的体会是自动提交的“便捷”是有代价的这个代价就是数据的确定性。在数据可靠性优先的系统里手动提交带来的控制力是无可替代的。它迫使你更清晰地思考消息处理的边界、失败重试的逻辑以及系统的最终一致性模型这本身就是一种架构上的收益。

相关新闻

第1章:OpenJDK 术语全景与 JVM 架构原理

第1章:OpenJDK 术语全景与 JVM 架构原理

1. 项目背景 业务场景:某电商公司的订单系统在"双十一"大促期间频繁出现 Full GC 停顿,P99 延迟从日常的 50ms 飙升至 3000ms。运维团队紧急扩容 20 台机器才勉强扛住流量。事后复盘会上,开发说"堆内存不够"&#xff0c…

2026/10/12 22:21:40 阅读更多 →
海思Hi3798MV100 SDK编译环境搭建与实战指南

海思Hi3798MV100 SDK编译环境搭建与实战指南

1. 项目概述:从零开始构建Hi3798MV100开发环境拿到一块搭载海思Hi3798MV100芯片的开发板或者机顶盒,第一件要干的事是什么?刷机?跑Demo?不,对于开发者而言,最基础也是最关键的一步,是…

2026/10/8 21:59:05 阅读更多 →
深入OpenJDK 实战修炼与源码剖析专栏大纲

深入OpenJDK 实战修炼与源码剖析专栏大纲

专栏定位 以 OpenJDK 官方源码为骨架,从「能跑 Java」到「读懂 JVM」,从「调参救急」到「架构选型与二次扩展」,全链路贯通。每一章均采用「业务痛点 → 三人剧本对话 → 代码/源码实战 → 总结思考」的四段式结构,兼顾趣味性、实…

2026/10/12 21:14:25 阅读更多 →

最新新闻

以太坊幽灵交易根因与Nonce管理实战:从卡死到自动化防护

以太坊幽灵交易根因与Nonce管理实战:从卡死到自动化防护

凌晨三点十七分,监控大屏的告警把值班手机震醒。点开一看,某资金归集服务最近的链上交易数为零,进程却还活着,日志里没有任何异常。刷新区块浏览器,交易列表躺着一串 pending,确认数全是零。再往下翻&#…

2026/10/13 10:39:24 阅读更多 →
网页 window.open 连点两次为什么串到同一个窗口:HarmonyOS 7 ArkWeb name 路由怎么防重入

网页 window.open 连点两次为什么串到同一个窗口:HarmonyOS 7 ArkWeb name 路由怎么防重入

网页 window.open 连点两次为什么串到同一个窗口:HarmonyOS 7 ArkWeb name 路由怎么防重入 网页连续两次调用 window.open(url, "preview"),应用侧创建了两个窗口,但后一次内容跑进前一个窗口;关闭其中一个后&#xff…

2026/10/13 10:39:24 阅读更多 →
大鹿岛:一座海岛如何把森林、海蚀礁石与岩雕叠在一起

大鹿岛:一座海岛如何把森林、海蚀礁石与岩雕叠在一起

第一次听到“大鹿岛”这个名字,是在台州朋友的饭桌上。他说那座岛上的石头会讲故事,我当时觉得他在夸张——海岛见得多了,无非是沙滩、海鲜、海风,石头能有什么稀奇。真正登岛是第二年初秋,船从玉环一侧开出去&#xf…

2026/10/13 10:39:24 阅读更多 →
多语言语义检索实战:paraphrase-multilingual-MiniLM-L12-v2 选型、调参与微调

多语言语义检索实战:paraphrase-multilingual-MiniLM-L12-v2 选型、调参与微调

简介:这份资源是 sentence-transformers 库中 paraphrase-multilingual-MiniLM-L12-v2 模型的本地化压缩包,面向从事自然语言处理、语义搜索与文本聚类的中高级开发者。模型可将句子和段落映射到 384 维密集向量空间,适用于多语言语义检索、相…

2026/10/13 10:39:24 阅读更多 →
两数相加链表题全解析:从哨兵节点到进位处理的面试指南

两数相加链表题全解析:从哨兵节点到进位处理的面试指南

1. 题目拆解与核心思路:这道题到底在考什么 “两数相加”在 LeetCode 热题 100 里属于链表章节的入门题,但如果你只把它当成“模拟加法”来做,面试会吃亏。 先看题面:给你两个非空的链表,每个节点存一个数字&#xff…

2026/10/13 10:39:24 阅读更多 →
Nacos配置中心中文乱码怎么办?SpringBoot环境UTF-8编码配置指南

Nacos配置中心中文乱码怎么办?SpringBoot环境UTF-8编码配置指南

搞微服务的同学,不管在哪个团队,迟早会在Nacos配置中心里碰上一次乱码。我这两年接到过不少工单,报的都是同一个毛病:本地启动一切正常,一到测试或生产环境,前端拿到的中文全变成问号,或者日志里…

2026/10/13 10:38:24 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →