☰
Kafka作为AI数据底座:从部署到监控的完整实践
2026/10/17 20:42:32 网站建设 项目流程

最近团队里讨论最多的一件事,就是“Kafka已正式接入AI”。严格说,这不是什么炫技式的“Kafka写一个AI模型”,而是把 Kafka 真正当成 AI 应用的数据底座,让消息流变成模型推理的输入,让推理结果再回流到业务链路。我过去几周一直在折腾这套东西,从集群部署、生产消费链路设计,到消息延迟排查、lag 监控,踩了不少坑,也沉淀了一些能直接抄作业的方案。这篇就把整个过程拆开讲清楚,覆盖架构选型、环境部署、Spring Kafka 配置、AI 服务对接、监控排障和常见问题,适合正在做 AI 应用开发、数据管道建设,或者准备在现有系统里引入 Kafka 做 AI 特征/推理数据通道的团队参考。

1. Kafka接入AI的整体思路与架构设计

1.1 为什么 AI 场景需要消息队列

AI应用和传统业务系统的最大区别在于,它的数据链路天然是异步的。用户请求进来,模型推理可能要几百毫秒甚至几秒,如果直接在请求线程里同步等待,QPS 上不去,用户也容易超时。更常见的做法是,把用户行为、业务事件、特征数据先丢到一个稳定的中间层里,由后端的推理服务异步消费,批量或者流式地完成预测,再把结果回调给业务。

Kafka 在这个位置上几乎是天然选择。它能做到高吞吐、持久化、可回放,消费者可以根据模型服务的吞吐能力自己调节消费速度。模型升级之后,还可以从历史 offset 重新消费数据,等于让 AI 模型“回到过去”重新推理一遍,这在 A/B 测试、模型回放验证场景里非常实用。我见过不少团队一开始用 Redis 队列或者 HTTP 回调来做这个中间层,数据量小的时候没问题,一旦流量上来,丢消息、顺序错乱、无法回溯的问题全来了,最后还是换回了 Kafka。

这里有一个关键认知要纠正一下:Kafka 不是用来替代数据库的,它是给数据“做缓冲和分发”的。AI 场景里,Kafka 管的是数据的流动和时序,最终的特征存储和结果存储还是需要 ClickHouse、ES、MySQL 这类系统来兜底。

1.2 整体架构怎么搭:从数据接入到推理回流

这次接入 AI,我们的目标很简单:把线上业务产生的实时事件流交给 AI 推理服务,得到结果后回流到业务库和监控大盘。最终定下来的架构是四层:

  • 第一层是数据源层,包括业务日志、用户行为埋点、订单事件等;
  • 第二层是接入层,统一由 Kafka Producer 写入,按业务域拆分成不同 topic;
  • 第三层是AI处理层,独立部署推理服务,通过 Consumer 订阅 Kafka topic,完成特征计算、模型推理;
  • 第四层是回流层,推理结果写入结果 topic,下游有结果落地服务负责同步到 ES/MySQL,同时接入监控系统做延迟和 lag 监控。

这套结构的核心优势在于解耦。数据源不用关心推理服务在哪、推理多久完成;推理服务也不必关心数据从哪来。大家只跟 Kafka 打交道,接口就是 topic 名和消息格式。后续如果要换模型、加模型版本,只要修改消费端的逻辑,上线新的消费者组即可,完全不用动上游。

架构里还有两个容易被忽略的组件,一个是 Schema Registry,用来统一消息格式,比如用 Avro 或者 Protobuf,避免上下游字段变动导致解析失败;另一个是监控面板,Kafka 的 lag、消息延迟、生产消费速率都要可观测,否则出问题只能靠猜。

1.3 Kafka 和 RabbitMQ 在AI场景怎么选

很多刚接触消息队列的人都会纠结“Kafka 和 RabbitMQ 的区别”。在日常业务消息场景里,如果你只需要一个简单的任务队列,RabbitMQ 就够了,它支持复杂的路由规则、延迟队列、死信队列,运维也简单。但 AI 场景通常涉及海量事件流、需要消息回放、需要按 key 保证顺序,这时候 Kafka 更合适。

