大家好,我是程序员天天困。
翻 Kafka 4.3 发布公告时我愣了一下:致谢名单里写着 Claude、Claude Sonnet 4.6 和 Copilot。一个消息队列的版本发布,贡献者里混进了 AI。不过 Kafka 接入 AI 真正值得聊的,不是让 AI 帮你写 Kafka 代码,而是给 AI 系统补上三类能力:操作 Kafka、记住上下文、实时处理数据。
这篇把三条路线一次讲完:讨论中的第一方 MCP Server 提案、Streams 会话记忆、Flink SQL 实时上下文。每条我都写清它现在的真实状态、示例代码的前置条件,以及哪些权限现在不能开。点个收藏,我们开始。
如果你对 Kafka 本身还不熟,建议先看我这篇 Kafka 讲解文章,把 topic、分区、消费组这些基本概念过一遍;这篇默认你已经知道它们是怎么回事。
先看证据,这不是段子:

截图出自 Apache Kafka 4.3.0 Release Announcement 底部的 Summary 段:第一处红框是「147 contributors (and 3 AIs)」,第二处是名单里的 Claude、Claude Sonnet 4.6 和 Copilot。
一、先说结论:Kafka 接入 AI,补的是操作、记忆与实时处理三类能力
Kafka 接入 AI 最容易被讲歪的地方,是让人以为要给 Kafka 装一个大脑。它不需要。前两类能力------让 Agent 能操作、能记住------是许多 Agent 系统需要补齐的短板;第三类是把模型推理接进流处理,让数据在流动时就带上判断。
MCP(Model Context Protocol,模型上下文协议):Anthropic 在 2024 年 11 月 25 日提出、2025 年 12 月捐赠给 Linux 基金会 Agentic AI Foundation 的开放标准,用 JSON-RPC 2.0 把外部系统包装成 AI 能调用的工具和资源。你可以把它理解成「AI 工具的 USB-C 接口」。
Kafka MCP Server(KIP-1318 提案):一份仍在讨论中的社区提案,计划给 Kafka 加一个第一方的 MCP 服务进程,把 topic、消费组、ACL、Connect 这些运维操作暴露成标准工具。相当于给集群配一位会讲 MCP 的运维值班员------注意,这目前只是提案,不是已交付的功能。
上下文存储(Context Store):本文用这个词指「按会话键保存、可查询上下文的视图」,下面用 Kafka Streams 实现。说白了,就是把散落的聊天记录压成一张随时能查的表。
打个比方。以前的 Kafka 像公司前台:访客来了自己填表、自己找部门,前台只负责把单子转出去。MCP 是给前台配了一本标准问答手册,AI 助理照着就能办事;上下文存储是给前台配了一本会议纪要,谁上次说了什么一翻就知道;流处理里的模型调用则像前台旁边坐了位分析员,单子还在流转就已经标注好了。手册管「能做什么」,纪要管「记得什么」,分析员管「实时看懂」------这三件事,恰好是 Agent 落地时最费劲的部分。
三条路线各自解决其中一块:
- 路线一,让 Agent 能操作 Kafka:讨论中的第一方 MCP Server,集群运维变成可调用的工具;
- 路线二,让 Kafka 当 Agent 的记忆:Streams 把会话日志聚成 KTable,Agent 查询读回来;
- 路线三,让模型推理进入流处理:在 Flink SQL 里调用 AI 函数,数据还在流里就把标签打好了。
三者不是替代关系,位置也不同。先看全貌:

