-
Notifications
You must be signed in to change notification settings - Fork 35
BIP 3[ACCEPTED]: Engine side heartbeat monitoring and external data source management
Status: ACCEPTED
Author: @MichelZhan
Contributor: @wangcheng15
Date: 2022.03.31
Pull Requests: PR #135
Byzer Notebook 设置的自定义数据源并不能区分用户,在使用时也是直接根据数据源名称来获取,这样就会存在一个问题:如果不同用户设置了相同连接名称的数据源,后添加的将会覆盖掉之前的
Byzer-lang 引擎的重启在 Byzer Notebook 用户界面是无感知的,已添加的外部数据源在重启后无法正常使用,在用户界面会有如下报错,需要在「设置」页面重新手动测试链接才能恢复
外部数据源列表接口响应非常慢,因为这里发送探针查询判断数据源的可用状态。当数据源不可用时,查询耗时会很久。
目前 Byzer Notebook 支持部署 2 个引擎,但用户在设置界面调整后,会影响所有的用户,需要按涉及到的用户做引擎选择的隔离
- 不同用户间的外部数据源互不干扰
- 同步已存在外部数据源的连接名称,与新规则达成一致
- 定时监测 Byzer-lang 引擎,在用户端展示可用状态
- Byzer-lang 引擎重启后自动重连外部数据源
- 对应接口耗时缩减到 1s 以内
- 各用户在 Settings 页面可自由切换
default
,backup
两个引擎,而不会影响到其他用户
1)变更模块:Byzer Notebook,Byzer Notebook Vue
2)变更内容:
- Byzer Notebook 用户页面新增外部数据源时,链接名称增加 "{USERNAME}_" 的前缀,不可编辑
- Byzer Notebook 用户界面增加引擎状态信息展示
- Byzer Notebook 引擎重启时自动重新注册用户已添加的数据源
- 后端负责轮询,将数据源连接状态缓存,前端可及时获取到缓存的结果
- 探针查询判断数据源可用状态时,设置查询超时时间,1秒或更短
-
system_config
表增加user
,维护各用户选择的引擎
心跳检测 首先针对引擎是否可用对前端不可感知的问题,可以效仿 Jupyter,提供接口给前端轮询,这里使用 engine 的 liveliness 接口和 readiness 接口,轮询频率设置在 1 分钟。
数据源连接管理 引擎重启时设置的数据源连接失效,是因为目前只在创建数据源时发送 connect 语句声明连接,在engine 重启后并没有重新声明,为此有两个解决方案:
- Engine 端离线安装 connect-persist-app-{3.0|2.4} 插件,配合 notebook 在声明数据源连接且探针查询成功时,!connectPersist 将数据源连接持久化。这样会有两个问题:
- Engine 端将连接信息持久化,默认存在delta中,数据可能会丢失。并且 notebook 端也会在其元数据中维护用户创建的连接信息,这样会带来数据同步问题。
- 另外,目前 connectPersist 插件没有提供删除连接的方法,用户无法通过正常途径删除已经定义过的连接,只能覆盖,想要删除只能去 delta 里删记录。需要对该插件进行一定的改动。
- Notebook 端配合 engine 存活状态接口,当 engine 状态由离线转为在线时,发送查询将用户定义的数据源连接全部重新声明一遍。 删除连接的场景还有一个问题,byzer-lang 是否有提供在 Session 中删除声明过的 connection?目前似乎只有重启 notebook 连接才会失效。
用户声明的 connection 对其他用户都是可用的,engine 端目前没有实现隔离。暂时比较可行的解决连接覆盖的方案是给连接名加上用户名前缀,这样能在一定程度上保证连接名的唯一性。前端可在界面上加上用户名前缀,后端也需要对传入的 connection 名称做校验,缺失用户名前缀给出异常提示。 对于已存在于数据库中的记录暂不做修改,可能会影响用户现有代码,在版本发布时提示用户重新编辑确认。