1. 实时计算与定时计算的区别
定时计算 :基于固定时间间隔(如每天/小时)处理全量数据,适用于对实时性要求不高的场景。实时计算 :持续处理无界数据流,结果实时输出,适用于高实时性场景(如用户行为分析、实时推荐)。
2. Kafka Stream 核心概念
流式处理模型 :通过 KStream 抽象数据流,支持增量计算。关键组件 :
Source Processor :从 Kafka 主题消费数据。Sink Processor :将处理结果发送到 Kafka 主题。窗口操作 (如 TimeWindows
):按时间范围聚合数据。状态存储 :支持容错的状态操作(如 Materialized.as
)。
3. 热点文章实时计算流程
用户行为发送消息
用户行为(阅读、点赞等)触发消息发送到 Kafka 主题 hot.article.score.topic
。 消息格式为 UpdateArticleMess
,包含文章 ID、行为类型和增量值。 Kafka Stream 聚合处理
按文章 ID 分组,使用 10 秒时间窗口聚合行为数据。 聚合结果转换为 ArticleVisitStreamMess
,包含文章 ID 及各行为的总增量。 更新文章分值
根据聚合结果重新计算文章热度分值,更新数据库。 替换 Redis 缓存中的热点文章数据,确保前端实时展示最新热点。
关键代码解释
1. Kafka Stream 单词计数案例
stream. flatMapValues ( value -> Arrays . asList ( value. split ( " " ) ) )
. groupBy ( ( key, value) -> value)
. windowedBy ( TimeWindows . of ( Duration . ofSeconds ( 10 ) ) )
. count ( )
. toStream ( )
. to ( "itcast-topic-out" ) ;
flatMapValues
:将输入字符串按空格拆分为单词流。groupBy
:按单词分组,为后续聚合做准备。windowedBy
:定义 10 秒的时间窗口,统计窗口内的数据。count()
:统计每个单词在窗口内的出现次数。to("itcast-topic-out")
:将结果发送到指定 Kafka 主题。
2. Spring Boot 集成 Kafka Stream
@Bean
public KStream < String , String > kStream ( StreamsBuilder streamsBuilder) {
KStream < String , String > stream = streamsBuilder. stream ( "itcast-topic-input" ) ;
return stream;
}
@EnableKafkaStreams
:启用 Kafka Stream 功能。StreamsBuilder
:构建流处理拓扑,通过 @Bean
定义 KStream 对象。
3. 热点文章分值更新
public void updateScore ( ArticleVisitStreamMess mess) {
ApArticle apArticle = updateArticle ( mess) ;
Integer score = computeScore ( apArticle) ;
replaceDataToRedis ( apArticle, score, . . . ) ;
}
updateArticle
:根据聚合结果更新文章的阅读、点赞等字段。computeScore
:按权重计算文章热度分值(如点赞权重更高)。replaceDataToRedis
:替换 Redis 中频道或推荐列表的热点文章数据,保持前 30 条高分值文章。
4. Kafka Stream 聚合消息
. aggregate (
( ) -> "COLLECTION:0,COMMENT:0,LIKES:0,VIEWS:0" ,
( key, value, aggValue) -> {
return formatStr;
} ,
Materialized . as ( "hot-article-stream-count-001" )
)
aggregate
:定义初始值和聚合逻辑,累加窗口内各行为(收藏、评论等)的增量。Materialized.as
:指定状态存储名称,支持容错和高效查询。
技术亮点
低延迟处理 :Kafka Stream 提供毫秒级延迟,适合实时场景。窗口化聚合 :通过时间窗口控制数据范围,平衡实时性与计算效率。状态管理 :利用 Materialized
实现容错状态存储,确保数据一致性。无缝集成 :Spring Boot 简化 Kafka Stream 配置,提升开发效率。