具体对比一下。Kafka 的吞吐量要比 RabbitMQ 高出至少一个数量级,单分区顺序写入,适合日志和事件流;而 RabbitMQ 的强项是灵活的路由和消息确认机制,适合点对点任务分发。AI 推理场景里,相同特征 key 的数据必须按顺序喂给模型,Kafka 的分区机制天然支持这一点,只要 producer 指定同一个 key,消息就会进同一个分区,消费端就能保证顺序。而 RabbitMQ 的队列模型在这种“流式处理”场景下就比较吃力。

还有一点,Kafka 的消费是基于 offset 的,消费者可以主动重置 offset 重新消费,这在模型调参、数据回放时价值巨大。RabbitMQ 消费完消息就删除了,想做历史回放非常麻烦。所以在 AI 数据管道这个赛道上,Kafka 基本是标准答案。

2. 环境准备与 Kafka 集群部署

2.1 安装方式怎么选:包安装、Docker 还是 K8s

Kafka 的安装方式,网上教程很多,但很多都只教你怎么 start 一下,真到了生产环境就掉链子。我这次搭建,对比了三种方式:直接下二进制包、Docker Compose、K8s Operator。结论是:单机测试用 Docker 最省事,生产环境至少三节点起步,用二进制包或者 K8s 都行,但千万别在 Windows 上裸跑生产集群,别问我怎么知道的。

单机测试时,我推荐用 Docker 快速起一个 Kafka 实例,配合一个 Kafdrop 或者 Kafka UI 可视化工具,能省很多事。这里有一个大坑:新版 Kafka 镜像里通常不带单独的 Zookeeper 了,KRaft 模式已经成熟,直接用 Kafka 自带的 controller 就可以。如果你看到某个教程还在让你额外装 Zookeeper,先看它用的 Kafka 版本,3.0 以下的才需要。

我这次用了 KRaft 模式部署,配置文件里核心就是三个部分:process.roles 指定节点角色、controller.quorum.voters 指定 controller 列表、listeners 配置内外网监听地址。相比 Zookeeper 模式,少维护一个组件,部署和升级都清爽很多。

2.2 Docker 快速部署 Kafka 的完整步骤

如果只是想本地跑通 Kafka 和 AI 的链路,用 Docker Compose 是最快的。我贴一份可以直接用的配置,Kafka 3.6 版本,KRaft 单节点模式。

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

这个配置里最需要注意的是 KAFKA_CFG_ADVERTISED_LISTENERS,这个地址是给客户端连接的,如果客户端不在本机,这里就要改成宿主机 IP。很多人容器起来了,本机连不上,八成就是这个问题。

启动之后,可以执行 docker exec 进入容器,用命令行验证一下。

docker exec -it kafka bash cd /opt/bitnami/kafka/bin # 创建测试主题 kafka-topics.sh --create --topic ai-events --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1 # 查看主题详情 kafka-topics.sh --describe --topic ai-events --bootstrap-server localhost:9092

如果能看到分区数和副本信息,说明 Kafka 已经正常工作了。本地开发阶段,可视化工具我推荐 Kafdrop,界面清楚,能看到 topic、分区、消息内容,排查问题比命令行直观很多。启动的时候加一个 Kafdrop 容器,端口 9000,浏览器打开就能用。

2.3 生产环境集群配置要点

本地单节点能跑通链路之后,千万别直接拿去生产。生产环境的 Kafka 集群,我这次经验总结下来,有几个点必须提前规划好。

首先是节点数。Kafka 集群至少三台 broker,配合三副本,保证一台宕机数据不丢。如果业务量小,三台足矣;如果日消息量过亿,建议五个节点起步,按照吞吐量反推分区数,再决定 broker 数。

其次是内存和磁盘。Kafka 不是计算密集型的,但它吃磁盘和页缓存。单个 broker 的堆内内存一般给 4-6GB 就够了,剩下系统内存尽量留给 page cache,因为 Kafka 读写大量依赖操作系统页缓存。磁盘一定要用 SSD,机械盘跑 Kafka 会让延迟飙升。另外,retention 策略要根据消息量设置,默认 7 天,如果 AI 场景需要回放训练数据,可能需要 30 天,磁盘容量要按这个估算。

