Apache kafka 跨多个用户扩展Kafka流应用程序

Apache kafka 跨多个用户扩展Kafka流应用程序,apache-kafka,apache-kafka-streams,confluent-platform,Apache Kafka,Apache Kafka Streams,Confluent Platform,我有一个设置,将事件推送到kafka,然后在同一集群上运行应用程序。公平地说,扩展Kafka Streams应用程序的唯一方法是通过添加节点或增加分区来扩展Kafka集群本身吗 在这种情况下,我如何确保我的消费者不会关闭集群,并确保关键管道始终处于打开状态。是否有拓扑优先级的概念可以避免可能的停机?我希望能够在不损害核心管道的情况下,为任何人公开用于构建应用程序的流。如果解决方案是设置另一个kafka集群,那么对于所有临时查询,使用ApacheStorm是否更有意义?(我知道很多消费者仍然可能导

我有一个设置,将事件推送到
kafka
,然后在同一集群上运行应用程序。公平地说,扩展
Kafka Streams
应用程序的唯一方法是通过添加节点或增加
分区来扩展
Kafka
集群本身吗


在这种情况下,我如何确保我的消费者不会关闭集群,并确保关键管道始终处于打开状态。是否有
拓扑优先级
的概念可以避免可能的停机?我希望能够在不损害核心管道的情况下,为任何人公开用于构建应用程序的流。如果解决方案是设置另一个kafka集群,那么对于所有临时查询,使用
ApacheStorm
是否更有意义?(我知道很多消费者仍然可能导致
kafka
集群出现问题,但至少
拓扑
处理现在是隔离的)

不建议在与代理相同的服务器上运行Streams应用程序(即使这在技术上是可行的)。Kafka的Streams API提供了基于应用程序的方法,而不是基于集群的方法,因为它是一个库而不是一个框架

无需扩展Kafka群集即可扩展Streams应用程序。一般来说,Streams应用程序的并行性受到应用程序输入主题分区数量的限制。建议对主题进行过度分区(开销相当小),以防止扩展限制

因此,由于每个人都拥有自己的应用程序,“为任何人提供构建应用程序”就更简单了。无需向群集提交应用程序。它们可以在您喜欢的任何地方执行(因此,每个团队都可以使用与部署任何其他应用程序相同的方式部署其Streams应用程序)。因此,您有许多部署选项,从WAR文件(通过纱线/介观)到容器(如Kubernetes)。什么对你最合适

即使像Flink、Storm或Samza这样的框架提供集群管理,您也只能使用与这些框架集成的工具(例如,Samza需要Thread——没有其他可用选项)。假设您已经有了Mesos设置,您可以将其重新用于Kafka Streams应用程序——不需要专用的“Kafka Streams集群”(因为没有这样的东西)

应用程序的处理器拓扑通过将其分解为 多任务

更具体地说,Kafka Streams基于 在应用程序的输入流分区上,使用每个任务 从输入流(即Kafka)分配了一个分区列表 主题)

分区对任务的分配永远不会改变,因此每个任务 是应用程序的固定并行单元。然后就可以完成任务了 根据分配的资源实例化自己的处理器拓扑 分区;它们还为每个已分配的数据维护一个缓冲区 从这些记录中一次一个地分区和处理消息 缓冲区

因此,流任务可以独立处理,也可以在 没有人工干预的并行

重要的是要理解卡夫卡流不是一种资源 管理器,但它是一个在任何地方“运行”其流处理的库 应用程序运行。执行应用程序的多个实例 在同一台机器上,或分布在多台机器上,以及 任务可以由库自动分发给正在运行的用户 应用程序实例

任务的分区分配永远不会改变;如果申请 实例失败,其所有分配的任务将在其他服务器上重新启动 实例并继续使用相同的流分区

流的处理在运行应用程序的机器中进行


我建议您查看一下,它可以帮助您更好地理解Kafka Streams的工作方式。

我读过关于过度分区的内容,Streams是一个库而不是一个框架。我得到了第一部分,但对于卡夫卡如何平衡拓扑中的处理,我仍然有点困惑。例如,当我在本地机器上运行给定的示例时,流处理是在本地机器上还是在kafka集群中进行的?如果我在多台机器上运行相同的拓扑,kafka会自动重新平衡负载吗?它会在本地机器上执行。这正是图书馆的部分。如果您有多台计算机,并且多次启动应用程序,则负载将自动平衡到这两台计算机。(卡夫卡使用所谓的“组管理协议”来处理这个问题:这是有道理的。谢谢!