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