背景介绍
FATE Board 是 FATE 提供的一个工程,用于给 FATE 提供可视化能力,方便在联邦学习训练中实时查看执行状态,更好地定位执行中遇到的问题。
查看 FATE 架构可以看到 FATE Board 是建立在 MySQL 和 FATE Flow Server 的基础上的,看起来数据来源是来自于这两者。FATE Flow Server 在之前的文章 中已经介绍过,FATE 中隐私计算的主要调度流程都是实现在这个服务中。
FATE Board 代码仓库地址 https://github.com/FederatedAI/FATE-Board, 本文的探索基于 v1.11.1,后续版本可能有所不同
FATE Board 实现探索
FATE Board 工程中包含前端与后端的实现,前端是基于 Vue 实现的,后端则是基于 Java 实现。本文在探索时主要基于两个场景串联了一下完整的流程,分别是主页面的 job 列表页,以及 job 日志详情,通过查看完整的调用链路,对 FATE Board 建立基础的认识。
Job 列表页
通过 Chrome 调试模式查看对应的请求,即可比较容易发现获取 job 列表数据对应的请求为 /job/query/page/new
, 通过对应的接口路径全局搜索可以发现后端的实现为 src/main/java/com/webank/ai/fate/board/controller/JobManagerController.java
中的 queryPagedJob()
方法,对应的代码实现如下:
public PageBean<Map<String, Object>> queryPagedJobs(PagedJobQO pagedJobQO) {
String jobId = pagedJobQO.getJobId();
FlowJobQO flowJobQO = new FlowJobQO();
if (jobId != null && 0 != jobId.trim().length()) {
flowJobQO.setJob_id(pagedJobQO.getJobId());
}
// 构造请求参数 ...
// 实际获取数据
Map<String, Object> jobMap = getJobMap(flowJobQO);
// ... 冗长的业务处理
}
可以看到的真正的数据获取部分基本就是直接调用 getJobMap()
,对应的实现如下所示:
private Map<String, Object> getJobMap(Object query) {
result = flowFeign.post(Dict.URL_JOB_QUERY, JSON.toJSONString(query