二、路线一:讨论中的第一方 MCP Server,让 Agent 操作 Kafka
三条路线里,MCP 这一条最容易被当成「Kafka 已经接入 AI」的实锤,所以得先泼盆冷水:它现在还是一份提案,没随任何正式版交付。
KIP-1318 的当前状态是 Under Discussion,截至 2026 年 9 月 16 日仍未进入发行状态。它的时间线大致是这样:
| 时间 | 事件 |
|---|---|
| 2026-04-07 | KIP-1318 提案创建 |
| 2026-04-21 | 讨论邮件发到 dev@kafka.apache.org(邮件原文日期;按北京时间已是 4 月 22 日) |
| 2026-05-22 / 2026-06-25 | 4.3.0、4.3.1 先后发布,公告里都没有它 |
| 2026-08-01 | wiki 最后一次修改,状态仍是 Under Discussion |
| 2026-08-11 / 08-13 / 08-21 | 4.4 切分支、代码冻结、发起 RC0 投票;其发布计划同样未列 KIP-1318 |
表格之外还有几点要补充:4.3.1 是修 Kafka Streams RocksDB 原生内存泄漏的 bugfix 版本,本来就不加新功能;4.4 那条用的是邮件列表里的实际日期,不是发布计划里的计划日期。KAFKA-20436 是跟踪这份提案的 JIRA 任务,目前仍是 Open、未分配、未指定修复版本------有跟踪任务,不等于开发已经推进到可用阶段。另外,截至核查时官网博客最新的发布公告是 4.3.1,我没看到 4.4 的正式发布公告。
所以现在说「Kafka 官方已支持 AI Agent 操作集群」,是不准确的。准确的说法是:已有社区成员提出 KIP,正在讨论要不要给 Kafka 加一个第一方的 MCP 接口。
那它为什么值得等?因为运维面确实宽。Producer、Consumer、Streams、Connect、Admin 五套核心 API 覆盖的操作很多(提案作者估计超过一百个,这个数字没有公开的计数口径),而 Agent 常干的事------建个 topic、看消费组积压、把挂掉的 connector 重启------今天要么写 Java/Python 客户端代码,要么敲 kafka-topics.sh 这类命令行,要么 curl Connect 的 REST 接口。这些能力当然存在,但 Agent 要在里面干活,得逐个封装工具、逐个配权限,缺一个统一入口。

KIP-1318 的解法是增加一个独立的服务进程(放在 tools/mcp-server 模块,不跑在 broker 里),不改 Kafka 的 wire protocol;核心操作封装官方 Java 客户端,Connect 操作通过 Kafka Connect 的 REST API 完成。它能暴露的东西大致分这几类:
| 类别 | 代表操作 | 是读还是写 |
|---|---|---|
| Topic 管理 | 创建、删除、改配置、加分区 | 写(删除属高危) |
| 消息读写 | 生产、批量生产、事务性生产、消费 | 读 + 写 |
| 消费组 | 查积压(读)、重置位点与移除成员(写) | 读 + 写 |
| ACL 与集群 | 增删 ACL、改 broker 配置、leader 选举 | 高危写 |
| Connect | 创建、暂停、重启 connector 与 task | 写 |
资源侧是只读的,用 kafka:// 开头的 URI 暴露,比如 kafka://topics、kafka://groups/{id}/lag、kafka://cluster/metadata-quorum。客户端可以通过对应的资源 URI 读到结构化的 lag 信息,不用自己拼 Admin API。
提案里的安全设计值得单独看一段。KIP 列了一整套闸门:mcp.readonly=true 会关掉所有写操作,连 produce 都关------注意它的默认值是 false,不是默认只读;mcp.tools.allowed 和 mcp.tools.denied 分别是允许名单和拒绝名单,后者优先;mcp.allowed.topic.prefixes 把可操作的 topic 限制在 agent.、sandbox. 这类前缀内,但它只约束 topic 级操作,集群和 ACL 的管理权限还得靠只读开关、名单和 broker 侧 ACL 一起兜;破坏性工具默认需要一枚带外签发的人工审批令牌;mcp.audit.topic 把每一次调用(身份、工具、参数、决策、结果)追加写进指定的 topic 做审计。
还有一道防线叫 taint guard:它会尝试把不可信读取的结果与破坏性工具的参数做规范化精确或子串匹配,命中就要求有效审批令牌,否则返回 -32040。这只是尽力检测,模型改写、重新编码或部分引用都可能绕过。真正限制破坏范围的,仍是审批、只读模式、资源范围和 broker 侧的最小权限 ACL。
一条完整调用长这样:

