1

重新部署 Flink 有状态函数时,我找不到任何关于版本控制的问题。

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

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

1 回答 1

2

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

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

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

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

于 2020-05-04T20:56:19.013 回答