ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Kafka接入AI实践:从同步HTTP到异步消息管道的架构改造

Kafka接入AI实践:从同步HTTP到异步消息管道的架构改造

我们部门上个月定了一个新方向:把所有和AI相关的服务交互,从“同步HTTP调用”逐步收敛到“先落Kafka,再让AI消费”。当时立项的名字就叫“Kafka已正式接入AI”。说白了,就是不再让业务方直连大模型接口,而是统一走Kafka消息管道。这篇文章不聊PPT,只聊落地。我会把我们从架构设计到踩坑修复的全过程拆开讲,涉及Kafka集群部署、Spring Kafka集成、AI应用的消费端设计、消息积压排查、监控可视化工具选型等,希望对正在做同类改造的团队有参考价值。

1. 整体架构思路:为什么是Kafka成为AI流量的“总闸门”

1.1 业务痛点:直连大模型的三个致命问题

先交代背景。我们的业务里有一批AI能力:文本审核、客服机器人意图识别、内容摘要生成、还有基于大模型的工单自动分类。早期实现方式很直接,业务方通过HTTP接口调用AI服务,AI服务再转发给部署在内网的大模型推理服务。

这套方案跑了大半年,问题越来越明显。首先是超时问题,大模型推理慢,一个几百字的文本摘要经常要3到10秒,HTTP同步调用会拖垮上游接口。其次是突发流量问题,策划做了一次营销活动,瞬间进来上万条消息,AI推理服务直接被压垮,重试风暴又把下游数据库搞挂了。最后是协作问题,业务方和AI团队互相扯皮,出了问题都不知道消息到底有没有送到AI服务。

这三个问题本质上是同一个原因:生产者和消费者是强耦合的同步关系。我们需要的是一种能让生产者只管投递、消费者按自己节奏处理的中间层,这就是引入Kafka的核心逻辑。

1.2 方案对比:RabbitMQ、Pulsar还是Kafka

团队内部最先讨论的其实是RabbitMQ,因为之前有团队在用。但从AI场景看,Kafka的优势更明显。

第一,Kafka的吞吐量远高于RabbitMQ,单分区顺序写磁盘,配合页缓存机制,实测单节点能扛每秒几万条消息。AI服务消费的消息往往带着大段文本,甚至Base64编码的图片,单条消息体积从几KB到几MB不等,这种高吞吐场景更适合Kafka。

第二,Kafka的消费者模型基于消费者组和分区分配,天然支持并发水平扩展。我们可以给AI推理服务多开几个消费者实例,每个实例负责不同分区,提高并行度。

第三,Kafka的消息回溯能力非常实用。AI模型调试时,经常需要重放历史数据。RabbitMQ消费完就没了,Kafka却能根据offset重新消费,这个特性后面帮我解决了好几个大问题。

我看到也有团队在推Pulsar,它的分层存储和多租户做得更好,但对我们的技术栈来说,Kafka生态更成熟,各种工具链和排查经验更丰富。所以最终选型就是Kafka。

1.3 架构成型:生产者、管道、消费者的三层模型

我们最终落地的架构显式分成三层。

第一层是消息生产者层,所有业务方通过Spring Kafka的KafkaTemplate发送消息。消息类型统一封装成JSON,包含消息ID、业务类型、业务ID、时间戳、消息体。

第二层是Kafka管道层,按业务类型划分Topic,比如ai_text_review、ai_chat_agent、ai_summary。分区数按业务量级设置,核心Topic设置10个分区,副本数设置为2到3。

第三层是AI消费层,AI服务部署多个消费者实例,组成同一个消费组。消费者拿到消息后,先做格式校验和幂等判断,再调用大模型,处理完成后把结果写回另一个Topic或者直接回调业务方的API。

这套架构改造完成之后,上游接口的平均响应时间从原来的3秒以上降到200毫秒以内,因为业务方只需要把消息丢给Kafka,不用等AI处理完,体验上的提升是立竿见影的。

2. 环境准备:Kafka集群从零搭建与可视化工具接入

2.1 Docker Compose方式快速搭建Kafka环境

如果你只是想先跑通Demo,不想在一开始就被集群运维绊住,推荐用Docker Compose快速拉起一套环境。我们在测试环境就是这么做的。

