1. 📨 消息队列(Messaging)
传统痛点
过去,很多系统使用 ActiveMQ 、RabbitMQ 等传统消息代理来解耦生产者和消费者,缓冲突发流量。但这些系统在大规模、高吞吐场景下往往力不从心,扩展性和容错能力有限。
Kafka 的解法
Kafka 天然具备:
- 更高的吞吐量(百万级消息/秒)
- 内置分区(水平扩展)
- 副本机制(数据不丢,故障自动切换)
- 持久化存储(消息消费后不删除,可反复读取)
因此,Kafka 非常适合大规模消息处理 ,例如订单流水、日志收集等。虽然这类场景通常吞吐量要求不高,但对端到端低延迟 和持久性保证却很敏感,Kafka 恰好能完美兼顾。
架构示意
#mermaid-svg-psR1DTbfGwj76MZR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-psR1DTbfGwj76MZR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-psR1DTbfGwj76MZR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-psR1DTbfGwj76MZR .error-icon{fill:#552222;}#mermaid-svg-psR1DTbfGwj76MZR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-psR1DTbfGwj76MZR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-psR1DTbfGwj76MZR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-psR1DTbfGwj76MZR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-psR1DTbfGwj76MZR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-psR1DTbfGwj76MZR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-psR1DTbfGwj76MZR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-psR1DTbfGwj76MZR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-psR1DTbfGwj76MZR .marker.cross{stroke:#333333;}#mermaid-svg-psR1DTbfGwj76MZR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-psR1DTbfGwj76MZR p{margin:0;}#mermaid-svg-psR1DTbfGwj76MZR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-psR1DTbfGwj76MZR .cluster-label text{fill:#333;}#mermaid-svg-psR1DTbfGwj76MZR .cluster-label span{color:#333;}#mermaid-svg-psR1DTbfGwj76MZR .cluster-label span p{background-color:transparent;}#mermaid-svg-psR1DTbfGwj76MZR .label text,#mermaid-svg-psR1DTbfGwj76MZR span{fill:#333;color:#333;}#mermaid-svg-psR1DTbfGwj76MZR .node rect,#mermaid-svg-psR1DTbfGwj76MZR .node circle,#mermaid-svg-psR1DTbfGwj76MZR .node ellipse,#mermaid-svg-psR1DTbfGwj76MZR .node polygon,#mermaid-svg-psR1DTbfGwj76MZR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-psR1DTbfGwj76MZR .rough-node .label text,#mermaid-svg-psR1DTbfGwj76MZR .node .label text,#mermaid-svg-psR1DTbfGwj76MZR .image-shape .label,#mermaid-svg-psR1DTbfGwj76MZR .icon-shape .label{text-anchor:middle;}#mermaid-svg-psR1DTbfGwj76MZR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-psR1DTbfGwj76MZR .rough-node .label,#mermaid-svg-psR1DTbfGwj76MZR .node .label,#mermaid-svg-psR1DTbfGwj76MZR .image-shape .label,#mermaid-svg-psR1DTbfGwj76MZR .icon-shape .label{text-align:center;}#mermaid-svg-psR1DTbfGwj76MZR .node.clickable{cursor:pointer;}#mermaid-svg-psR1DTbfGwj76MZR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-psR1DTbfGwj76MZR .arrowheadPath{fill:#333333;}#mermaid-svg-psR1DTbfGwj76MZR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-psR1DTbfGwj76MZR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-psR1DTbfGwj76MZR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-psR1DTbfGwj76MZR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-psR1DTbfGwj76MZR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-psR1DTbfGwj76MZR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-psR1DTbfGwj76MZR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-psR1DTbfGwj76MZR .cluster text{fill:#333;}#mermaid-svg-psR1DTbfGwj76MZR .cluster span{color:#333;}#mermaid-svg-psR1DTbfGwj76MZR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-psR1DTbfGwj76MZR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-psR1DTbfGwj76MZR rect.text{fill:none;stroke-width:0;}#mermaid-svg-psR1DTbfGwj76MZR .icon-shape,#mermaid-svg-psR1DTbfGwj76MZR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-psR1DTbfGwj76MZR .icon-shape p,#mermaid-svg-psR1DTbfGwj76MZR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-psR1DTbfGwj76MZR .icon-shape .label rect,#mermaid-svg-psR1DTbfGwj76MZR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-psR1DTbfGwj76MZR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-psR1DTbfGwj76MZR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-psR1DTbfGwj76MZR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 发布消息
发布消息
订阅
订阅
持久化存储
生产者应用
主题 Topic
另一个生产者
消费者1
消费者2
磁盘
2. 🌐 网站活动跟踪(Website Activity Tracking)
Kafka 的"出身"场景
最初 Kafka 就是为重建用户活动跟踪管道 而设计的。每个用户行为(页面浏览、搜索、点击等)都会作为事件,按类型发布到对应的主题(如 page_views、searches)。
Kafka
- 每个用户页面访问会产生大量事件,Kafka 的高吞吐轻松应对。
- 主题可被多个消费者 同时订阅,用于:
- 实时处理(如个性化推荐)
- 实时监控(如异常检测)
- 离线分析(如导入 Hadoop 或数据仓库)
数据流向图
#mermaid-svg-Pm1BdhNhE53z1SdR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Pm1BdhNhE53z1SdR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Pm1BdhNhE53z1SdR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Pm1BdhNhE53z1SdR .error-icon{fill:#552222;}#mermaid-svg-Pm1BdhNhE53z1SdR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Pm1BdhNhE53z1SdR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Pm1BdhNhE53z1SdR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Pm1BdhNhE53z1SdR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Pm1BdhNhE53z1SdR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Pm1BdhNhE53z1SdR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Pm1BdhNhE53z1SdR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Pm1BdhNhE53z1SdR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Pm1BdhNhE53z1SdR .marker.cross{stroke:#333333;}#mermaid-svg-Pm1BdhNhE53z1SdR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Pm1BdhNhE53z1SdR p{margin:0;}#mermaid-svg-Pm1BdhNhE53z1SdR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Pm1BdhNhE53z1SdR .cluster-label text{fill:#333;}#mermaid-svg-Pm1BdhNhE53z1SdR .cluster-label span{color:#333;}#mermaid-svg-Pm1BdhNhE53z1SdR .cluster-label span p{background-color:transparent;}#mermaid-svg-Pm1BdhNhE53z1SdR .label text,#mermaid-svg-Pm1BdhNhE53z1SdR span{fill:#333;color:#333;}#mermaid-svg-Pm1BdhNhE53z1SdR .node rect,#mermaid-svg-Pm1BdhNhE53z1SdR .node circle,#mermaid-svg-Pm1BdhNhE53z1SdR .node ellipse,#mermaid-svg-Pm1BdhNhE53z1SdR .node polygon,#mermaid-svg-Pm1BdhNhE53z1SdR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Pm1BdhNhE53z1SdR .rough-node .label text,#mermaid-svg-Pm1BdhNhE53z1SdR .node .label text,#mermaid-svg-Pm1BdhNhE53z1SdR .image-shape .label,#mermaid-svg-Pm1BdhNhE53z1SdR .icon-shape .label{text-anchor:middle;}#mermaid-svg-Pm1BdhNhE53z1SdR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Pm1BdhNhE53z1SdR .rough-node .label,#mermaid-svg-Pm1BdhNhE53z1SdR .node .label,#mermaid-svg-Pm1BdhNhE53z1SdR .image-shape .label,#mermaid-svg-Pm1BdhNhE53z1SdR .icon-shape .label{text-align:center;}#mermaid-svg-Pm1BdhNhE53z1SdR .node.clickable{cursor:pointer;}#mermaid-svg-Pm1BdhNhE53z1SdR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Pm1BdhNhE53z1SdR .arrowheadPath{fill:#333333;}#mermaid-svg-Pm1BdhNhE53z1SdR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Pm1BdhNhE53z1SdR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Pm1BdhNhE53z1SdR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Pm1BdhNhE53z1SdR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Pm1BdhNhE53z1SdR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Pm1BdhNhE53z1SdR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Pm1BdhNhE53z1SdR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Pm1BdhNhE53z1SdR .cluster text{fill:#333;}#mermaid-svg-Pm1BdhNhE53z1SdR .cluster span{color:#333;}#mermaid-svg-Pm1BdhNhE53z1SdR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Pm1BdhNhE53z1SdR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Pm1BdhNhE53z1SdR rect.text{fill:none;stroke-width:0;}#mermaid-svg-Pm1BdhNhE53z1SdR .icon-shape,#mermaid-svg-Pm1BdhNhE53z1SdR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Pm1BdhNhE53z1SdR .icon-shape p,#mermaid-svg-Pm1BdhNhE53z1SdR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Pm1BdhNhE53z1SdR .icon-shape .label rect,#mermaid-svg-Pm1BdhNhE53z1SdR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Pm1BdhNhE53z1SdR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Pm1BdhNhE53z1SdR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Pm1BdhNhE53z1SdR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 浏览/点击
生成事件
主题: page_views
主题: searches
全部主题
离线分析
用户
网站前端
Kafka 集群
实时推荐服务
实时监控仪表盘
Hadoop/数仓
报表
3. 📊 指标监控(Metrics)
运维和业务指标(如 CPU 负载、请求延迟、业务成功率)需要从分布式应用中收集并聚合到中央系统。
Kafka 作为指标传输管道,可以:
- 接收来自成千上万节点的指标数据
- 利用分区和复制保证数据不丢
- 下游系统(如 Elasticsearch、Prometheus)实时消费并展示
相比直接写入数据库,Kafka 提供了缓冲 和削峰填谷能力,避免监控系统被突发流量冲垮。
4. 📁 日志聚合(Log Aggregation)
传统方式
过去常用 Scribe 、Flume 将服务器上的物理日志文件收集到 HDFS 或中央文件服务器,但存在延迟高、容错弱、难以多源消费等问题。
Kafka 的优势
- 将日志抽象为消息流,不再依赖文件系统细节
- 更低延迟(实时传输,无需等待文件滚动)
- 副本机制保证数据不丢失
- 多消费者可独立消费同一份日志流(如实时告警 + 离线存储)
对比表格
| 特性 | 传统日志系统(如 Flume) | Kafka 作为日志管道 |
|---|---|---|
| 延迟 | 较高(需等待文件关闭) | 极低(实时流) |
| 持久化 | 依赖存储系统 | 内置副本,默认持久 |
| 多订阅 | 困难 | 天然支持 |
| 吞吐 | 中等 | 高 |
架构图
#mermaid-svg-O04h5BjPOetQdbAv{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-O04h5BjPOetQdbAv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-O04h5BjPOetQdbAv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-O04h5BjPOetQdbAv .error-icon{fill:#552222;}#mermaid-svg-O04h5BjPOetQdbAv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-O04h5BjPOetQdbAv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-O04h5BjPOetQdbAv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-O04h5BjPOetQdbAv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-O04h5BjPOetQdbAv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-O04h5BjPOetQdbAv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-O04h5BjPOetQdbAv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-O04h5BjPOetQdbAv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-O04h5BjPOetQdbAv .marker.cross{stroke:#333333;}#mermaid-svg-O04h5BjPOetQdbAv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-O04h5BjPOetQdbAv p{margin:0;}#mermaid-svg-O04h5BjPOetQdbAv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-O04h5BjPOetQdbAv .cluster-label text{fill:#333;}#mermaid-svg-O04h5BjPOetQdbAv .cluster-label span{color:#333;}#mermaid-svg-O04h5BjPOetQdbAv .cluster-label span p{background-color:transparent;}#mermaid-svg-O04h5BjPOetQdbAv .label text,#mermaid-svg-O04h5BjPOetQdbAv span{fill:#333;color:#333;}#mermaid-svg-O04h5BjPOetQdbAv .node rect,#mermaid-svg-O04h5BjPOetQdbAv .node circle,#mermaid-svg-O04h5BjPOetQdbAv .node ellipse,#mermaid-svg-O04h5BjPOetQdbAv .node polygon,#mermaid-svg-O04h5BjPOetQdbAv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-O04h5BjPOetQdbAv .rough-node .label text,#mermaid-svg-O04h5BjPOetQdbAv .node .label text,#mermaid-svg-O04h5BjPOetQdbAv .image-shape .label,#mermaid-svg-O04h5BjPOetQdbAv .icon-shape .label{text-anchor:middle;}#mermaid-svg-O04h5BjPOetQdbAv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-O04h5BjPOetQdbAv .rough-node .label,#mermaid-svg-O04h5BjPOetQdbAv .node .label,#mermaid-svg-O04h5BjPOetQdbAv .image-shape .label,#mermaid-svg-O04h5BjPOetQdbAv .icon-shape .label{text-align:center;}#mermaid-svg-O04h5BjPOetQdbAv .node.clickable{cursor:pointer;}#mermaid-svg-O04h5BjPOetQdbAv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-O04h5BjPOetQdbAv .arrowheadPath{fill:#333333;}#mermaid-svg-O04h5BjPOetQdbAv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-O04h5BjPOetQdbAv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-O04h5BjPOetQdbAv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-O04h5BjPOetQdbAv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-O04h5BjPOetQdbAv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-O04h5BjPOetQdbAv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-O04h5BjPOetQdbAv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-O04h5BjPOetQdbAv .cluster text{fill:#333;}#mermaid-svg-O04h5BjPOetQdbAv .cluster span{color:#333;}#mermaid-svg-O04h5BjPOetQdbAv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-O04h5BjPOetQdbAv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-O04h5BjPOetQdbAv rect.text{fill:none;stroke-width:0;}#mermaid-svg-O04h5BjPOetQdbAv .icon-shape,#mermaid-svg-O04h5BjPOetQdbAv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-O04h5BjPOetQdbAv .icon-shape p,#mermaid-svg-O04h5BjPOetQdbAv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-O04h5BjPOetQdbAv .icon-shape .label rect,#mermaid-svg-O04h5BjPOetQdbAv .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-O04h5BjPOetQdbAv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-O04h5BjPOetQdbAv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-O04h5BjPOetQdbAv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 日志流
日志流
日志流
实时消费
离线存储
搜索索引
服务器1
Kafka 主题
服务器2
服务器3
告警系统
HDFS
Elasticsearch
5. ⚙️ 流处理(Stream Processing)
流处理管道
数据从原始输入,经过多个处理阶段,逐步被清洗、聚合、丰富,最终形成有价值的结果。每个阶段的结果通常写入新的主题,供下一阶段消费。
示例:新闻推荐
- 爬取 RSS 内容 → 写入
raw_articles主题 - 清洗去重 → 写入
cleaned_articles主题 - 特征提取 & 推荐计算 → 写入
recommendations主题 - 最终推送给用户
Kafka 原生支持
- Kafka Streams:轻量级 Java/Scala 库,无需单独集群,直接嵌入应用,实现状态化、窗口化、Exactly-once 处理。
- 替代方案:Apache Storm、Apache Samza,但 Kafka Streams 与 Kafka 集成最紧密,开发效率高。
处理管道图
#mermaid-svg-zo0szrTgjXEKaDx4{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-zo0szrTgjXEKaDx4 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-zo0szrTgjXEKaDx4 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-zo0szrTgjXEKaDx4 .error-icon{fill:#552222;}#mermaid-svg-zo0szrTgjXEKaDx4 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-zo0szrTgjXEKaDx4 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-zo0szrTgjXEKaDx4 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-zo0szrTgjXEKaDx4 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-zo0szrTgjXEKaDx4 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-zo0szrTgjXEKaDx4 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-zo0szrTgjXEKaDx4 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-zo0szrTgjXEKaDx4 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-zo0szrTgjXEKaDx4 .marker.cross{stroke:#333333;}#mermaid-svg-zo0szrTgjXEKaDx4 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-zo0szrTgjXEKaDx4 p{margin:0;}#mermaid-svg-zo0szrTgjXEKaDx4 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-zo0szrTgjXEKaDx4 .cluster-label text{fill:#333;}#mermaid-svg-zo0szrTgjXEKaDx4 .cluster-label span{color:#333;}#mermaid-svg-zo0szrTgjXEKaDx4 .cluster-label span p{background-color:transparent;}#mermaid-svg-zo0szrTgjXEKaDx4 .label text,#mermaid-svg-zo0szrTgjXEKaDx4 span{fill:#333;color:#333;}#mermaid-svg-zo0szrTgjXEKaDx4 .node rect,#mermaid-svg-zo0szrTgjXEKaDx4 .node circle,#mermaid-svg-zo0szrTgjXEKaDx4 .node ellipse,#mermaid-svg-zo0szrTgjXEKaDx4 .node polygon,#mermaid-svg-zo0szrTgjXEKaDx4 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-zo0szrTgjXEKaDx4 .rough-node .label text,#mermaid-svg-zo0szrTgjXEKaDx4 .node .label text,#mermaid-svg-zo0szrTgjXEKaDx4 .image-shape .label,#mermaid-svg-zo0szrTgjXEKaDx4 .icon-shape .label{text-anchor:middle;}#mermaid-svg-zo0szrTgjXEKaDx4 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-zo0szrTgjXEKaDx4 .rough-node .label,#mermaid-svg-zo0szrTgjXEKaDx4 .node .label,#mermaid-svg-zo0szrTgjXEKaDx4 .image-shape .label,#mermaid-svg-zo0szrTgjXEKaDx4 .icon-shape .label{text-align:center;}#mermaid-svg-zo0szrTgjXEKaDx4 .node.clickable{cursor:pointer;}#mermaid-svg-zo0szrTgjXEKaDx4 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-zo0szrTgjXEKaDx4 .arrowheadPath{fill:#333333;}#mermaid-svg-zo0szrTgjXEKaDx4 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-zo0szrTgjXEKaDx4 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-zo0szrTgjXEKaDx4 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zo0szrTgjXEKaDx4 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-zo0szrTgjXEKaDx4 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zo0szrTgjXEKaDx4 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-zo0szrTgjXEKaDx4 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-zo0szrTgjXEKaDx4 .cluster text{fill:#333;}#mermaid-svg-zo0szrTgjXEKaDx4 .cluster span{color:#333;}#mermaid-svg-zo0szrTgjXEKaDx4 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-zo0szrTgjXEKaDx4 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-zo0szrTgjXEKaDx4 rect.text{fill:none;stroke-width:0;}#mermaid-svg-zo0szrTgjXEKaDx4 .icon-shape,#mermaid-svg-zo0szrTgjXEKaDx4 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-zo0szrTgjXEKaDx4 .icon-shape p,#mermaid-svg-zo0szrTgjXEKaDx4 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-zo0szrTgjXEKaDx4 .icon-shape .label rect,#mermaid-svg-zo0szrTgjXEKaDx4 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-zo0szrTgjXEKaDx4 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-zo0szrTgjXEKaDx4 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-zo0szrTgjXEKaDx4 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 抓取
写入
读取
写入
读取
写入
推送给
RSS 源
爬取处理器
raw_articles
清洗/去重
cleaned_articles
推荐引擎
recommendations
用户端
6. 📜 事件溯源(Event Sourcing)
事件溯源是一种应用设计模式 :不存储当前状态,而是将所有状态变更 以时间顺序记录为不可变的事件序列。要获取当前状态,只需重放这些事件。
Kafka 非常适合做事件溯源的后端存储,因为:
- 支持海量历史事件的持久化(保留数年)
- 分区内事件严格有序,保证重放正确
- 高性能的追加写入,满足高频事件产生
例如,银行账户的所有存取款记录作为事件,可以随时重建任意时刻的账户余额。
7. 🔁 提交日志(Commit Log)
分布式系统需要一个外部提交日志来:
- 在节点间复制数据(如主从同步)
- 故障节点恢复时,通过回放日志重建数据
Kafka 天生就是分布式日志,其**日志压缩(Log Compaction)**功能特别适合此场景------它只保留每个 Key 的最新值,避免日志无限增长,同时保留历史变更用于恢复。
这与 Apache BookKeeper 思路类似,但 Kafka 更通用,生态更丰富。
📊 总览
| 用例 | Kafka 关键特性 | 竞争优势 |
|---|---|---|
| 消息队列 | 高吞吐、分区、副本、持久化 | 替代传统 MQ,支持海量消息和故障恢复 |
| 网站活动跟踪 | 高吞吐、多订阅、实时 + 离线消费 | 原始设计目标,完美应对爆发式流量 |
| 指标监控 | 缓冲削峰、副本保证、低延迟 | 聚合分散的指标,防丢失 |
| 日志聚合 | 低延迟、多消费端、持久化 | 取代 Flume/Scribe,提供更强一致性 |
| 流处理 | 原生 Kafka Streams、顺序保证、状态管理 | 轻量级嵌入式库,简化开发 |
| 事件溯源 | 大容量持久化、分区顺序、不可变性 | 完美的事件存储,支持任意时间点回溯 |
| 提交日志 | 日志压缩、副本同步、高可用 | 为分布式系统提供可靠的外部日志 |
🎯
Kafka 的通用性和强大功能使其不仅是一个消息队列,更是现代数据架构的核心枢纽。无论你是做实时分析、数据集成、微服务通信,还是构建事件驱动系统,Kafka 都有成熟的解决方案。