Kafka异步配置全解析:从Producer到Consumer的线程模型与性能调优
前阵子有个同事拿着一份配置来问我KafkaTemplate 的 send 方法不是异步的吗为什么我调完 Kafka 的接口还是慢得像蜗牛这个问题很典型也正好点破了 Spring Boot Spring-Kafka 异步配置里最容易踩的认知误区很多人以为把 send 设为异步就等于整条链路异步了实际上生产者的异步发送、消费者的并行消费、以及业务处理线程的异步化是三件互相独立的事。这篇文章我就把生产端、消费端、线程模型、消息确认和失败兜底这几个环节拆开讲透给出可以直接抄的配置以及每个配置背后的理由适合正在调 Kafka 性能、又不想在坑里过夜的 Java 开发者。1. 为什么我一开始被异步这两个字带偏了先说结论Kafka 的异步从来不是一个开关而是一连串线程模型和缓冲机制的组合。你打开官方文档看到 KafkaProducer 的 send 是异步的就以为消费者那边也自动异步了这是最容易跑偏的地方。1.1 要异步的不只是发送动作一条消息从业务代码发出到最终被消费端处理完中间至少要经过三个异步环节生产端send 方法把消息丢给本地缓冲后台 Sender 线程批量发送。Broker 端多个分区、多副本之间的读写本身就有并发。消费端拉取消息、执行业务逻辑、提交消费位点这一整套流程决定你的消息最终能不能快起来。我在实际项目里最常看到的场景是生产端已经用异步发送把 TPS 冲上去了消费者却在监听器里同步调用外部接口一个接口耗时 300 毫秒整个消费线程就被钉住 300 毫秒。最后效果是积压越来越严重消费者却每个分区只有 1 个线程在干活速度上不去。1.2 send 异步并不等于消费异步KafkaTemplate 的 send 方法返回 Future本质上是把消息放进 RecordAccumulator 后立刻返回真正发送由独立的 Sender 线程完成。这一点很多人都知道但很少有人反过来想KafkaListener 标注的方法默认是在 poll 线程里同步执行的。如果你在监听器里写了一段耗时逻辑那么这段时间内这个消费者线程既不能继续 poll也不能触发下一批消息的处理。也就是说生产端的异步只解决了发消息不阻塞业务线程消费端的异步需要你自己另外配置否则它永远是同步的。记住这个区别后面所有配置你都能看明白。2. 生产者侧把 KafkaTemplate 的异步潜力真正榨干生产端的异步不难难的是配到什么程度才合理。很多人的情况是只是用了 send 方法但没配置批量参数消息一条条地发无形中损失了大量吞吐。2.1 send() 为什么是异步的回调里藏着什么Spring-Kafka 的 KafkaTemplate.send() 底层封装了原生 KafkaProducer.send()消息进入 RecordAccumulator 后立刻返回。RecordAccumulator 按照分区把消息攒成一个个批次等批次满了或者等待时间超过 linger.msSender 线程才会把批次发出去。这样做的目的是减少网络往返让一次 TCP 请求携带尽量多的消息。所以从调用者的角度看send 方法确实秒回但这不代表消息已经到 broker 了。如果要判断是否发送成功最稳的做法是挂回调ListenableFutureSendResultString, String future kafkaTemplate.send(topic, key, value); future.addCallback( result - log.info(消息发送成功offset{}, result.getRecordMetadata().offset()), ex - log.error(消息发送失败, ex) );这里有个 Spring-Boot 2.x 时代比较常见的坑从 spring-kafka 2.8 开始ListenableFuture 的模板方法慢慢在往 CompletableFuture 迁移2.9 之后 KafkaTemplate 直接提供了 CompletableFuture 风格的 send。你要是维护老项目升级版本回调签名变了会导致编译报错需要留意。新版写法是kafkaTemplate.send(topic, key, value) .whenComplete((result, ex) - { if (ex ! null) { log.error(发送失败走补偿逻辑, ex); } });回调里拿到异常后最忌讳的是直接忽略或者只打一行日志。生产环境建议至少把消息落一张待补偿表后端起定时任务重发这样才叫可靠的异步发送。2.2 生产者属性怎么配acks、linger.ms、batch.size 和 buffer.memory在 application.yml 里配置生产者参数时我见过不少照抄网上模板的情况但每个参数都有代价下面这张表是我在实际项目里验证过的默认基准参数推荐值作用代价acksall等待所有副本确认最安全延迟略高linger.ms5-20攒批等待时间越大批量越大消息延迟增加batch.size16384 起步看单条消息大小控制批次容量太大浪费内存buffer.memory32-64 MB发送缓冲总容量占 JVM 堆外内存max.block.ms1000 左右缓冲区满时 send 阻塞上限超出抛异常重点说一下 linger.ms。很多人看到批处理参数以为 batch.size 越大越好但实际触发发送的条件是批次满了或linger.ms 到了两者谁先触发都行。如果你的业务 QPS 不高batch.size 设成 1MB 也没用消息根本攒不够最后还是靠 linger.ms 倒计时发送。所以设置 linger.ms 实际上是在吞吐和延迟之间做权衡要吞吐就给 10ms 以上要低延迟就压到 0-5ms。还有一个经常被忽略的参数是 max.block.ms。当 buffer.memory 满了send 方法会阻塞当前线程等待缓冲腾出空间默认值是 60 秒。这意味着你的异步发送在某些瞬时高峰下反而会把业务线程堵死。我建议把这个值压到 1000 左右宁可让发送失败走补偿也不要在 send 方法上阻塞太久否则 Kafka 的异步会反过来拖垮业务接口。2.3 要不要自己再包一层线程池这是一个我经常被问到的问题既然 send 是异步的那我是不是应该在业务代码里再丢一个线程池让调用方更快返回我的答案是不建议。你已经用了 KafkaTemplate 的异步发送再把 send 丢进业务线程池等于白白多了一层线程切换代价是额外的上下文切换和内存占用收益几乎为零。真正的性能瓶颈往往不在 send 本身而在两个地方一个是消息体过大另一个是消息量上来之后 broker 端分区不够导致单分区写入瓶颈。这两个问题靠线程池解决不了。正确做法是让业务线程只做构造消息 send然后立刻往下走。如果你必须拿到发送结果再决定下一步逻辑那就要想清楚你是要吞吐还是要一致性。要吞吐就不要在业务链路里 Future.get()把 send 回调里的失败补偿逻辑单独抽出去要一致性那就另说直接同步发送更清晰。3. 消费者侧Listener 默认根本不是异步的这是整篇文章最核心的部分也是异步配置真正的主战场。大多数人对消费者异步的理解停留在并发数设大点但 concurrency 和消息处理异步化是两码事。3.1 poll 循环与监听器执行的关系Kafka 消费者内部是一个无限循环拉取一批消息交给监听器逐条处理处理完再拉下一批。这个循环里最容易被忽略的是 max.poll.interval.ms 参数。默认值是 5 分钟意思是消费者两次 poll 之间的间隔不能超过 5 分钟。如果你在监听器里同步调用了一个慢接口单条消息处理超过 5 分钟broker 会判定这个消费者已死触发 rebalance把分区交给别的消费者而老消费者还在处理消息。这就是我同事遇到的慢得像蜗牛的根因之一他的监听器里同步调了一个耗时 2 分钟的外部服务起初没触发 rebalance但消费吞吐被牢牢限制住了。Kafka 消费者的并发度默认情况下等于分区数乘以单分区线程数而单分区内是严格有序、一条条处理的。你要想快要么多开消费者实例要么加大 concurrency。3.2 用 concurrency 和 listener type 提升并行度Spring-Kafka 里最直接的并行手段是 KafkaListener 的 concurrency 属性。它的工作机制是为你创建多个 ConcurrentMessageListenerContainer每个容器持有一个或多个 KafkaConsumer 实例每个 KafkaConsumer 在自己的线程里跑 poll 循环。配置方法一种是注解属性KafkaListener(id orderConsumer, topics orderTopic, concurrency 3) public void onMessage(ConsumerRecordString, String record) { // 业务逻辑 }另一种是结合 application.ymlspring: kafka: consumer: group-id: orderGroup max-poll-records: 200这里有两个容易理解错的地方。第一concurrency 并不等于 3 个线程同时处理一个分区而是相当于起了 3 个消费者实例共享组内的分区。如果一个 topic 只有 1 个分区那么 concurrency 配成 3实际只有一个消费者在干活另外两个线程空转。第二max.poll.records 决定了每次 poll 返回多少条消息它和 concurrency 是乘法关系每次 poll 得到 200 条每个消费者线程各自处理整体并行度是 concurrency × poll 记录数。另外还要注意 listener type。默认是 SINGLE即每条消息单独调用监听器方法如果你用 KafkaListener 处理 List 数据需要配置spring: kafka: listener: type: batch批处理模式下监听器方法签名要改成接收 List配合 batch 监听器一次处理一批消息。批处理的好处是减少监听器调用次数坏处是单条消息失败会导致整批处理逻辑变复杂需要自己做好内部控制。3.3 让业务逻辑真正异步Async 自定义执行器concurrency 提升的是 poll 线程的数量但如果你在监听器里同步调外部接口每个线程照样被阻塞。这个时候才轮到业务逻辑异步化登场把监听器方法里耗时操作丢进线程池监听器立刻返回poll 线程不会被占用。我曾经在项目里用的标准做法是这样的先开启异步Configuration EnableAsync public class AsyncConfig { Bean(kafkaBizExecutor) public Executor kafkaBizExecutor() { ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); executor.setCorePoolSize(8); executor.setMaxPoolSize(32); executor.setQueueCapacity(500); executor.setThreadNamePrefix(kafka-biz-); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } }然后监听器只做投递动作KafkaListener(id orderConsumer, topics orderTopic, concurrency 2) public void onMessage(ConsumerRecordString, String record) { kafkaBizExecutor.execute(() - process(record)); }注意一个关键细节如果使用 Async 注解而不是直接注入 Executor要把调用放在另一个 Bean 里不能从监听器内部调用同类私有方法否则 Async 失效方法还是在原线程执行。这个我踩过不止一次后面专门讲。CallerRunsPolicy 这个拒绝策略很值得说。当线程池满了新任务不会丢而是回退到调用者线程执行。在消费场景里调用者线程就是 poll 线程这意味着极端情况下消费者会被压住但消息不会丢。这其实是 Kafka 消费场景里比较理想的背压机制宁可让消费者慢下来也不要随意把消息丢弃。4. 异步之后才真正进入麻烦区确认、顺序、重平衡把消耗逻辑丢进线程池之后你很快会发现异步化带来三个新难题它们比性能问题更棘手处理不好会引发丢消息或重复消费。4.1 异步处理后的手动确认别抢在业务完成前 ack默认情况下Spring-Kafka 是 auto-ack即消息交给监听器方法后立即确认。如果你启用了手动 ackspring: kafka: listener: ack-mode: manual监听器方法的签名改成带 Acknowledgment 参数手动调用 ack() 确认。在异步化场景里最大的坑是在监听器方法里把任务丢进线程池后立刻 ack结果线程池里的业务逻辑后面失败了消息已经确认成功无法重试数据就丢了。正确做法是把确认动作放到异步任务的最后一步KafkaListener(id orderConsumer, topics orderTopic) public void onMessage(ConsumerRecordString, String record, Acknowledgment ack) { kafkaBizExecutor.execute(() - { try { handle(record); ack.acknowledge(); // 处理成功后才确认 } catch (Exception e) { log.error(处理失败稍后走死信逻辑, e); // 不要 ack让容器根据配置决定重试还是进 DLT } }); }这里有个容易忽略的底层限制KafkaConsumer 不是线程安全的。ack 操作本质上是要提交 offset在异步线程里调用 acknowledge 是否安全取决于 Spring-Kafka 内部实现。在手工 ack 模式下Acknowledgment.acknowledge() 实际是给容器提交一个标记由容器内部的协调线程去提交位点所以你可以安全地在业务线程里调用。但如果你直接用原生 consumer.commitSync()就很容易踩线程安全问题。异步确认还有个隐患不同消息的确认顺序可能和你拉取的顺序不一样。Kafka offset 提交要求是递增的你第一条消息还没处理完第二条消息先处理完并提交了 offset2那么第一条消息处理完成后再次提交 offset1 是无效的。更麻烦的是如果第一条消息处理失败且没有提交 offset而第二条已经提交了 offset2那么第一条消息在重平衡后会被重新消费但 offset2 往后的不会重复。这个场景需要你根据业务容忍度选择要么接受最多一次的间隔性丢失要么用分区级顺序线程池保证提交顺序。4.2 消息顺序被打破怎么办Kafka 的单分区顺序保证是写入顺序即读取顺序如果消费者只有一个线程同步处理那么处理顺序也等于写入顺序。一旦你把消息丢进多线程线程池顺序立刻被打破A 消息比 B 消息先入队但 B 先处理完这在需要严格顺序的业务里是不能接受的。我的经验是顺序敏感的场景不要用通用线程池而是给每个分区建一个单线程执行器或者用partition % executorGroupSize的方式做哈希取模路由。举个例子订单状态流转这类强顺序业务我会在监听器里按 key 哈希分桶ExecutorService[] executors new ExecutorService[partitionCount]; // 初始化时每个桶一个单线程池 executors[key.hashCode() % partitionCount].execute(() - handle(record));这样同一个 key 的消息永远进同一个桶由同一个线程串行处理不同 key 之间并行既保序又不损失吞吐。代价是需要自行管理一批线程池的生命周期在容器关闭时显式 shutdown否则会造成线程泄漏。4.3 重平衡与 in-flight 消息的丢失风险异步化之后另一个隐蔽问题是 rebalance 发生时消费线程可能还在处理消息。消费者侧处理完才手动 ack的机制下重平衡会把未确认分区分给别的消费者新消费者会从最后提交的 offset 开始拉取这会导致 in-flight 消息被重复消费。但如果消费者在重平衡前被强制关闭且消息还在内存里没有处理完那部分消息就相当于丢了。这个问题没有完美解只能靠业务幂等兜底。我的建议是所有异步消费的业务逻辑不管重不重复都要设计成幂等的数据库 upsert、唯一键去重、状态机校验。Kafka 本身提供 exactly-once 语义但那是配合事务 API 在端到端链路里实现的Spring-Kafka 加异步线程池后很难直接用上不如老老实实在业务层做幂等这是最稳妥的工程选择。5. 异步场景下的错误处理与死信兜底把消费逻辑异步化之后异常处理会变得尤其拧巴异常发生在业务线程而 Kafka 的重试机制控制权在容器线程。如果不把这层关系理清就会出现业务线程重试了三次容器线程也重试了三次消息被处理了九次的尴尬局面。5.1 同步重试与异步重试的选择Spring-Kafka 的默认重试机制是同步的即监听器方法抛出异常后容器按配置的 RetryTemplate 在同一线程里重新调用监听器。这套机制和华丽的异步线程池天然矛盾异常已经被业务线程吃掉了容器根本感知不到。所以异步化场景下我通常不给容器配置 RetryTemplate而是在业务线程内部做有限次重试。比如连接外部服务时用简单重试public void handle(ConsumerRecordString, String record) { RetryTemplate.builder() .maxAttempts(3) .fixedBackoff(500) .build() .execute(context - { callRemoteService(record.value()); return null; }); }重试结束后仍然失败就把消息丢到死信队列而不是让容器反复重投。原因很简单容器重试会阻塞 poll 线程导致整个分区消费停滞而且同步重试期间如果业务系统持续故障积压会快速恶化。异步线程池加 DLQ才能把单条失败的影响控制在单条消息上。5.2 把失败消息送进死信队列Spring-Kafka 从 2.8 开始推荐使用 CommonErrorHandler老的 SeekToCurrentErrorHandler 已经被标记废弃。配置死信的最简单方式是在 Configuration 里定义一个 DeadLetterPublishingRecovererBean public CommonErrorHandler errorHandler(KafkaTemplateString, String kafkaTemplate) { DeadLetterPublishingRecoverer recoverer new DeadLetterPublishingRecoverer(kafkaTemplate, record - new TopicPartition(record.topic() .DLT, record.partition())); return new DefaultErrorHandler(recoverer, new FixedBackOff(1000L, 3)); }这个配置的意思消息失败后先重试 3 次间隔 1 秒仍然失败就写入原topic.DLT死信队列。注意这里重试 3 次是容器级别的同步重试所以上面说的异步业务线程内重试和这里的容器重试你只能选一种最多是业务线程内部轻量重试 容器不重试直接进 DLT不要两层叠加。死信队列不是终点还要有处理死信的消费者。死信消息通常代表业务上无法自动解决的数据我的做法是单独写一个 KafkaListener 监听 .DLT topic做两条处理能修正的数据修正后重新发送到原 topic不能修正的落库人工处理。比如序列化异常、字段缺失这类问题直接落库比无限重试更有价值。6. 一份可复制的完整配置与避坑清单最后给出一份我实际用过、验证过吞吐的完整配置加上四个我在生产环境真实踩过的坑帮你少走弯路。6.1 可直接复制的完整异步配置spring: kafka: bootstrap-servers: localhost:9092 producer: acks: all linger-ms: 10 batch-size: 16384 buffer-memory: 67108864 max-block-ms: 1000 key-serializer: org.apache.kafka.common.serialization.StringSerializer value-serializer: org.apache.kafka.common.serialization.StringSerializer consumer: group-id: orderGroup enable-auto-commit: false auto-offset-reset: latest max-poll-records: 200 key-deserializer: org.apache.kafka.common.serialization.StringDeserializer value-deserializer: org.apache.kafka.common.serialization.StringDeserializer listener: ack-mode: manual concurrency: 3配套代码骨架Configuration EnableAsync public class KafkaAsyncConfig { Bean(kafkaBizExecutor) public Executor kafkaBizExecutor() { ThreadPoolTaskExecutor executor new ThreadPoolTaskExecutor(); executor.setCorePoolSize(8); executor.setMaxPoolSize(32); executor.setQueueCapacity(500); executor.setThreadNamePrefix(kafka-biz-); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); executor.initialize(); return executor; } } Component public class OrderConsumer { Resource(name kafkaBizExecutor) private Executor executor; KafkaListener(id orderConsumer, topics orderTopic, concurrency 3) public void onMessage(ConsumerRecordString, String record, Acknowledgment ack) { executor.execute(() - processSafely(record)); ack.acknowledge(); // 取决于你的取舍见下方避坑 4 } }如果你决定处理成功后才确认那就把 ack 放进 processSafely 的 finally 成功分支里上面示例只是一个快速起步的形态。6.2 四个我踩过的坑第一坑concurrency 配得比分区数还大。某次我把 consumer 的 concurrency 从 3 改成 8结果 topic 只有 3 个分区8 个消费者竞争 3 个分区每次都触发 rebalance消费吞吐不升反降日志里全是 rebalance 警告。后来我把 concurrency 调整到小于等于分区数再配合异步业务线程池吞吐才真正上来。记住concurrency 是消费者线程数不是处理线程数它受分区数上限约束。第二坑Async 注解加在监听器方法上直接失效。我最早是这么写的结果发现监听器还是同步执行。原因很简单Async 基于 AOP 代理而 KafkaListener 方法被 Kafka 容器直接调用代理不生效注解就被忽略了。正确做法是单独定义一个处理服务在服务方法上加 Async监听器只调服务或者像上面的例子那样在监听器里显式提交给自定义 Executor。第三坑忘了开启 EnableAsync。哪怕你把 Async 加在正确的服务上没有在配置类上标注 EnableAsyncSpring 不会创建异步代理所有方法又变回同步执行。这个坑隐蔽在项目里其他地方有 EnableAsync但那个配置类没被扫描到结果就是静默失效排查起来特别费劲。我现在的习惯是凡是涉及 Kafka 异步执行器都会在同一个配置类里显式声明 Executor Bean并在方法里写好EnableAsync减少跨配置类的依赖。第四坑异步确认和提交顺序混在一起。我在统一切到业务完成后再 ack之后发现偶尔还是会有重复消费。后来定位到原因是分区内消息是串行拉取的但异步处理后消息 2 先完成 ack消息 1 后失败且未 ack。Kafka 的 offset 提交是不允许回退的消息 2 已经把位点推进到 2消息 1 虽然没提交但重平衡后重新消费时从 offset 2 开始拉消息 1 反而永远不会被重新消费。换句话说这种模式下堆积在中间位点的未确认消息可能既没有 ack也不会被重新消费相当于被静默跳过了。这个问题的根治方案是分区内保序提交要么用单线程执行器处理同一分区的消息要么对失败消息立即捕获并直接进 DLT不让失败消息滞留在未确认状态。以上四个坑前两个属于配置层后两个属于设计层难度递进。如果你只是想让 Kafka 消费不阻塞做到第三坑为止就够了如果你想在异步化之后还不丢消息、不乱序那第四坑才是真正的考验。从实际效果看这套生产端批量异步发送 消费端多并发拉取 业务线程池异步处理 手动确认 DLT 兜底的组合能把单分区消费吞吐从每秒几十条提升到几百条甚至上千条代价是引入了重复消费和乱序的风险。我最后再说一句经验之谈异步化本质上是拿确定性换吞吐任何异步方案都必须配套幂等和死信机制否则你省下来的性能迟早会以数据质量问题的方式还回去。

相关新闻

连续打卡46天:从量变到质变的关键复盘方法

连续打卡46天:从量变到质变的关键复盘方法

D46这个编号我一看就明白,你也在跑一个连续打卡计划,而且已经坚持到第46天了。算一下就知道,从第1天开始,中间不间断地执行了四十五天,这个阶段恰好是习惯从“刻意坚持”向“身体自动反应”过渡的关键拐点。如果你正处…

2026/10/15 2:36:25 阅读更多 →
吉他物理原理:从木材振动到泛音校准的声学工程解析

吉他物理原理:从木材振动到泛音校准的声学工程解析

1. 一把木头与钢弦的物理实验室:为什么“吉他”这个词至今仍能撬动千万人的神经你有没有试过,在深夜拧紧一颗琴颈调节杆,听那细微的金属形变声像心跳一样传到指尖?或者把调音器APP放在琴箱共鸣孔前,看着泛音列里第5个谐…

2026/10/15 2:36:25 阅读更多 →
树形动态规划入门:从二叉树打家劫舍到空间优化

树形动态规划入门:从二叉树打家劫舍到空间优化

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

2026/10/15 2:36:25 阅读更多 →

最新新闻

笑脸与口罩识别的工业级落地:从像素统计到人机意图理解

笑脸与口罩识别的工业级落地:从像素统计到人机意图理解

1. 这不是玩具项目:笑脸与口罩识别背后的真实业务切口“笑脸识别,口罩识别”——光看标题,很多人第一反应是:这不就是个课堂Demo?调用OpenCV读个摄像头,加两行cv2.CascadeClassifier,再套个预训…

2026/10/15 3:08:36 阅读更多 →
2026,程序员的时代拐点到了

2026,程序员的时代拐点到了

1. 引言 2026 年,注定是程序员职业生涯中一个无法回避的坐标点。这一年,AI 编程助手从「玩具」变成了「同事」,大模型从「聊天机器人」变成了「需求分析师」,而程序员这个职业本身,也站在了前所未有的十字路口。有人焦…

2026/10/15 3:08:36 阅读更多 →
TensorFlow Lite集成实战:从模型转换、量化到端侧推理加速

TensorFlow Lite集成实战:从模型转换、量化到端侧推理加速

到这里,前几章我们讲了模型怎么训、怎么调,该轮到最“落地”的一步了:TensorFlow Lite集成。这章我想用一次完整的实操视角,把从训练好的模型到真正跑在端侧设备上的全流程讲透——包括模型转换、量化、Delegate加速、端侧推理API…

2026/10/15 3:08:36 阅读更多 →
Rope 免费换脸教程:从安装到导出第一条视频的 10 分钟路径

Rope 免费换脸教程:从安装到导出第一条视频的 10 分钟路径

Rope 免费换脸教程:从安装到导出第一条视频的 10 分钟路径 【免费下载链接】Rope GUI-focused roop 项目地址: https://gitcode.com/GitHub_Trending/ro/Rope Rope 是一款免费的图形化人脸交换工具,基于 insightface 的 inswapper_128&#xff08…

2026/10/15 3:08:36 阅读更多 →
金蝶Cloud销售模块参数配置全攻略:从流程打通到信用风控

金蝶Cloud销售模块参数配置全攻略:从流程打通到信用风控

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

2026/10/15 3:08:36 阅读更多 →
免费广告拦截插件 uBlock Origin:默认 5 份过滤列表,请求发出前就拦下

免费广告拦截插件 uBlock Origin:默认 5 份过滤列表,请求发出前就拦下

免费广告拦截插件 uBlock Origin:默认 5 份过滤列表,请求发出前就拦下 【免费下载链接】uBlock uBlock Origin - An efficient blocker for Chromium and Firefox. Fast and lean. 项目地址: https://gitcode.com/GitHub_Trending/ub/uBlock 很多…

2026/10/15 3:07:36 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29: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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →