Flink有状态功能重新部署

时间:2020-05-02 17:54:25

标签: flink-statefun

重新部署Flink有状态功能时,我找不到有关版本控制问题的任何信息。

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

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

1 个答案:

答案 0 :(得分:2)

您可以将状态功能实现为嵌入式功能或远程功能。

  • 已将嵌入式功能部署并直接加载到执行StateFun Job的Flink集群中。 这意味着,为了部署嵌入式功能的新版本,您需要停止现有集群,然后使用新功能重新部署它。 在该模式下:

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

请注意,状态值本身就是协议缓冲区消息,因此,只要您遵守协议缓冲区架构演变规则,就可以读取各个版本的值。