第三是网络。客户端和生产端如果不在同一个机房,建议走内网,不要透过公网直连 Kafka。公网延迟高、带宽不稳定,分分钟把生产端的 batch 机制破坏掉。

2.4 安装后必做的三项验证

集群部署完,不要急着写代码,先在命令行层面把环境验证一遍,不然后面出了问题会分不清是业务代码的问题还是集群的问题。

一是验证生产消费。开两个终端,一个执行 kafka-console-producer 发送消息,一个执行 kafka-console-consumer 接收消息。这里有个很多新手都困惑的点:kafka-console-consumer 启动之后不会退出,会一直运行等待新消息,这不是卡死了,而是消费端本来就是常驻进程。测试完按 Ctrl+C 退出就行。

二是验证分区容错。往一个有副本的 topic 里生产数据,然后手动 kill 掉一个 broker 进程,再消费数据,看能不能正常读到。如果配置正确,leader 会重新选举,消费者通过新的 leader 继续消费。

三是验证跨节点消费组。写一个简单的消费者,指定 group.id,启动两个实例,看消息是不是均匀分配到两个实例上。如果所有消息都只被一个实例消费,说明分区数有问题或者 group.id 配置不对。

3. AI链路的核心实现:从消息模型到推理服务对接

3.1 消息格式设计:别在 topic 里塞 JSON 裸消息

AI 场景的消息格式设计,往往比 Kafka 本身更重要。我第一次做的时候,直接把整个请求体 JSON 字符串塞进 value,topic 名字也起得随意,结果后面做数据回放的时候根本没法过滤和反序列化。

这次我们确定了一套规范。Topic 命名统一为应用名.事件类型.版本,比如order-service.paid-event.v1,区分业务域。消息体里面必须包含四个基础字段:event_id全局唯一标识、event_type事件类型、occurred_at业务发生时间、payload业务数据,其中 payload 使用 ProtoBuf 序列化,比 JSON 节省 60% 以上的空间,解析效率也更高。

syntax = "proto3"; message AIFeatureEvent { string event_id = 1; string event_type = 2; int64 occurred_at = 3; string user_id = 4; Map<String, string> features = 5; }

消息格式统一之后,AI 推理服务接到的每一条消息都是结构化的特征向量,不需要做过多解析和清洗,直接进入模型前处理环节。如果团队还没有引入 Schema Registry,至少要在代码仓库里管理好 ProtoBuf 文件的版本。

3.2 Producer 端参数配置:AI 场景不能直接抄默认值

AI 数据链路对 Producer 的实时性要求比较高,默认参数需要针对场景调整。最核心的是acks参数。AI 特征数据丢了,模型推理结果就会出现空洞,所以我把 acks 设为 all,配合enable.idempotence=true,保证消息不丢也不重复。

另一个重要参数是linger.ms。默认值是 0,每条消息都立刻发出去,吞吐量上不去。但如果设置太大,消息会积压,增加端到端延迟。我做了一个折中,linger.ms=5和batch.size=16KB,一次请求聚合 16KB 或 5 毫秒内的消息再发送,吞吐和延迟平衡得不错。

Properties props = new Properties(); props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092"); props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName()); props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ProtobufSerializer.class.getName()); props.put(ProducerConfig.ACKS_CONFIG, "all"); props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true); props.put(ProducerConfig.LINGER_MS_CONFIG, 5); props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384); props.put(ProducerConfig.RETRIES_CONFIG, 3);

还有压缩类型,我用的compression.type=lz4,CPU 开销小,压缩比也不错。生产环境里 Kafka 的瓶颈往往在网卡带宽,开启压缩之后,同样带宽下能多传几倍的消息量。

3.3 Spring Kafka 接入:YAML 配置怎么做才规范

团队里用 Java 的同事比较多,所以消费端统一走 Spring Kafka。起步很快,但是 YAML 配置必须规范,尤其是 AI 场景要做并发消费和幂等,配置不对会导致消费能力上不去或者重复消费。