可能有人会问:KIP-1318 还没交付,那我现在能用什么?
现在已经有社区和厂商提供的 Kafka MCP 实现。以
mcp-confluent为例,它当前的官方说明已支持 Confluent Cloud、Confluent Platform 和独立的 Apache Kafka 部署。两点要留意:这个开源实现属于社区支持,官方写明是 best-effort、没有服务等级承诺;如果你本来就用 Confluent Cloud,那边另有一套全托管的 MCP Server,权限走现有的 RBAC,但覆盖的是 Confluent Cloud 上的资源。具体可用工具、认证方式和部署限制,还是按你用的版本逐项检查------不同实现覆盖范围差异较大,KIP 里对第三方实现的早期比较也不宜直接当成现状。
三、路线二:把 Kafka 当 Agent 的记忆,用 Streams 存会话上下文
如果系统已经以 Kafka 为事件主干、又有多个组件要读会话状态,这条路的性价比最高。会话记忆不必急着上向量库,用 Kafka Streams 落成 KTable 就够了。
道理不复杂:Agent 之间用 Kafka 传消息时,对话本身就已经是一条可重放的日志。用户消息、机器人回复、人工接入,都躺在各自的 topic 里。再搬进 Postgres 或 Redis 存一遍,可能需要额外维护一套外部存储和同步链路。Streams 直接把这些 topic 读进来按会话 ID 聚合,记忆就地和消息待在同一个数据面。
但有一点得先讲清楚:Kafka 的顺序保证只在分区内。三个 topic 即便都用 sessionId 作 key、分区数也一致,merge() 也不保证不同输入流之间的相对顺序。也就是说,Kafka 为分区内事件提供可重放的顺序日志,但跨 topic 合并时,仍要显式处理会话顺序、迟到和重复消息------比如给 Turn 带上会话序号、事件时间和唯一事件 ID,并约定好乱序与去重的策略。
下面是核心拓扑片段(省略了 Turn、SessionContext 的类型定义、serde 和应用配置,不能直接运行):
java
StreamsBuilder builder = new StreamsBuilder();
// 三个来源合并:用户提问、机器人回复、人工客服回复
KStream<String, Turn> turns = builder
.stream("cs.user.turns", Consumed.with(Serdes.String(), turnSerde))
.merge(builder.stream("cs.bot.replies", Consumed.with(Serdes.String(), turnSerde)))
.merge(builder.stream("cs.agent.replies", Consumed.with(Serdes.String(), turnSerde)));
聚合前显式重分区,避免不同来源的 key 分布把同一通会话拆散:
java
turns
.repartition(Repartitioned.<String, Turn>as("session-turns")
.withKeySerde(Serdes.String())
.withValueSerde(turnSerde))
.groupByKey(Grouped.with(Serdes.String(), turnSerde))
.aggregate(
SessionContext::new,
(sessionId, turn, ctx) -> ctx.append(turn),
Materialized.<String, SessionContext, KeyValueStore<Bytes, byte[]>>as("session-context")
.withKeySerde(Serdes.String())
.withValueSerde(contextSerde));
聚合结果是一张 KTable,但别把它想成「自动帮你存下每轮完整历史」:KTable 是表的逻辑抽象,保存什么由聚合器决定。本地状态库通常是 RocksDB,也可以配成别的 store。省下来的是「额外一套外部数据库和同步组件」,不是没有复制、没有存储开销------原始 topic、本地状态、changelog 仍然是三份不同的副本。
容易被忽略的还有状态体积:changelog 的 compaction 保留的是每个 key 的最新记录版本,不会因为你在 SessionContext 里一直 append 就把数组压小。无界追加会让序列化、更新和恢复的代价持续上涨,还可能撞上单条记录的大小上限。所以至少要设计清理策略------只留最近 N 轮、把更早的记录摘要化,或者按会话生命周期删掉,而且这些都得靠应用逻辑,不能只指望 compaction。
至于「进程挂了会不会丢」:在 changelog 和输入日志可用、配置正确的前提下,已提交状态可以恢复并回放,但恢复本身是要花时间的。
「就地成表」的思路,下面这张图讲得比较直观:

同一个应用里还能顺手挂第二个视图:用五分钟的固定窗口(tumbling window,五分钟一段、不重叠)统计用户提问次数,给频率监测提供信号。
java
builder
.stream("cs.user.turns", Consumed.with(Serdes.String(), turnSerde))
.groupByKey()
.windowedBy(TimeWindows.ofSizeWithNoGrace(Duration.ofMinutes(5)))
.count(Materialized.as("turns-5m"));
NoGrace 把 grace 设成 0,窗口按流时间关闭之后再到来的记录会被丢弃,不是按墙上时钟算。这个计数只是限流决策的一个输入,代码本身没有执行限流;想识别「用户是不是在反复问同一个问题」,还得结合问题内容的归一化或相似度判断,光按 sessionId 计数看不出来。
Agent 侧的读取靠交互式查询。如果 Agent 和 Streams 跑在同一个进程,且这通会话的状态正好由当前实例持有,直接查本地状态库就行:
java
ReadOnlyKeyValueStore<String, SessionContext> store = streams.store(
StoreQueryParameters.fromNameAndType("session-context",
QueryableStoreTypes.keyValueStore()));
SessionContext ctx = store.get(sessionId); // 拼进下一轮 prompt
多实例部署、或者 Agent 单独成服务时,状态是分散的:得先按 key 找到状态所属的实例,再走自建的 RPC/REST 接口去读,Kafka Streams 不会替你提供完整的远程查询服务。查询还要处理状态尚未就绪、正在恢复或正在 rebalance 的情况;刚写进输入 topic 就去查,也不保证能读到最新一轮。
有个坑必须单独拎出来说。上面那段 merge().groupByKey() 的拓扑,不会因为合并了多个来源就自动统一分区。groupByKey() 不会主动触发重分区,merge() 也不统一各来源的 key 分布。如果几个来源的分区数、key 序列化方式或分区策略不一致,同一通会话的消息可能进入不同 task,聚合状态就会不完整。
上线前应该核对实际拓扑与分区策略,而不是只数一数分区数;上游一致性没法保证时,就在聚合前显式 repartition()------代价是多一个内部 topic 和一次读写。另外,显式重分区也不会自动恢复跨来源的业务时间顺序。

