Flink Stream API - 源码开发需求描述

概述

本文介绍如何基于Flink源码进行二次开发,实现一个动态规则引擎系统。通过自定义算子和算子协调器,实现数据流的动态规则计算和协调管理。以此更好理解前面介绍的源码相关文章

项目需求

核心功能

实现一个动态规则引擎,具备以下特性:

  • 数据源产生两类数据:数据本身运算表达式
  • 按照运算表达式对数据进行运算并输出结果
  • 运算表达式可以动态更新
  • 支持多并行度的运算任务

架构设计

具体例子说明

场景:实时温度监控系统

假设我们有一个实时温度监控系统,需要对传感器数据进行动态计算:

数据源输入示例:
复制代码
时间线:
T1: {"type": "rule", "expression": "temperature * 1.8 + 32"}  // 摄氏度转华氏度
T2: {"type": "data", "sensorId": "001", "temperature": 25.0}
T3: {"type": "data", "sensorId": "002", "temperature": 30.0}
T4: {"type": "data", "sensorId": "003", "temperature": 20.0}
T5: {"type": "rule", "expression": "temperature + 273.15"}   // 摄氏度转开尔文
T6: {"type": "data", "sensorId": "004", "temperature": 35.0}
T7: {"type": "data", "sensorId": "005", "temperature": 28.0}
期望的处理结果:
复制代码
T2数据: 25.0 * 1.8 + 32 = 77.0°F    (使用第一个规则)
T3数据: 30.0 * 1.8 + 32 = 86.0°F    (使用第一个规则)
T4数据: 20.0 * 1.8 + 32 = 68.0°F    (使用第一个规则)
--- 规则切换点 ---
T6数据: 35.0 + 273.15 = 308.15K      (使用第二个规则)
T7数据: 28.0 + 273.15 = 301.15K      (使用第二个规则)
关键挑战:
  1. 数据一致性:T4的数据必须用第一个规则计算完成后,T6的数据才能开始用第二个规则计算
  2. 并行处理:如果有多个Calc Operator并行处理,需要确保它们都完成了旧规则的计算
  3. 无数据丢失:规则切换过程中不能丢失任何数据

处理流程详解:

当T5时刻新规则到达时:
复制代码
1. Expression Operator收到新规则
   ↓
2. 通知Coordinator更新规则: "temperature + 273.15"
   ↓
3. 向所有Calc Operator广播: "请完成当前批次计算"
   ↓
4. 阻塞数据流: T6、T7数据暂时不向下游发送
   ↓
5. 等待所有Calc Operator汇报: "我已完成T4及之前的数据计算"
   ↓
6. Coordinator确认所有Task完成后,通知Expression Operator: "可以继续"
   ↓
7. 恢复数据流: T6、T7数据开始使用新规则处理

多并行度场景:

复制代码
假设有3个Calc Operator并行处理:

Calc-1: 正在处理T2数据 (25.0°C)
Calc-2: 正在处理T3数据 (30.0°C)
Calc-3: 正在处理T4数据 (20.0°C)

当T5新规则到达时:
- 所有Calc都必须完成当前计算并汇报
- 只有收到3个完成汇报后,才能开始处理T6、T7数据

为什么需要Operator Coordinator?

复制代码
问题:Flink的Task之间只能传递数据,无法传递控制信号
解决:通过Job Master中的Coordinator实现:
- Expression Operator → Coordinator: "新规则来了"
- Coordinator → 所有Calc Operator: "完成当前批次"
- 所有Calc Operator → Coordinator: "我完成了"
- Coordinator → Expression Operator: "可以继续了"

时序图示例:

相关推荐
书院门前细致的苹果16 小时前
ArrayList、LinkedList、Vector 的区别与底层实现
java
再睡亿分钟!16 小时前
Spring MVC 的常用注解
java·开发语言·spring boot·spring
qq_1955516916 小时前
代码随想录70期day7
java·开发语言
Sam-August17 小时前
【分布式架构实战】Spring Cloud 与 Dubbo 深度对比:从架构到实战,谁才是微服务的王者?
java·spring cloud·dubbo
麦兜*17 小时前
MongoDB 常见错误解决方案:从连接失败到主从同步问题
java·数据库·spring boot·redis·mongodb·容器
阿里云大数据AI技术17 小时前
Lazada 如何用实时计算 Flink + Hologres 构建实时商品选品平台
flink
计算机编程-吉哥17 小时前
大数据毕业设计-基于Python的中文起点网小说数据分析平台(高分计算机毕业设计选题·定制开发·真正大数据)
大数据·hadoop·计算机毕业设计选题·机器学习毕业设计·大数据毕业设计·大数据毕业设计选题推荐·大数据毕设项目
阿里云大数据AI技术17 小时前
淘宝闪购基于Flink&Paimon的Lakehouse生产实践:从实时数仓到湖仓一体化的演进之路
数据库·flink
ytadpole17 小时前
揭秘设计模式:命令模式-告别混乱,打造优雅可扩展的代码
java·设计模式
用户37215742613517 小时前
Java 教程:轻松实现 Excel 与 CSV 互转 (含批量转换)
java