day09-新热文章-实时计算

1. 实时计算与定时计算的区别
  • 定时计算:基于固定时间间隔(如每天/小时)处理全量数据,适用于对实时性要求不高的场景。
  • 实时计算:持续处理无界数据流,结果实时输出,适用于高实时性场景(如用户行为分析、实时推荐)。
2. Kafka Stream 核心概念
  • 流式处理模型:通过 KStream 抽象数据流,支持增量计算。
  • 关键组件 :
    • Source Processor:从 Kafka 主题消费数据。
    • Sink Processor:将处理结果发送到 Kafka 主题。
    • 窗口操作 (如 TimeWindows):按时间范围聚合数据。
    • 状态存储 :支持容错的状态操作(如 Materialized.as)。
3. 热点文章实时计算流程
  1. 用户行为发送消息
    • 用户行为(阅读、点赞等)触发消息发送到 Kafka 主题 hot.article.score.topic。
    • 消息格式为 UpdateArticleMess,包含文章 ID、行为类型和增量值。
  2. Kafka Stream 聚合处理
    • 按文章 ID 分组,使用 10 秒时间窗口聚合行为数据。
    • 聚合结果转换为 ArticleVisitStreamMess,包含文章 ID 及各行为的总增量。
  3. 更新文章分值
    • 根据聚合结果重新计算文章热度分值,更新数据库。
    • 替换 Redis 缓存中的热点文章数据,确保前端实时展示最新热点。

关键代码解释

1. Kafka Stream 单词计数案例
java 复制代码
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
java 复制代码
@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. 热点文章分值更新
java 复制代码
public void updateScore(ArticleVisitStreamMess mess) {
    ApArticle apArticle = updateArticle(mess);  // 更新数据库行为数据
    Integer score = computeScore(apArticle);    // 计算新分值
    replaceDataToRedis(apArticle, score, ...);  // 更新缓存
}
  • updateArticle:根据聚合结果更新文章的阅读、点赞等字段。
  • computeScore:按权重计算文章热度分值(如点赞权重更高)。
  • replaceDataToRedis:替换 Redis 中频道或推荐列表的热点文章数据,保持前 30 条高分值文章。
4. Kafka Stream 聚合消息
java 复制代码
.aggregate(
    () -> "COLLECTION:0,COMMENT:0,LIKES:0,VIEWS:0",  // 初始值
    (key, value, aggValue) -> {
        // 累加各行为值
        return formatStr;  // 返回聚合后的字符串
    },
    Materialized.as("hot-article-stream-count-001")  // 状态存储名称
)
  • aggregate:定义初始值和聚合逻辑,累加窗口内各行为(收藏、评论等)的增量。
  • Materialized.as:指定状态存储名称,支持容错和高效查询。

技术亮点

  1. 低延迟处理:Kafka Stream 提供毫秒级延迟,适合实时场景。
  2. 窗口化聚合:通过时间窗口控制数据范围,平衡实时性与计算效率。
  3. 状态管理 :利用 Materialized 实现容错状态存储,确保数据一致性。
  4. 无缝集成:Spring Boot 简化 Kafka Stream 配置,提升开发效率。
相关推荐
qq_4523962313 分钟前
第十篇:《Kafka 安全加固:SASL、SSL、ACL 与多租户隔离》
安全·kafka·ssl
这个昵称不容易18 分钟前
旅游管理系统的设计与实现(SpringBoot + MySQL + Vue 前后端分离)
java·springboot·毕设
Rain的Java大神之路18 分钟前
LeetCode 37 解数独面试攻略:回溯 + 位掩码 + MRV,从暴力到毫秒级求解
java·后端·leetcode
天天被压力1 小时前
【A股分钟级高频数据完全手册 #11】券商实时行情数据接口:实时交易(券商源)接入与字段
java·人工智能·python
天天被压力2 小时前
【A股分钟级高频数据完全手册 #12】股票五档盘口数据接口:买卖五档实时盘口解析
java·人工智能·python
Wang's Blog11 小时前
Java 项目实战: 交友项目 - FastDFS:入门案例
java·开发语言·交友
apcipot_rain11 小时前
C++转Java日记(03)
java·开发语言·c++
皮皮林55111 小时前
Java实现微信扫码登录
java
Yyyyyy~14 小时前
【Java】Day4Web基础知识
java·spring boot
灿飞屋15 小时前
Kotlin与Java虚拟机三:控制流
android·java·开发语言·后端·python·kotlin·安卓