核心思路:Kafka 作为统一事件总线,承担解耦、缓存、削峰、持久化、多订阅分发;计算层选择流引擎做实时转换 / 聚合 / 风控;下游写入数据库、数仓、缓存、ES 等。 典型架构:数据源 → Kafka(Topic)→ 流处理引擎 → Kafka(结果 Topic)/ 外部存储
一、整体架构分层
数据源层 → 采集接入层 → Kafka集群(消息总线)→ 实时计算层 → 输出Sink层 → 监控运维层
1. 数据源层
常见来源:
业务应用:埋点日志、订单、支付、用户行为(SDK、后端服务直接 Producer)
数据库变更:MySQL/PG Binlog → Debezium / Canal
日志文件:服务器日志、容器日志 → Filebeat / Fluentd
IoT 设备、MQTT、第三方 API 推送
最佳实践:所有原始数据先入 Kafka,不要直接消费到存储,便于回溯、重放、多消费方。
2. 采集接入层(Producer 侧)
目标:稳定、规范、限流、容错、统一数据格式。
生产者选型
Java:原生 KafkaProducer、Spring-Kafka
数据同步:Debezium(CDC,推荐)、Canal、Maxwell
日志采集:Filebeat → Kafka Output;Fluentd
Producer 核心配置(高可靠)
acks=all # 至少ISR副本全部确认 retries=3 linger.ms=5 # 小批量攒批,提升吞吐 batch.size=16384 compression.type=lz4 enable.idempotence=true # 幂等,防止重复发消息 transactional.id=xxx # 跨分区事务(需要ExactlyOnce场景)数据规约
统一协议:JSON / Avro / Protobuf,强烈推荐 Avro + Schema Registry(Confluent Schema Registry),防止字段乱改导致下游炸掉
每条消息必须带:
event_time(业务时间,不是 kafka 接收时间!)、trace_id、source、version区分两类 Topic:原始事件 Topic(raw)、清洗后标准化 Topic(cleaned)
设计原则:raw topic 尽量不清洗,原样落地;清洗、脱敏、过滤放到流计算层。
3. Kafka 集群与 Topic 设计(最关键部分)
3.1 集群规划
生产:多 Broker,3 副本;ISR 最小 2
硬件:机械盘适合日志 / 埋点高吞吐;SSD 适合 CDC、低延迟交易数据
组件配套:
ZooKeeper / KRaft(新版本推荐 KRaft,去掉 ZK 依赖)
Schema Registry
Kafka Connect(标准化同步任务,不用自己写大量 Producer/Consumer)
可选:Kafka MirrorMaker2 跨机房同步
3.2 Topic 设计规范
按业务域拆分 Topic,不要大杂烩 示例命名规范:
[env].[domain].[data-type].[version]prod.order.raw.v1
prod.user.behavior.raw.v1
prod.cdc.mysql_order.v1
prod.order.agg.v1(聚合结果 topic)
分区数设计
分区 = 消费并行度上限;消费组一个分区最多一个消费者线程
估算:单分区稳定吞吐 10~30MB/s;高吞吐埋点可以单分区 20MB/s
建议预留扩容空间,分区只能增加,不能减少,不要一次性开几千分区(元数据压力大)
键选择:需要同一条业务数据顺序消费时,
key=orderId/userId;纯日志高吞吐可以不指定 key,轮询
保留策略
原始埋点日志:
retention.hours=72或按大小CDC 变更数据:保留更长,用于回溯、数据修复
敏感数据:配置
delete,不要 compact;状态变更流(用户维度最新状态)使用 Log Compaction(压缩主题),只保留每个 key 最新一条
消息语义边界
At-most-once:丢数据(不推荐业务)
At-least-once:默认,会重复,下游必须幂等
Exactly-once:Kafka 事务 + 流引擎两阶段提交,成本更高,交易 / 对账场景才用
推荐分层 Topic 模型(非常经典)
Raw Topic:原始数据,不做过滤,全量落盘
Clean Topic:清洗、脱敏、格式校验、丢弃脏数据
DWD Topic:明细层(数仓实时明细)
DWS Topic:汇总、聚合指标(分钟 / 小时窗口结果)
4. 实时计算层(管道核心)
Kafka 本身只是消息队列,不具备计算能力,处理转换、过滤、JOIN、窗口、聚合、风控需要流引擎。 主流选型对比:
企业级推荐:Flink + Kafka 组合,也是当前实时数据管道事实标准。
Flink 管道典型处理逻辑
从 raw topic 消费 → 做:
脏数据过滤、格式校验、异常侧写(脏数据写入专门的 error topic,方便排查,不要直接丢弃)
字段脱敏、转换、字典映射
维表 Join(Redis/MySQL/CDC 维表)
窗口聚合(滚动 Tumbling、滑动 Sliding、会话 Session)
CEP 复杂事件(风控:短时间多次下单、异常登录)
分流:不同业务指标输出到不同下游 Topic
时间语义重点:优先使用 eventTime + watermark,而不是 processingTime,解决网络延迟、乱序数据。
流计算输出两种模式:
回流 Kafka(DWS 指标 topic):供多个下游消费(告警、大屏、离线数仓同步)
直接 Sink 到外部存储:MySQL、Doris、ClickHouse、ES、Redis
Kafka Streams 适合场景
轻量流水线,比如:订单状态变更、简单计数,不需要独立 Flink 集群,直接在 Java 服务里跑。
5. Sink 输出层(消费端)
消费模式分两类:
流引擎 Sink(Flink/Spark):写入 OLAP、DB、ES、Hudi
自定义 Consumer / Kafka Connect:同步到外部系统
常见下游:
实时大屏、指标:ClickHouse / Doris
检索:Elasticsearch
业务数据库:MySQL(CDC 反向同步、指标落地)
离线数仓:Hudi/Iceberg(Kafka -> Hudi 增量入湖,批流一体)
缓存:Redis(最新维度状态)
告警系统:Prometheus、AlertManager
消费端重要原则:消费失败不要无限重试死循环;失败消息投递到 dead-letter-topic(DLT 死信队列),人工修复后重放。
6. 监控、容错、运维层(生产必不可少)
监控指标清单
Kafka 集群:Broker 负载、磁盘、ISR、UnderReplicatedPartitions(分区同步异常)
Topic:消息生产速率、消费速率、消息堆积(lag,核心告警指标)
Producer:发送失败率、超时、重试次数
Consumer:消费延迟、offset 提交情况
Flink:Task 状态、Checkpoint 成功率、背压、Watermark 推进
数据质量:脏数据量、schema 不兼容报错、事件时间乱序占比
工具栈:
监控采集:Prometheus + Grafana(Kafka Exporter、Flink Exporter)
日志:Loki / ELK
管控平台:Kafka UI、Redpanda Console、Flink WebUI
数据质量:Great Expectations、Flink CDC 校验
容错设计
Offset 管理:
Flink:Checkpoint 驱动 offset 提交,实现一致性
普通 Java Consumer:业务处理成功后再 commit offset,禁止自动提交
enable.auto.commit=true
背压:上游 Producer 限流;Flink 内部背压机制;不要让消费速度跟不上持续堆积
数据回溯:Kafka 支持重置 offset,重放历史数据(前提是消息还在保留期内)
降级:高峰关闭非核心消费任务,优先保障交易、支付链路
二、一条完整示例管道(订单实时指标)
MySQL订单表 → Debezium CDC → prod.cdc.mysql_order.v1(Raw Topic,3副本,分区8)
↓
Flink Job:
1. 解析CDC binlog、过滤delete(按需)
2. 关联商品维表(Redis)
3. 按商户+5分钟滚动窗口,统计成交金额、订单数
4. 脏数据写入 prod.error.order.v1
↓
输出1:prod.order.agg_5min.v1(聚合Topic,给大屏、告警消费)
输出2:Sink ClickHouse(持久化指标,供报表查询)
输出3:Sink Hudi(数据湖,供离线分析)
三、关键避坑点
❌ 不要把所有数据塞一个大 Topic,分区爆炸、权限、扩容麻烦
❌ 不要依赖 Kafka 的 processingTime 做业务统计,乱序数据结果不准,必须 eventTime+watermark
❌ 不要随便设置
retention=-1永久保存,磁盘会打爆❌ 消费端不做幂等,at-least-once 场景一定会重复消息
❌ Schema 不管理,上游随便加删字段,下游全部报错 → 必须 Schema Registry + 兼容性策略(BACKWARD)
❌ 忽视 lag 告警,堆积到几万几十万再处理,容易引发雪崩
❌ 跨机房同步直接写业务 topic,优先 MirrorMaker2 + 隔离镜像 topic
四、可选扩展:批流一体管道
Kafka + Flink + Hudi/Iceberg: 实时写入 Hudi 增量;离线引擎(Spark)直接读 Hudi,同一份存储同时支持实时和离线,消除 Lambda 架构两套链路维护成本。
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