实时处理:Storm / flink vs 标准应用程序(java,c#...)

Real-time processing: Storm / flink vs standard application (java, c#...)

我想知道如何选择实现应用程序处理来自 Kafka 的事件,我想到了两种架构模式:

我很难看出哪个场景最有趣。 有人可以帮我解决这个问题吗?

由于可用信息如此之少,很难给出明确的建议。因此,在您提供更具体的信息之前,我的回答含糊不清:

选择处理框架而不是本机实现可为您带来以下优势:

  • 具有(理论上)无限可扩展性的并行处理:如果您曾经期望无法及时处理单个线程中的所有事件,则首先需要向上扩展(更多线程)并最终向外扩展(更多机)。框架负责线程和机器之间的所有同步,因此您只需要编写与一些高级原语粘合在一起的顺序代码(类似于 C# 中的 LINQ)。
  • 容错:当您的代码搞砸时会发生什么(某些边缘情况未实现)?当你 运行 资源不足时?当网络(到 Kinesis 或其他机器)暂时中断时?框架会处理所有这些讨厌的小细节。
  • 在失败的情况下,当您重新启动应用程序时,大多数框架都会为您提供某种形式的恰好一次处理:如何避免丢失数据?重新处理旧数据时如何避免重复?
  • 托管状态:如果您的应用程序需要在特定时间内记住事物(计算 sums/average 或加入数据),您如何确保在发生故障时状态与数据保持同步?
  • 高级功能:时间触发器、复杂事件处理(=事件模式匹配)、写入不同的接收器(Kafka 用于低延迟,s3 用于批处理)
  • 存储的灵活性:如果您想尝试不同的存储系统,在框架中编写的应用程序中更改source/sink要容易得多。
  • 部署平台中的集成:如果您想扩展到多台机器,扩展一个已经提供相关集成的平台(在撰写本文时应该主要是 Kubernetes)通常要容易得多。但是所有框架还支持简单的本地设置,您只需在一台(更大的)机器上进行扩展。
  • 低级优化:当使用具有更高抽象的新引擎时,框架生成的代码可能比您自己实现的代码(具有特定的内存布局或序列化数据处理)更有效。

主要缺点通常是:

  • 框架的复杂性:您需要从用户的角度了解框架的工作原理。但是,您通常通过不深入编写自定义的细节来节省时间 consumer/producer,因此它并不像最初看起来那么糟糕。
  • 代码的灵活性:您不能再编写任意代码了。由于该框架为您处理并行性,因此您需要从数据块的角度考虑并相应地调整您的算法。尽管以一种或另一种形式,通常直接支持标准 SQL 操作。
  • 减少对资源使用的控制:由于平台跨机器安排任务,您可能最终会遇到不幸的分配,并且平台可能会为您提供太少的选项来修复它。请注意,由于数据倾斜和次优算法,大多数应用程序在本质上更容易受到资源利用率低下的影响。