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 配置,提升开发效率。