docker-compose.yml的关键配置如下:

version: '3.8' services: zookeeper: image: bitnami/zookeeper:3.8 container_name: zookeeper ports: - "2181:2181" environment: - ALLOW_ANONYMOUS_LOGIN=yes kafka: image: bitnami/kafka:3.4.0 container_name: kafka ports: - "9092:9092" environment: - KAFKA_CFG_NODE_ID=0 - KAFKA_CFG_PROCESS_ROLES=controller,broker - KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@kafka:9093 - KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 - KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT - KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER - KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=1 - KAFKA_CFG_AUTO_CREATE_TOPICS_ENABLE=true volumes: - kafka_data:/bitnami/kafka depends_on: - zookeeper volumes: kafka_data:

注意这里有个细节,新版Kafka引入了KRaft模式,理论上可以去掉ZooKeeper,但bitnami这个镜像在3.4版本依然保留了ZooKeeper的兼容配置。如果你用的是Confluent发行版或者官方二进制包,可以直接走KRaft的单进程模式,更简单。

启动命令很简单:

docker-compose up -d

启动后用Kafka自带的命令行工具验证一下:

docker exec -it kafka kafka-topics.sh --bootstrap-server localhost:9092 --list

能正常返回Topic列表,就说明Kafka起来了。

2.2 Kafka可视化工具选型:Kafka UI与Offset Explorer实测对比

Kafka裸用命令行工具实在不方便,尤其当Topic数量多了以后,想看一眼消息消费到哪个offset都费劲。我们之前试过几款可视化工具,说下真实体验。

Kafka UI是开源项目,直接跑Docker容器,支持Topic管理、Consumer Group监控、消息查看,还能直接查看lag。我们生产环境用的就是这个,部署在跳板机上,浏览器访问9000端口就能看到所有集群的动态。

Offset Explorer(以前叫Kafka Tool)是桌面客户端,适合个人开发调试。它的界面响应速度快,查看消息内容很直观,但每次都要手动配置集群连接信息,团队协作场景不太方便。

至于Kafka Monitor,它更多是用来做集群健康检查和消息延迟监控的,偏向运维侧,普通开发用得少。

我们最终选了Kafka UI作为统一的可视化入口,主要是看重它支持多集群管理,开发、测试、生产一套界面全搞定,查lag不用再去敲命令行。建议你把lag监控加入日常巡检脚本,下面会有专项说明。

2.3 生产环境部署:集群配置参数的关键点

测试环境用单节点就够了,但生产环境至少要三个Broker节点,并且要特别注意几个参数。

server.properties中比较重要的配置项如下。

broker.id=0 listeners=PLAINTEXT://0.0.0.0:9092 advertised.listeners=PLAINTEXT://你的IP:9092 log.dirs=/data/kafka-logs num.partitions=3 default.replication.factor=2 offsets.topic.replication.factor=3 transaction.state.log.replication.factor=3 log.retention.hours=72 log.segment.bytes=1073741824

其中default.replication.factor建议设置为2,至少保证一个副本,防止单节点磁盘故障导致数据丢失。log.retention.hours按业务需求来,AI场景下我们保留72小时,既方便模型调试时回溯消息,又不会占用太多磁盘空间。

另外提醒下,advertised.listeners一定要配置成客户端实际能访问的IP,很多新手在这个地方踩坑,容器内启动正常,客户端连接却报连接超时,八成就是这里没配对。

3. 消息接入实战:Spring Kafka接入AI服务的完整实现

3.1 Spring Kafka的yaml配置

我们的AI服务是Java技术栈,所以客户端用的是Spring Kafka。这里分享一份经过生产验证的yaml配置,和网上常见的Demo配置比,多了不少细节。

spring: kafka: bootstrap-servers: 192.168.1.10:9092,192.168.1.11:9092,192.168.1.12:9092 producer: key-serializer: org.apache.kafka.common.serialization.StringSerializer value-serializer: org.apache.kafka.common.serialization.StringSerializer acks: all retries: 3 batch-size: 16384 linger-ms: 5 buffer-memory: 33554432 consumer: key-deserializer: org.apache.kafka.common.serialization.StringDeserializer value-deserializer: org.apache.kafka.common.serialization.StringDeserializer group-id: ai-service-group enable-auto-commit: false auto-offset-reset: latest max-poll-records: 50 max-poll-interval-ms: 300000 listener: type: batch concurrency: 5

