Kafka Streams应用程序更新

时间:2018-02-07 15:38:38

标签: apache-kafka apache-kafka-streams

我已经构建了一个Kafka Streams应用程序。这是我的第一个,所以我正在从一个概念验证的思维模式转变为“我怎样才能生产这个?”心态。

tl; dr版本:我正在寻找kafka流部署建议和提示,特别是与更新应用程序代码有关。

我已经能够找到很多关于Kafka和Streams API如何工作的文档,但是在实际部署Streams应用程序时我找不到任何内容。

初始部署似乎相当简单 - 有很好的文档可以配置您的Kafka集群,然后您必须为您的应用程序创建主题,然后您可以启动它并发布数据以便处理它

但是如果您想稍后升级您的应用程序怎么办?具体而言,如果更新包含对拓扑的更改。我的应用程序在窗口中进行了大量的数据丰富和聚合,因此将来可能需要对处理进行调整。

我的理解是,更改处理顺序或在拓扑中插入其他步骤将导致每个处理步骤的内部ID发生偏移,这意味着最多会创建新状态存储,前一个状态将丢失,最坏情况下,处理启动时从错误的状态存储主题读取的步骤。这意味着您必须重置应用程序,或者为新版本提供新的应用程序ID。但是有一些问题:

  1. 如果您重置应用程序或提供新ID,则处理将从源和中间主题的开头开始。我真的不想将输出发布到输出主题两次。
  2. 当您停止升级应用程序时,当前“正在运行”的数据将会丢失(因为该应用程序永远不会再次启动以恢复处理)。
  3. 我能想到的唯一方法就是:

    1. 停止将数据发布到源主题。让应用程序处理所有消息,然后将其关闭。
    2. 截断所有来源和中间主题。
    3. 使用新的应用ID启动新版应用。
    4. 启动发布商。
    5. 现在这是“好的”,因为我的应用程序是唯一一个从源主题中读取的应用程序,并且当前主题目前尚未用于同一应用程序中的下一个处理器。但是,我可以看到这变得非常混乱。

      有没有更好的方法来处理应用程序更新?或者我的步骤通常与大多数开发人员的步骤一致吗?

1 个答案:

答案 0 :(得分:0)

我认为您已经全面了解了此问题,在大多数情况下,您的解决方案似乎就是大多数人所做的。

latest Kafka-Summit之后,talk of Gwen Shapira and Matthias J. Sax提出了有关Kubernetes部署的问题。响应是相同的:如果您的升级包含拓扑修改,则意味着无法进行滚动升级。

看来目前尚无KIP