这条路也不是人人该上。单个 Agent、流量不大,Postgres 里一行记录就够用,硬上 Streams 是给自己加运维面。它划算的前提是:系统已经以 Kafka 为事件主干、量也不小,而且你希望记忆和其余流量共享同一套顺序保证、回放能力和 ACL。
可能有人会问:那向量检索不是更该用向量库吗?
两种记忆不是一回事。向量库擅长按语义找相似内容,适合知识库问答;会话上下文要的是「这通对话刚才说了什么」的精确定位,按 key 查一遍就够了。真要做 RAG,常见做法是让流处理把消息生成 embedding 写进向量索引,Agent 查询时再做语义检索------向量检索不是普通的 key join,能不能在流里 join 回来看连接器和外部系统的支持情况。
四、路线三:让模型推理进入流处理,Flink SQL 调用 AI 函数
前两条是让 Kafka 服务 AI,这条反过来:把模型推理接进流处理的链路里。注意模型本身仍运行在外部端点,Flink 只是发起调用。
Confluent 在 Confluent Cloud 上把这套能力做成了产品,统称 Confluent Intelligence,底座是 Flink SQL,做法是把「调模型」抽象成 SQL 里的一次调用。下面这个客服情绪打标的例子按官方文档的签名写,未在 Confluent Cloud 实测:
sql
-- AI_SENTIMENT 当前为 Early Access,需先开通相应能力
-- 返回结构化 ROW,不是单个情绪字符串
SELECT
ticket_id,
content,
AI_SENTIMENT(content, ARRAY['support']) AS sentiment_result
FROM cs_user_turns;
如果要做时序异常检测,得另起一个带时间戳和 watermark 的时序表,用窗口语法调用:
sql
-- server_metrics 需按官方要求定义 event_time 与 watermark
SELECT
event_time,
response_ms,
AI_DETECT_ANOMALIES(
response_ms,
event_time,
JSON_OBJECT('model' VALUE 'ttm')
) OVER (
ORDER BY event_time
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
) AS anomaly_result
FROM server_metrics;
需要布尔标记时,在外层 SELECT 里读 anomaly_result.is_anomaly。
官方文档里现成的函数还有 AI_FORECAST(时序预测)、ML_PREDICT(远程模型推理)、AI_COMPLETE(文本生成)、AI_EMBEDDING(生成向量)、AI_TOOL_INVOKE(调用 MCP 工具),另外配了 CREATE MODEL、CREATE AGENT、CREATE TOOL 三条语句,分别用来定义模型、Agent 和工具。这些能力的开放状态各不相同,具体参数以官方文档为准,别照抄二手博客。
Confluent Intelligence:Confluent Cloud 上用 Flink SQL 构建 Agent 工作流的一组能力,包含 Streaming Agents、Real-Time Context Engine 和内置 AI/ML 函数。可以理解成把「调模型」抽象成 SQL 里的一次调用。
这里面有个设计思路值得学:它把 AI 分成两条腿。一条是流里的函数调用,数据到哪就标到哪;另一条是 Real-Time Context Engine(RTCE),从 topic 持续摄入数据、物化到低延迟的服务层,再用 MCP 把业务数据开放出去。官方文档写得很直白,让 Agent 通过 MCP 工具查数据,而不是直接连 Kafka。
需要分清的是,RTCE 和 KIP-1318 的集群运维 MCP Server,以及 Streams 的 KTable 记忆,是三套不同的东西,只是思路上都用了「统一工具访问 + 状态物化」。支持 MCP 的 Agent 可以通过统一接口拿到业务上下文,但实时不等于零延迟------端到端的新鲜度还是受消费和处理延迟影响。
代价也直说。这条路依赖托管服务,自建 Flink 得自己接模型端点;成本也不只是「一条消息一笔模型费」------模型推理会增加开销,你还得同时估算 Flink 的计算量(Confluent 的 Flink 按 CFU 计量)、所选模型的请求或 token 用量,以及存储和传输费用,按实际函数与服务的计费规则核算。所以我更建议把 AI 函数用在「值得花这个钱」的那部分流上,比如工单情绪、支付异常,其余流老老实实做规则判断。
还有一点必须单独提醒:Confluent Cloud 确实提供了这些 AI 能力,但开放范围和成熟度因功能而异,限制也很具体。本文用到的 AI_SENTIMENT、AI_DETECT_ANOMALIES 当前仍标注为 Early Access,只适合用于评估和非生产测试;RTCE 的官方文档写明它只在 AWS 的 Basic、Standard、Enterprise、Dedicated 集群上可用,且要求 topic 已注册 schema。上线前得逐项核对集群类型、区域和开通条件。
五、三条路线怎么选
纠结的时候我会先问一句:你要解决的是「AI 能动手」「AI 记得住」还是「AI 能获得新鲜上下文并做实时处理」。三个问题对应三条路,顺序该由业务问题决定,而不是哪条更先进。
| 路线 | 解决什么 | 现在的状态 | 主要成本 | 主要风险 |
|---|---|---|---|---|
| 第一方 MCP Server(KIP-1318) | Agent 操作集群 | 讨论中的提案,截至 2026-09-16 未见正式交付 | 等官方 + 先用社区实现 | 权限放大,误操作 |
| Streams 上下文存储 | Agent 会话记忆 | 今天即可自行构建 | 一套 Streams 应用的运维与状态存储 | 分区或顺序不一致导致聚合状态不完整 |
| Flink SQL AI 函数 | 实时打标与预测 | 功能状态各异,本文两项函数为 Early Access | Flink 计算资源 + 相应模型费用 | 成本与标签质量 |
只有一条经验值得留着:给 Agent 开集群权限这件事,放在你摸清它的记忆和上下文是否可靠之后再做。至于先上哪条,看业务问题------系统已经以 Kafka 为事件主干、又有多个组件要读会话状态的团队,路线二的收益最直接;想先让 Agent 参与运维的,得先把权限边界设计好。
六、上线前的四件事
下面提到的 mcp.* 字段都来自 KIP 草案,现有社区实现用的是各自对应的配置项,别直接照搬字段名。
第一,权限从只读起步。用只读账号加 ACL,把可操作的 topic 卡在前缀白名单里,跑顺了再逐条放开。(草案里的对应开关是 mcp.readonly,默认值是 false,要显式打开。)
权限开放顺序见下图:

第二,审计落在 Kafka 自己的 topic 上。mcp.audit.topic 记录的是一次调用的身份、工具、参数、决策和结果,但 Kafka 的追加写语义不等于数据永远删不掉------retention、compaction 和管理权限都会影响审计保留。正确做法是给审计配一个独立、受限的写入身份,禁止它删除审计 topic、修改保留配置或清理记录,并设置合适的保留策略;强审计需求还应同步到独立的持久审计系统(比如 WORM 或 SIEM)。
第三,核对分区策略。会话记忆要和会话消息同 key、同分区数、同序列化和分区器;上游一致性没法保证时,在聚合前显式 repartition()。
第四,算清成本账。模型推理、Flink 计算量、存储与传输都要算进去,先用一小部分流验证效果和成本,再决定要不要全量。
以 2026 年 9 月的状态看:Streams 会话状态这条今天就能自己搭;第一方 Kafka MCP 还在讨论;Confluent Cloud 的 AI 能力要逐个核对开放状态。三条路没有统一的先后顺序,能确定的只有一件事------先把权限和状态正确性弄扎实,再让 Agent 动生产集群。
我是程序员天天困,持续分享编程干货。觉得有用的话记得点赞收藏和关注~也欢迎在评论区聊聊:Kafka 接入 AI 之后,你更愿意先把 Agent 的记忆落到 Streams 上,还是先给它开一个只读的集群权限?