下面是我们在生产环境使用的核心配置,消费线程并发数根据 topic 分区数动态调整,经验值是分区数等于并发数,才能把分区并行消费的能力吃满。

spring: kafka: bootstrap-servers: localhost:9092 producer: key-serializer: org.apache.kafka.common.serialization.StringSerializer value-serializer: io.confluent.kafka.serializers.protobuf.KafkaProtobufSerializer properties: schema.registry.url: http://schema-registry:8081 consumer: group-id: ai-inference-group key-deserializer: org.apache.kafka.common.serialization.StringDeserializer value-deserializer: io.confluent.kafka.serializers.protobuf.KafkaProtobufDeserializer properties: schema.registry.url: http://schema-registry:8081 specific.protobuf.value.type: com.example.AIFeatureEvent enable-auto-commit: false auto-offset-reset: latest max-poll-records: 200 listener: concurrency: 6 ack-mode: manual_immediate

两个容易踩坑的地方。第一,enable-auto-commit必须设为false,如果开启自动提交,消费者拉取消息后可能没来得及处理就提交了 offset,一旦程序崩溃,这批消息就丢了。第二,ack-mode建议用manual_immediate,处理完一条就手动提交一条,配合enable-auto-commit=false,可以做到 at-least-once 语义。

3.4 消费端与 AI 推理服务的对接策略

消费端拿到消息之后,怎么和推理服务对接,这是整个方案里最值得斟酌的地方。直接在所有消息里同步调用模型推理接口,如果模型响应慢,消费线程会被阻塞,Kafka 的 lag 会越积越多。

我的做法是,消费端只负责把消息聚合分流,真正的推理放到独立的执行线程池里。Kafka 消费者线程从poll拉回一批消息,拆分成任务丢给线程池,推理完成后再批量提交 offset。这样 Kafka 的拉取速度和模型推理速度就解耦了,不会因为某一个推理请求变慢而阻塞整个消费链路。

这里还有一个细节,模型推理是有超时的。我们设置推理超时 3 秒,超过就记为失败,走重试 topic。通过 Kafka 的 DLT(Dead Letter Topic)机制,所有失败的推理请求会进入单独的重试队列,由另一个消费者定时重试。这样做的好处是主链路永远不会被脏数据和超时请求拖垮。

3.5 生产消费命令到底会不会一直运行

很多刚接触 Kafka 的人都会问“kafka生产消费命令启动一次会一直运行吗”。这个问题其实要分两端看。生产者命令执行完发送完数据就会退出,因为它是一次性的输入;但消费者命令启动后会一直运行,它是一个常驻进程,持续从服务端拉取数据。

在 AI 场景里这尤其重要。如果消费者线程因为意外退出了,Kafka 的 lag 会快速上涨,推理结果就会滞后。所以生产环境里的消费者必须要做守护,可以用 systemd 或者容器编排来保证消费者进程挂掉之后能自动拉起。我之前犯过一个错误,在测试环境跑了一个推理消费者,窗口关掉了进程也就死了,结果第二天一看 lag 积压了几十万条,数据延迟了整整一个晚上。

4. AI场景下的性能调优:延迟、Lag与监控

4.1 消息延迟高怎么定位:先把链路拆开看

“Kafka消息延迟高”是后台最常见的报警之一。定位延迟问题,不能一上来就怀疑 Kafka 集群本身,得把链路拆成三段看:Producer 生产延迟、Broker 服务端排队时间、Consumer 消费延迟。

如果是 Producer 端延迟高,先看网络和 batch 参数。正常情况下,Kafka Producer 是批量发送的,如果linger.ms设置过大,或者消息量本身很小,batch 一直填不满,消息就会在本地积压。这时候可以看 Producer 的record-queue-time指标,如果时间持续偏高,说明参数需要调整。

如果是 Broker 端延迟高,先检查磁盘 IO 和 CPU。磁盘写满或者 IO 等待过高,会导致副本同步跟不上,ISR 收缩,进而影响生产。另外网络带宽打满也会让请求排队,这时候从 Kafka 监控面板看request-time指标就能判断。

