flink-statefun - Flink 有状态函数重新部署
问题描述
重新部署 Flink 有状态函数时,我找不到任何关于版本控制的问题。
当我为当前正在执行的实例的有状态函数更新和部署代码时,这会对以下内容产生什么影响:
- 当前正在执行的实例,而不是等待回调?
- 当前正在等待异步回调的实例(回调返回时运行什么代码)?
- 如果其中一个或 1 或 2 可能正在执行新代码,如何处理旧版本和新执行版本之间 2 个函数版本的可能不同的持久状态?
- 如果 2 没有自动升级,当我希望长时间运行的函数发生这种情况时,如何使新函数版本运行(比如它正在等待 30 天计时器上的自我回调,我希望新版本在回调返回)?如果我可以升级版本,处理版本之间可能添加或删除持久状态的方法是什么?
解决方案
您可以将有状态函数实现为嵌入式函数或远程函数。
一个嵌入式函数被部署并直接加载到执行 StateFun Job 的 Flink 集群中。这意味着为了部署新版本的嵌入式函数,您需要停止现有集群,并使用新函数重新部署它。在那种模式下:
- 不相关,因为所有现有实例都将被关闭。
- 当您的应用程序的新版本将被加载时,任何先前注册的计时器都将被传递(假设时间已经过去),并且任何未完成的异步操作都将以“未知”状态传递。
对于远程功能,可能会有一个短暂的时刻,您将同时拥有多个版本(例如:滚动升级您的功能的 k8s 部署)在这种情况下,计时器可能会在旧版本上触发在滚动升级的那个窗口期间,版本或新版本(远程功能不支持异步操作)。在任何情况下,任何状态修改都将以一致的方式在版本之间可见。
请注意,状态值本身就是 Protocol Buffers 消息,因此只要您遵守 Protocol Buffers 模式演变规则,您就可以跨版本读取这些值。
推荐阅读
- ios - КММ 自定义 iOS 框架 - 无法构建模块
- php - 如何解决 Laravel 8 中无法联系 LDAP 服务器的问题?
- numerical-methods - 光谱法的收敛
- git - 该库未通过 git 子树添加到 git
- firebase - Flutter forEach() - 错误:此表达式的类型为“void”,因此无法使用其值
- c++ - 如何使用 select() 为套接字设置计时器?
- sql - 将一年中的一周与“溢出”进行比较
- javascript - 在 React Uploady 中显示确认屏幕预上传的正确方法?
- javascript - 如何以角度将数据从表单传递到另一个组件
- python-3.x - 在 python 中传递一个列表而不是两个列表