我正在评估Apache Flink的用例。 我的问题是如何组织"复杂"流的代码。
用例是一个物联网过程。传感器产生事件 - 这是我流的输入。我的流应用程序输出警报。 我的流的第一步是处理这些数据上的一些聚合特征(窗口平均值、最小值、最大值等)。我的流的第二步是对输入数据和聚合数据运行一些"决策"过程。第二步由 2 个并行过程组成:
- 第一个是一组用户定义的规则(例如:如果温度传感器平均值为>50°,但最新的温度传感器低于 30°,则生成警报)
- 第二个是运行一些机器学习模型
我想做什么的图表:
+-----------------+
+----------------+ | User rules |------> Alerts
| |-------->| (multiple) |
| Aggregates | +-----------------+
Sensors ------->| |
| (multiple) | +-----------------+
| |-------->| ML rules |-------> Alerts
+----------------+ | (multiple) |
+-----------------+
我应该如何组织我的 Flink 应用程序?
我想到了3种方法:
1)把我所有的代码放在一个项目中
优点:
- 这会将所有代码放在同一个位置,无需切换到数十个应用程序即可了解它的工作原理和作用。
- 我不需要在任何其他主题中存储中间结果 - 我将能够直接使用它们。
- 易于部署
缺点:
- 应用程序的主文件可能很快就会变得一团糟(会吗?
- 每次更新某些内容(新规则、新聚合等)时,我都必须重新部署所有内容
2)将扩充部分放在一个项目中,将所有用户定义的规则放在另一个项目中,将机器学习部分放在另一个项目中
优点:
- 做同样事情的代码在同一个地方
- 看起来易于部署。只需部署 3 个应用程序
缺点:
我必须使用- 代理,以便生产者和消费者可以通信(聚合被写入主题,然后用户规则去读取它们以使用它们),我必须加入流
3)每个要处理的聚合都是一个项目,每个规则都是一个项目,每个ML模型都是一个项目
优点:
- 轻松更新。将与团队一起扩展。
- 新手写东西而不破坏一切的简单方法
- 似乎它可以很好地扩展 - 耗时的用户定义规则不会影响其他人
缺点:
- 跟踪部署的内容及其版本的混乱 我必须使用
- 代理,以便生产者和消费者可以通信(聚合被写入主题,然后用户规则去读取它们以使用它们),我必须加入流
- 大量冗余代码/可能需要创建库
- 如果我得到成百上千个聚合和规则,部署可能会变得一团糟
我错过了 Flink 和一般流媒体的经验,不知道什么最适合我的用例。我正在考虑从第二个解决方案开始,这似乎是最好的折衷方案。
您可能需要考虑的一种方法是流式传输一些缓慢变化的组件,而不是编译它们。例如,用户规则,甚至是聚合定义和机器学习模型。这将增加实现的复杂性,但允许进行更改而无需重新部署。
King的RBEA和ING在流ML模型上的工作就是这种模式的早期例子。有了广播状态,现在使用 Flink 构建这种动态规则引擎变得更加容易了。