消费端延迟高则是最常见的。模型推理耗时高、消费线程数不足、单条消息处理逻辑太重,都会导致 lag 上涨。AI 场景里尤其要小心,模型推理偶尔会出现一个非常慢的请求,比如推理服务 GC 停顿,阻塞了消费线程,表现就是 lag 曲线突然跳高。解法就是在消费线程和推理线程之间做缓冲,不要让推理的抖动传导到消费端。

4.2 lag 排查的完整路径

Kafka lag 是消费者落后生产者的消息条数,它是衡量 AI 链路健康度最直接的指标。一旦 lag 持续上涨,说明消费速度跟不上生产速度,推理结果就会越来越滞后。

排查 lag,第一步是确认你的 lag 数值是“合理波动”还是“持续上涨”。短暂尖峰通常没事,消费线程在追赶;持续上涨就必须要处理。第二步是看消费者组下的几个消费者实例是不是均衡分布。如果某个分区数据量特别大,而消费组的每个消费者绑定分区数不均衡,就会出现某个消费者忙死、其他消费者空闲的情况。

第三步是检查是否有消费者掉线。Kafka 消费组内成员是通过心跳维持的,如果消费者处理消息的时间过长,超过了max.poll.interval.ms默认的 5 分钟,就会触发 rebalance,消费者被踢出组。AI 推理正好容易踩这个坑,单条消息处理超过 5 分钟的情况并不少见,尤其是大模型推理。解决方法有两个:调大max.poll.interval.ms,或者把批量消息拆小,避免单次 poll 处理时间太长。

我这次就踩过一次。模型调参之后推理耗时从 500 毫秒涨到 4 秒,消费组频繁 rebalance,整个消费链路几乎瘫痪。排查半天才发现是max.poll.interval.ms太短导致消费者不断被踢出组、不断触发重平衡。把参数调到 10 分钟,问题立刻消失。这个坑很多团队都会遇到,写出来提醒一下。

4.3 Kafka监控工具选型:命令行之外的可视化方案

只靠命令行运维 Kafka 是不现实的,可视化监控工具必须配。我用过 Kafka Tool、Offset Explorer、Kafdrop、Kafka UI 这些,说下实际体验。

日常调试首选 Kafdrop,Web 界面简洁,点击 topic 就能浏览消息内容,适合开发调试。生产环境监控我用的 Kafka UI,它自带 Consumer Groups 页面,能看到每个消费组的 lag,还能手动调整 offset,排查问题非常方便。Offset Explorer(原 Kafka Tool)适合桌面端使用,支持多集群管理,我测试环境切来切去就用它。

如果是大规模生产集群,建议直接上 Prometheus + Grafana,配合 Kafka Exporter 采集指标。重点监控几个关键指标:kafka_consumergroup_lag消费组积压、kafka_server_brokertopicmetrics_bytes_in生产流量、kafka_partition_underreplicated_partition分区副本同步状态。

有了监控面板之后,设置好报警阈值,lag 超过 1000 就报警,消息延迟超过 5 分钟就报警。AI 链路对时效敏感,报警一定要早,别等用户反馈了才发现问题。

5. 常见问题与排查技巧实录

5.1 Kafka能重复消费吗:AI场景必须面对的问题

Kafka能重复消费吗?能,而且如果你的消费者处理完之后、提交 offset 之前挂掉了,就一定会重复消费。这叫作 at-least-once 语义。在 AI 推理场景里,重复消费意味着同一条特征数据会被推理两次,产生两个相同结果,如果结果写入数据库时没有幂等控制,就会产生脏数据。

解决方案有两个层面。第一,在消费者处理逻辑里面做幂等,比如用event_id作为唯一键,写入结果库之前先查一下是否处理过,处理过就跳过。第二,在写入结果库时使用 UPSERT 语句,以event_id作为主键,重复写入自动覆盖。

我的经验是,AI 推理结果写入 ES 时,直接使用_id作为event_id,这样重复消费时,ES 会自动覆盖旧文档,天然幂等。这个思路简单有效,推荐给大家。

