【问题标题】:Flink Stateful Function RedeployFlink 有状态函数重新部署
【发布时间】:2020-08-17 04:59:24
【问题描述】:

在重新部署 Flink Stateful Function 时,我找不到任何版本控制问题。

当我为当前正在执行的实例的有状态函数更新和部署代码时,会产生什么影响:

  1. 当前正在执行的实例,不等待回调?
  2. 当前正在等待异步回调的实例(运行什么代码 回调何时返回)?
  3. 如果其中一个或 1 或 2 可能正在执行新代码,如何处理旧版本和新执行版本之间 2 个函数版本的可能不同的持久状态?
  4. 如果2没有自动升级,如何导致新功能版本运行 当我想让这发生很长时间时 运行函数(假设它正在等待 30 天的自我回调 计时器,我希望新版本在回调时执行 返回)?如果我可以升级版本,那么处理版本之间可能添加或删除持久状态的方法是什么?

【问题讨论】:

    标签: flink-statefun


    【解决方案1】:

    您可以将有状态函数实现为嵌入函数或远程函数。

    • 一个嵌入式函数被部署并直接加载到执行 StateFun Job 的 Flink 集群中。 这意味着为了部署新版本的嵌入式函数,您需要停止现有集群,并使用新函数重新部署它。 在那种模式下:

      1. 不相关,因为所有现有实例都将被关闭。
      2. 当您的应用程序的新版本被加载时,所有之前注册的计时器都将被传递(假设时间已经过去),并且任何未完成的异步操作都将以“未知”状态传递。
    • 对于远程函数,您可能会在短时间内同时拥有多个版本(例如:滚动升级您的函数的 k8s 部署) 在这种情况下,计时器可能会在旧版本或新版本上触发(远程功能不支持异步操作) 在滚动升级的那个窗口期间。 在任何情况下,任何状态修改都将以一致的方式在版本之间可见。

    请注意,状态值本身就是 Protocol Buffers 消息,因此只要您遵守 Protocol Buffers 架构演化规则,就可以跨版本读取值。

    【讨论】: