寻找实时流媒体解决方案

Looking for a real time streaming solution

我们有一个 spark-streaming 微批处理过程,它使用来自具有 20 个分区的 kafka 主题的数据。分区中的数据是独立的,可以独立处理。当前的问题是微批处理在开始下一个微批处理之前等待所有 20 个分区的处理完成。因此,如果一个分区在 10 秒内完成处理,而另一个分区需要 2 分钟,那么第一个分区将必须等待 110 秒才能使用下一个偏移量。

我正在寻找一种流式处理解决方案,我们可以在其中独立处理 20 个分区,而无需等待其他分区完成一个过程。流处理解决方案应以独立于其他分区的自己的速率消耗每个分区的数据和进度偏移量。

有人对哪种流架构可以实现我的目标有任何建议吗?

Flink (AFAIK)、KStreams 和 Akka Streams 中的任何一个都将能够独立地通过分区:none 除非您明确选择加入,否则它们中的 none 会执行 Spark 样式的批处理。

Flink 与 Spark 相似之处在于它具有作业服务器模型; KStreams 和 Akka 都是您只需将其集成到您的项目中并像任何其他 JVM 应用程序一样进行部署的库(例如,您可以构建一个容器并 运行 在像 kubernetes 这样的调度程序上)。我个人更喜欢后一种方法:它通常意味着更少的基础设施需要担心,更少的阻抗不匹配与其他地方使用的可观察性工具集成。

当涉及到基于时间的处理和连接时,Flink 是一个特别好的选择。

KStreams 从根本上将一切建模为从一个 kafka 主题到另一个主题的转换:主题拓扑由 KStreams 管理,但那里可能存在一些问题(尤其是当您处理任何时间序列时)。

Akka 是工具包中最通用且(在某种意义上)最不自以为是的工具包:您将不得不以更少的手持方式做出更多决定(我是说这个人可能被称为 Akka 啦啦队队长);作为纯流处理库,它可能不是理想的选择(尽管在资源消耗方面,能够更明确地管理背压(基本上,当数据进来的速度快于处理速度时会发生什么)可能会使其更高效比替代品)。如果您还打算利用集群分片(并且几乎肯定是事件源)参与者,我可能倾向于只选择它:这样做的好处是您可以将处理并行性与输入 Kafka 的数量完全分离分区(例如,您可以部署 40 个处理实例,并且每个实例处理来自 Kafka 的一半数据)。