5.2 消费者 rebalance 导致推理中断怎么办

消费者 rebalance 是分布式消费组里面最棘手的机制之一。一个消费者加入或退出,整个组都会停止消费,重新分配分区,这个期间 AI 推理链路会出现短暂的真空期。如果业务对推理结果实时性要求高,rebalance 的影响就是不可接受的。

减少 rebalance 的关键,是让消费者心跳保持稳定。一是设置合理的heartbeat.interval.ms和session.timeout.ms,心跳间隔不要太小,会话超时不要太大,避免网络抖动导致误判消费者掉线。二是确保单次消费处理时间不要超过max.poll.interval.ms。如果真的会出现慢推理,就把推理从消费者线程剥离,消费者只做消息转发,不阻塞在推理上。

另外,如果消费组的实例数固定,建议升级到 Kafka 3.x 之后的静态消费组功能,成员有固定 ID,重连不会触发 rebalance。

5.3 消费速度跟不上生产速度的扩容策略

AI 场景下,模型推理速度往往跟不上业务数据的产生速度。扩容的常规做法就是增加消费者实例数,但同时必须增加 topic 分区数,因为一个分区只能被一个消费者实例消费,消费者数量超过分区数,多出来的消费者会空闲。

扩容之前先算一下账。假设生产速度是每秒 1000 条消息,单消费者推理速度是每秒 200 条,那么至少需要 5 个消费者实例并行处理。分区数就要大于等于 5,建议设置成 6 到 10,留出余量。不过要注意,分区数在 topic 创建之后再增加是可行的,但会增加 leader 切换的复杂度,最好在一开始就预估好数据量,设置足够的分区数。

5.4 几个日常开发中的高频坑

开发环境中最容易踩的坑,一个是auto-offset-reset配置不对。如果设置成latest,新消费者只能消费启动之后的新消息,开发调试时经常发现“消息丢了”,其实只是消费不到历史消息。开发阶段建议用earliest。

另一个坑是 topic 分区数过少。比如就一个分区,消费端无论起多少个实例,数据都只被一个消费者拉取,推理速度完全跟不上。topic 创建时就应该评估并发量,分区数宁多勿少。

还有一个坑是关于 Kafka 版本兼容。本地用 3.6,线上用 2.8,客户端 API 大概率会有差异。建议统一版本,或者在代码注释里标明最低兼容版本,避免升级后接口不兼容导致的诡异问题。

6. 经验总结与下一步扩展方向

这次把 Kafka 接入 AI 的过程,前前后后花了不到两周,但收获很大。我发现很多团队对 Kafka 的认知停留在“消息队列”层面,但在 AI 场景里,它实际上是一个分布式日志系统,一个可以回放、可以重放的数据存储。想清楚这一点,很多架构决策就会变得简单。

我个人在实际操作中的一个体会是,Kafka 和 AI 的集成,真正难的不是把消息从生产者搬到消费者,而是整个链路的稳定性和可观测性。Producer 参数、Consumer 线程模型、分区策略、offset 提交方式、监控告警,每一环都不能松。Kafka 本身可以做到高可用,但如果你上面的业务代码写得粗糙,再高可用的系统也扛不住。

最后再分享一个小技巧。我们在 topic 的 key 里直接写入用户 ID,这样同一个用户的行为事件永远落在同一个分区,AI 推理时天然能获取到该用户完整的行为序列,不需要再做跨分区聚合。这个设计在特征工程阶段帮了大忙,也是我认为 Kafka 接入 AI 时最值得借鉴的一点。

如果后续还有精力,我打算继续做两件事。一是把推理结果回流到 Kafka 之后,再接一个实时特征计算环节,让 Kafka 变成完整的在线特征平台,而不只是数据传输管道。二是对比一下 Kafka Streams 和 Flink 在 AI 特征处理上的实际表现,看看轻量场景是不是可以直接用 Kafka 的流处理能力替代一套独立的 Flink 集群。这两块做完,我再单独写一篇分享。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询