Flink有状态功能重新部署

问题描述 投票:1回答:1

当重新部署一个Flink有状态函数时,我找不到任何关于版本问题的东西。

当我为一个有状态函数更新和部署代码时,如果该函数有当前执行的实例,会有什么影响。

  1. 当前正在执行、不等待回调的实例?
  2. 当前正在等待异步回调的实例(回调返回时运行什么代码)?
  3. 如果1或2可能正在执行新的代码,那么如何处理旧版本和新执行版本之间可能存在的2个函数版本的不同持久化状态?
  4. 如果2没有自动升级,当我希望一个长期运行的函数发生这种情况时,我如何使新的函数版本运行(比如说它在30天的timer上等待self callback,我希望新版本在callbackreturn时执行)? 如果我可以升级版本,那么处理版本之间可能增加或删除持久化状态的方法是什么?
flink-statefun
1个回答
2
投票

你可以将有状态函数作为嵌入式函数,或者作为远程函数来实现。

  • 嵌入式函数是直接部署和加载到执行StateFun Job的Flink集群中的,这意味着为了部署一个新版本的嵌入式函数,你需要停止现有的集群,然后用新的函数重新部署它。

    1. 是不相关的,因为所有现有的实例将被关闭。
    2. 当你的应用程序的新版本将被加载时,任何先前注册的定时器将被交付(假设时间已经过去),任何未完成的异步操作将以 "未知 "的状态交付。
  • 对于远程函数,可能会有一个短暂的时刻,在这个时刻,你会有多个版本同时存在(例如:你的函数的k8s部署的滚动升级)在这种情况下,在滚动升级的窗口中,一个定时器可能会在旧版本或新版本上启动(对远程函数没有异步操作支持)。

请注意,状态值本身是协议Buffers消息,所以只要你尊重协议Buffers模式的演化规则,你就能跨版本读取这些值。

© www.soinside.com 2019 - 2024. All rights reserved.