几个参数值得单独说明。

acks设置为all,表示消息要等所有ISR副本都写入成功后才返回确认,这在AI场景中必须严格保证,因为消息丢了会影响业务流程的完整性。retries设为3,配合acks=all,可以在网络抖动时自动重试。

enable-auto-commit设为false,同时我们把listener的type设成batch,配合手动ack机制,可以做到一批消息处理完再提交offset,极大减少重复消费。这个配置的代价是消费者必须正确处理中断和异常,不然offset一直不提交,重启后会重新消费一大堆历史消息。

concurrency设为5,意思是消费者组内每个实例会并发开启5个消费线程,对应5个分区同时拉取消息。

3.2 消息生产端:封装KafkaTemplate的最佳实践

生产端不建议每个业务方直接注入KafkaTemplate到处乱发,最好封装成一个统一的消息发送服务。

我们封装后的核心逻辑是这样的:

@Service public class AIPipelineProducer { private final KafkaTemplate<String, String> kafkaTemplate; public void sendMessage(String topic, String bizType, String bizId, Object payload) { Map<String, Object> message = new HashMap<>(); message.put("messageId", UUID.randomUUID().toString()); message.put("bizType", bizType); message.put("bizId", bizId); message.put("timestamp", System.currentTimeMillis()); message.put("payload", payload); // 使用业务ID作为key,确保同一业务的消息进入同一分区,保证顺序性 kafkaTemplate.send(topic, bizId, JSON.toJSONString(message)); } }

key使用bizId很关键。Kafka的分区分配规则是对key做哈希,相同的key必然进入相同的分区。比如某个工单的多种AI处理事件,如果用同一个bizId,它们在分区内就是严格有序的,AI消费者处理起来不会出现乱序问题。

3.3 消费端设计:批量拉取与手动提交offset

消费端是AI服务接入Kafka的核心。我们使用批量监听器,一次拉取一批消息统一调用大模型。

@Component public class TextReviewConsumer { @KafkaListener(topics = "ai_text_review", groupId = "ai-service-group") public void onMessage(List<ConsumerRecord<String, String>> records, Acknowledgment ack) { List<TextReviewRequest> requests = new ArrayList<>(); for (ConsumerRecord<String, String> record : records) { TextReviewRequest request = JSON.parseObject(record.value(), TextReviewRequest.class); requests.add(request); } try { List<TextReviewResult> results = aiService.batchReview(requests); // 批量处理完成后写回结果 resultProducer.sendResults(results); // 手动提交offset ack.acknowledge(); } catch (Exception e) { log.error("批量处理失败,等待重试", e); // 不提交offset,消息会重新消费 } } }

这里有一个生产上非常重要的经验:AI推理接口一定要支持batch批量处理,否则一条一条调用大模型,consumer吞吐量会非常难看。我们的文本审核模型是支持batch推理的,一次吃32条文本,推理耗时比单条调用节省了将近60%。

还有一点需要特别注意,max-poll-interval-ms设置的是300秒。如果一批50条消息调大模型超过5分钟,消费者会被判定为死亡,触发rebalance。这种情况下有两种解决方案,一种是调大max-poll-interval-ms,另一种是减少max-poll-records,让每批处理时间控制在超时范围内。我们最终把max-poll-records从50降到了20,处理时间稳定在40秒左右,彻底告别了频繁rebalance的问题。

3.4 AI消费者如何做幂等?重复消费问题全解析

Kafka能重复消费吗?答案非常明确:能。Kafka的at-least-once投递语义决定了消息在极端情况下一定会重复。比如消费者处理完消息还没来得及提交offset,进程就挂了,重启后这一批消息会再次被拉取。

AI场景下重复消费的代价比普通业务更高,因为每次调用大模型都是真金白银的成本,一条消息重复处理两次,费用就白白翻倍。

我们的解决方法是三层幂等。

第一层是消息表去重。在数据库中维护一张消息处理记录表,主键是messageId。消费者处理前先检查是否已存在,存在则直接跳过。

第二层是业务幂等。比如工单分类这个场景,不管调用多少次AI,最终结果都是把工单状态从待处理改成已分类。我们在AI结果回写时使用条件更新,只有当前状态还是待处理时才执行更新,避免覆盖新状态。

第三层是结果缓存。把messageId和AI结果写入Redis,设置24小时过期。消费者处理前先查Redis,命中就直接返回结果。

这三层叠加后,我们线上实际观察到重复消费引发的成本浪费降到了忽略不计。

4. AI侧融合实践:Spring AI、AI Agent与Kafka事件流的组合打法

4.1 本地部署大模型与云端API的接入路线对比

AI侧接入Kafka,第一步是确定大模型的调用方式。我们有两种典型路线。

第一种是直接调用云端API,比如各家平台提供的通义千问、文心一言等接口。优点是接入快、模型能力强、不需要自己维护GPU服务器。缺点也明显:数据出网,部分敏感业务不能走;单次调用延迟不稳定;高频调用成本高。

第二种是本地部署开源大模型,我们用的是Qwen系列,通过Ollama或者vLLM部署在内网GPU服务器。这样数据不出内网,能够满足数据合规要求,批量推理成本也低。缺点是初期部署成本高,需要GPU资源,还得自己调优推理性能。

从Kafka消费者的角度,这两种路线都能适配,区别在于调用的同步阻塞时间。云端API的平均响应时间可能在1到5秒,本地模型批量推理反而更可控。我们最终选择了以本地部署为主、云端API做兜底的策略。

如果你正在做本地部署,推荐用vLLM做推理服务,它支持OpenAI兼容的API格式,可以通过HTTP调用。一个典型配置命令:

python -m vllm.entrypoints.openai.api_server \ --model /models/Qwen2.5-14B-Instruct \ --served-model-name qwen2.5 \ --tensor-parallel-size 2 \ --max-model-len 8192 \ --gpu-memory-utilization 0.9 \ --port 8000

跑起来之后,你的Java应用就能通过标准的OpenAI SDK或者HTTP POST调用了,这对我们这种Java技术栈的团队特别友好。

4.2 Spring AI框架与Kafka的整合

这里要提一下Spring AI框架。它是Spring生态为AI应用提供的开发框架,目标是让开发者用统一的方式接入不同的大模型。我们在调研阶段关注过Spring AI Alibaba,它对国内大模型的适配做得不错,而且和Spring Boot、Spring Cloud的整合程度很高。

在实际落地时,我们并没有把Spring AI和Kafka强行绑定。Spring AI的职责是封装大模型调用的接口,比如ChatClient、EmbeddingModel,让业务代码不用关心底层是通义千问还是本地Qwen。而Kafka的职责是负责消息的异步流转。两者在代码层面天然解耦。

一个典型的AI消费流程是这样的:Kafka消费者接收消息后,调用Spring AI的ChatClient完成大模型交互,拿到结果后再通过另一个KafkaTopic发出去。在Spring配置中,只需声明一个ChatClient的Bean:

@Bean public ChatClient chatClient(ChatClient.Builder builder) { return builder .defaultSystem("你是一个专业的内容审核助手,请判断文本是否包含违规内容。") .build(); }

Spring AI内部会管理模型端的对话状态,真正需要你处理的还是消息的可靠传递和批量调度这层逻辑。

4.3 AI Agent怎么消费Kafka事件:事件驱动式Agent设计

热词里有一个“AI Agent”,这块我们也在做。简单说,Agent是一个能自主规划、调用工具、完成复杂任务的AI系统。传统的同步调用方式不适合Agent,因为Agent的执行链路可能很长,中间要多次调用模型和多轮工具能力。如果用同步HTTP,上游会一直阻塞等待,体验极差。

我们的方案是给Agent加一个事件驱动外壳:Kafka里有一个Agent任务Topic,业务方只要把目标描述发进来,Agent消费者就会异步执行任务,任务过程中产生的事件也会写入Kafka,供前端实时推送进度。

例如客服场景:客户提交售后工单,系统把工单信息写入ai_agent_task。Agent消费者从Kafka拉取任务后,先调用分类模型判断工单类型,再决定走退款流程还是人工介入,最后生成处理建议。因为是异步的,整个过程可以在几秒到几分钟内完成,但用户端看到的是实时进度。

这种设计下,每个AI Agent相当于Kafka消费链路上的一环,多个Agent连起来就能实现复杂业务流程的自动化。和直接调Agent API相比,Kafka带来的好处是任务不丢失、可重放、可监控。

4.4 AI生成内容场景:短剧、漫剧等内容的异步流水线

热搜词里出现了AI短剧、AI漫剧这类内容形态。这类场景对技术架构的诉求是典型的异步流水线:文案生成、分镜生成、配音合成、画面渲染,每一步都是计算密集型的AI任务,而且依赖链很长。

我们目前的规划是:业务方把剧本大纲发布到ai_content_script,文案Agent消费后生成完整剧本,发到ai_content_storyboard;分镜Agent消费后生成分镜描述和画面提示词,发给渲染服务;渲染服务完成后把成片元数据写回ai_content_publish。每一步之间都是通过Kafka衔接,任何一步失败或者结果不满意,都可以重新向对应Topic发布一条消息再处理一遍。

这套流水线的核心收益是每两个环节之间都不需要等待,渲染服务干着上一批任务的时候,分镜Agent已经在为下一批任务生成了,整条管道的吞吐量比串行调用提升了一个量级。

5. 高可用与监控:Kafka Lag排查、消息延迟高的定位与处理

5.1 Kafka 消息延迟高的排查思路

线上跑了一段时间后,AI服务消费速度跟不上生产速度的问题就开始出现了。Kafka消息延迟高的原因通常有这几类:消费者处理慢、分区分配不均、消费线程阻塞、Broker性能瓶颈、网络带宽受限。

排查手段我建议从Kafka UI里直接看Consumer Group的Lag曲线。Lag就是“最大offset减去消费者当前已提交的offset”,Lag持续上涨,说明消费速度小于生产速度,积压正在扩大;Lag平稳则说明系统处于消费平衡状态。

一旦确认Lag上涨,先用Kafka自带的命令行工具看下每个分区的消费情况:

kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group ai-service-group

输出结果里重点关注CURRENT-OFFSET和LOG-END-OFFSET两列,差的绝对值就是该分区的Lag。如果发现某个分区的Lag特别大,而其他分区接近零,那就是分区数据倾斜,大概率是消息key设计不合理导致哈希不均匀。解决办法是换更离散的key,或者增加分区数配合消费者的并发数。

我们遇到过最诡异的一次延迟高,排查了半天发现是消费线程里有一条日志打印语句在调用远程接口,那个接口响应超时5秒,导致整个消费线程被卡死。所以消费线程里禁止做任何可能长时间阻塞的远程调用,这个一定要写进开发规范。

5.2 消息积压的快速处理三板斧

线上积压异常严重时,不能光靠加机器,还要有快速治理手段。

第一板斧是跳过积压任务,只处理最新消息。把auto-offset-reset临时改成latest,重启消费者,让它跳过历史积压数据。但这个方法要慎用,因为它会丢消息。

第二板斧是扩容消费者实例。消费者组内的实例数不能超过分区数,否则多出来的实例处于闲置状态。如果你有10个分区,当前只有2个消费者实例,那最多可以加到10个实例,每个实例处理一个分区,消费速度最多提升5倍。

第三板斧是临时关闭下游依赖。如果积压是因为下游AI模型服务变慢导致的,可以先让消费者把消息直接落到一个备份Topic,等模型服务恢复后再从备份Topic重放。这相当于把积压问题的压力从消费者转移到存储层,模型恢复后再集中处理。

这三种方式我们都在生产环境用过,最有效的还是第一板斧加第二板斧组合使用。

5.3 监控可视化与告警配置的最佳实践

Lag监控不能只靠人肉看Kafka UI,一定要配置自动化告警。我是把Kafka UI暴露的JMX指标接到Prometheus,再用Grafana展示曲线。消费组的Lag监控可以通过JMX的kafka.consumer:type=consumer-fetch-manager-metrics的records-lag-max属性拿到。

告警规则可以这样设计:Lag大于1000持续5分钟就触发Warning,大于5000持续5分钟就触发Critical。另外要监控消费者的处理时间,如果单条消息平均处理时间超过10秒,就算Lag不大,也要告警,因为这说明AI模型服务可能已经异常了。

5.4 Kafka和RabbitMQ在AI场景下怎么选

最后说下选型问题。知乎上天天有人问Kafka和RabbitMQ的区别,放在AI场景里我的体会是这样:如果你的AI任务是异步流水线、海量日志、高吞吐、需要消息重放,直接用Kafka,不用犹豫。如果你的AI任务是最多几十毫秒的轻量级回调、需要复杂的路由规则、或者消息量不大但对低延迟极度敏感,那RabbitMQ更合适。

还有一种混合方案:前端用RabbitMQ接收快速请求,后端把需要排队的AI任务转发给Kafka。我们的架构里暂时没做这一步,因为Kafka的延迟已经足够低,测试环境稳定在10到20毫秒左右,完全够用。

6. 常见问题速查表与面试级核心知识点整理

6.1 实操中遇到的典型问题与解决方案

把这几个月踩过的坑整理成一张速查表,方便后来人对照。

问题现象根本原因解决方案
连接Kafka报Connection refusedadvertised.listeners配置错误确保客户端可访问的IP地址正确,容器场景尤其注意
消费组不消费消息group.id不一致或offset提交异常检查消费者group.id,重置offset为earliest观察
消息消费重复enable-auto-commit=true且处理超时改为手动提交offset,配合幂等表去重
消费速度极慢max-poll-records过大且AI处理时间过长调小poll批次,开启批量推理
Rebalance频繁发生max-poll-interval-ms小于实际处理时间调大max-poll-interval-ms或减小批次
同一批消息乱序多线程并行处理单一分区消息保证单分区内只串行处理,或用bizId做key分区

6.2 Kafka核心机制:面试必问的offset与分区知识点

因为热词里大量出现Kafka面试题,干脆把几个常见问题一并讲透。

面试官问“Kafka如何保证消息不丢失”,回答分三段:生产端用acks=all加retries;Broker端设置replication.factor大于1且min.insync.replicas设置为2;消费端使用手动提交offset,处理成功后再提交。把这三层说清楚,这个问题基本就过关了。

问到“Kafka为什么快”,核心是顺序写盘、页缓存、零拷贝。Kafka的消息是追加写入分区日志文件的,磁盘顺序写入的速度接近内存随机访问。消费者读取时利用sendfile系统调用,数据从磁盘直接通过内核页缓存发送到网卡,减少了一次用户态拷贝,性能自然高。

问到“分区数和消费者数什么关系”,单分区只能被消费组内一个消费者实例消费,所以消费者实例数多于分区数时,多出来的实例是空闲的。要提升消费吞吐,优先增加分区数,再增加消费者实例数。

这些知识点搞明白之后,你会发现Kafka的运维和开发都不再是黑盒。

7. 生产实践感受与扩展建议

改造上线这一个月,我的体会是Kafka接入AI这件事,真正的难度不在Kafka本身,而在于把消息语义和AI任务的生命周期对齐。AI任务天然有长耗时、不确定延迟、部分失败等特征,Kafka恰好提供了异步、重试、回溯的机制,两者的结合并不是巧合,而是解耦需求的必然选择。

我个人在实际操作中最后悔的一件事,就是没有在项目启动的第一天就把全链路traceId埋好。Kafka的异步链路排障和同步调用完全不同,没有消息ID贯穿始终的日志,定位一条消息从生产到AI处理结束的完整路径简直是噩梦。如果你们也要做类似的接入,建议从第一天就把messageId贯穿全链路,日志采集直接带上traceId。

另一个想提醒的是,AI模型升级后,一定要主动利用Kafka的消息重放能力做回归验证。我们在升级文本分类模型时,把线上过去24小时的Topic数据重放了一遍,对比新旧模型的处理结果差异,提前发现了模型升级会误伤正常业务的场景。有了Kafka这个“时光机”,模型调优的灰度验证会安全很多。

后续我们规划的方向主要有两个。一是引入Kafka Streams做轻量级的实时数据处理,把一些简单的文本预过滤直接放在流处理阶段,减少AI模型的无效调用。二是基于Kafka实现多Agent编排,把AI Agent的执行状态和事件总线打通,让Agent之间的协作彻底事件化。这块等跑出更多数据之后,我再专门写一篇分享。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进