我有一个设置,我将事件推送到kafka
,然后在同一个群集上运行Kafka Streams应用程序。可以公平地说,扩展Kafka Streams
应用程序的唯一方法是通过添加节点或增加kafka
来扩展Partitions
群集本身吗?
在这种情况下,如何确保我的消费者不会关闭群集并确保关键管道始终为"on"
。是否有Topology Priority
的概念可以避免可能的停机时间?我希望能够为任何人公开流,以便在不影响核心管道的情况下构建应用程序。如果解决方案是设置另一个kafka群集,那么对于所有adhoc查询,使用Apache storm
更有意义吗? (我知道很多消费者仍然会导致kafka
群集出现问题,但至少topology
处理现已被隔离了)
答案 0 :(得分:3)
建议不要在与代理相同的服务器上运行Streams应用程序(即使这在技术上是可行的)。 Kafka的Streams API提供了一种基于应用程序的方法 - 而不是基于群集的方法 - 因为它是一个库,而不是一个框架。
不需要扩展Kafka群集来扩展Streams应用程序。通常,Streams应用程序的并行性受应用程序输入主题的分区数量限制。建议对主题进行过度分区(此开销相当小)以防止扩展限制。
因此,提供任何人构建应用程序甚至更简单。因为每个人都拥有他们的申请。无需向群集提交应用程序。它们可以在您喜欢的任何地方执行(因此,每个团队可以部署他们的Streams应用程序,就像部署他们拥有的任何其他应用程序一样)。因此,您有许多部署选项,从WAR文件,YARN / Mesos到容器(如Kubernetes)。什么都适合你。
即使像Flink,Storm或Samza这样的框架提供集群管理,您也只能使用与这些框架集成的工具(例如,Samza需要YARN - 没有其他选项可用)。假设您已经有了Mesos设置,您可以将它重用于您的Kafka Streams应用程序 - 无需专用的" Kafka Streams集群" (因为没有这样的事情)。
答案 1 :(得分:2)
应用程序的处理器拓扑通过将其分解来缩放 多项任务。
更具体地说,Kafka Streams基于创建固定数量的任务 在每个任务的应用程序的输入流分区上 从输入流中分配了一个分区列表(即Kafka 主题)。
分区到任务的分配永远不会改变,以便每个任务 是应用程序的并行性的固定单位。然后任务可以 根据分配的实例化自己的处理器拓扑 分区;他们还为每个指定的人保留一个缓冲区 从这些记录中一次一个地分区和处理消息 缓冲器。
因此,流任务可以独立处理 没有人工干预的并行。
了解Kafka Streams不是资源非常重要 经理,但是在其流处理的任何地方“运行”的库 应用程序运行执行应用程序的多个实例 无论是在同一台机器上,还是分布在多台机器上 任务可以由库自动分发给正在运行的人 应用程序实例。
分区到任务的分配永远不会改变;如果申请 实例失败,其他所有已分配的任务将重新启动 实例并继续使用相同的流分区。
流的处理发生在运行应用程序的机器上。
我建议您查看this guide,它可以帮助您更好地了解Kafka Streams的工作方式。