本文首发于「Shopee技术团队」微信公众号

摘要

随着 Shopee 业务数据的不断扩大,仅通过表格这样的数据分析方式已经无法满足日常的数据分析需求,丰富的图表分析 Dashboard 就显得格外重要。但是,从事前端开发的同学都知道,这种 Dashboard 页面纯手工开发会耗费比较多的人力资源和时间资源,在量比较多的情况下,可能业务需求都没办法及时响应了。

如果能有一个可以自动生成这些 Dashboard 页面的工具平台,那么可以节省大量的人力和时间,效率提升将会非常显著。本文将分享如何从零开始创建一个数据可视化大屏搭建系统。

1. 现状分析

先来看一份数据。我们团队平均每个季度会有 3-4 个 Dashboard 相关需求,平均每个需求的项目周期约 40 天。目前已经累计有 20+ 页面,每个页面的图表组件约 50+,另一个准备重构的平台(Stella) Dashboard 页面 25+,涉及到的图表组件更多,粗略统计 100+。

这些 Dashboard 页面绝大部分页面内容复杂,交互也复杂。按照传统的开发方式,一个页面的上线大约需要 PM、Dev、QA 共 50+ 人/日。

除开人力资源,接下来看看开发一个 Dashboard 的研发流程是怎样的。

这是一个再正常不过的开发流程。在整个流程中,用时最多的就是数据同步、接口数据聚合、页面开发、联调这四大块——大约占了 70% 的时间。如果能有一个平台解决这几个问题,那么这个平台对于解放人力瓶颈、缩短研发流程、提高研发效率就有着非常大的意义。

目前市面上类似的平台非常多,我们也做了很多横向对比。综合来看,考虑到业务场景的贴近程度,以及开发投入和收益,最终我们决定自研平台 “Data Visualization”(下文简称 “Datav”)。

我们希望这个平台能够承担的角色如下:

Datav 平台承载了两个主要目标:

  • 缩短项目周期,从 40 天缩短至 20 天;
  • 减少人力成本,FE 从 10 人/日减少到 3 人/日,PM 从 15 人/日减少到 5 人/日,不再需要 BE 和 QA 参与。

2. Datav 设计与关键节点实现

为了能够达成以上两个目标,我们将 Datav 要实现的功能抽象成了五个关键点:

  • 重塑整个项目流程,提高 PM 和开发之间的协作效率;
  • 支持简单的元数据计算以及更加灵活的数据查询;
  • 支持页面快速配置;
  • 支持页面组件直连数据源;
  • 支持组件联动和筛选查询。

2.1 整体架构设计

接下来将一一介绍每个关键点的实现,下图是我们的整体架构设计。

整个 Datav 平台包含五个非常重要的子系统和模块:

  • Designer:设计器是 Datav 平台的核心与难点,支持页面布局配置、页面交互配置和组件数据配置等功能,另外还支持代码片段的配置,也可以称得上是一个低代码平台。
  • Admin:是 Datav 的运营管理平台,包含了数据计算、作品管理、组件状态管理、页面发布、页面权限等等常规的平台管理功能。
  • UI Components:是整个平台最基础的模块,我们在开源的图表库上面定义了一层标准的 DSL 协议,这个协议和接入 Designer 的协议是对应的,目前已经有 50+ 相关组件,组件数量还在不断增长。
  • Datav Server:是一个 node 服务,主要提供一些权限校验、数据聚合、动态 SQL 的生成等功能。
  • Datasource Access Server:专门用于连接不同数据源的服务,例如直连 MySQL、ClickHouse、Elasticsearch、Presto 等等,提供了不同的连接 client。

从架构图可以看出,Datav 平台支持直连各种数据源,最终会产出一个 URL,可以方便地集成到任何平台上。下一步计划是支持生成源代码,可供使用方进行二次编辑。

2.2 如何提高各个角色之间的协作效率


在解决这个问题之前,我们和各个角色之间进行了多次沟通,分析了各个角色在项目中的痛点以及花费的成本:

  • PM 侧的痛点是画原型图,每个需求画原型图需要花费 10 天左右的时间,而且还是静态的图片,跟开发对完需求后,还需要去改里面的一些静态数据,然后再进行 PRD 评审;
  • BE 和 FE 主要的精力花在页面开发、接口开发、数据同步以及页面联调这些事情上。

从传统的开发流程来看,这些都是正常的流程,是最小开发路径。要解决这个问题,我们就需要重塑整个项目的流程,让各个角色都能参与到配置中来,于是我们一起重新定义了 Dashboard 项目的开发流程,如下图。

  • PM 可以直接在 Datav 上面配置原型页面;
  • Data Dev 也支持直接将数据计算的结果自动同步到 ClickHouse;
  • FE 可以通过 Datav 直连数据源,并且可以复用步骤 1 里面 PM 配置的原型页面,进行配置优化;
  • 最终生成页面的 URL,PM 可以直接访问 URL 进行测试。

新的流程效果非常显著,整个项目周期缩短了一半,从 8 周缩短到了 4 周,也不再需要 BE 和 QA 的支持,FE 平均只需要投入 3 天支持需求。

2.3 如何支持元数据计算

2.3.1 基础知识

支持元数据计算是个比较复杂且庞大的功能。数据是所有系统的基石,任何平台和业务都离不开数据的流转。同时,数据的流转也是非常复杂的,特别是在数据量比较庞大的情况下。

我们先来认识一下数据的产生和流转都做了什么事情,以及从客户端产生数据开始,到 Dashboard 看到数据的聚合,都经历了哪些阶段。

上图是一个常规的大数据平台的架构图,它清楚地描述了数据产生到数据应用的整个过程。可能里面有一些专有词汇对于 FE 来讲有点陌生,但这里我们只需要了解:用户所产生的数据,需要经过一系列的加工之后,才会有比较大的价值。

下面再用一个更容易理解的流程图来说明:

从图中可以看出,数据准备有四个关键流程,数据采集、数据预处理、数据建模、数据服务,每个阶段都有一系列的事情要做,Data Dev 同学可以借助数仓以及相关工具,快速产出业务所需要的数据,Datav 平台不会涉及到这部分的功能,Datav 所处理的是在数据服务之后。

这里从数仓产出的数据,虽然经过了一系列的计算,但是往往也不是页面展示想要的数据。根据经验来看,一个 Dashboard 页面往往会有非常多的数据聚合逻辑,也就是说还需要根据数据服务产出的数据进行数据聚合。例如要计算同比、环比这样的指标等等。

2.3.2 Datav 打通数据直连通道

业务方需要做数据聚合,也就意味着需要后端开发提供 API 接口给前端。数仓产出的数据,由于环境隔离和权限等原因,目前无法直接给业务团队使用,因此业务团队使用这些数据有一个特别曲折的过程,使得整个流程比较复杂、链路也比较长。

这个流程 BE Dev 阶段需要提供两个服务,一个数据同步服务,一个 API 接口服务。粗略统计,BE Dev 这一步需要花费整个项目流程 30% 左右的时间,而且这些工作也是重复的。

因此 Datav 解决的第一个问题——打通数据直连通道,采用的方案就是直连 ClickHouse。

Datav 提供了一个直连数据源的服务,可以直接连接 Data Infra 团队提供的 ClickHouse,这样一来,大部分 Dashboard 页面就有了直连数据源的能力,不再需要依赖 BE 团队提供 API,使整个项目周期缩短了 30% 左右的时间。

上面提到,API 主要作用是用于一些数据聚合和数据逻辑计算的,那么 Datav 是如何支持这些功能的呢?这就是 Datav 面临的第二个大的挑战——支持数据聚合计算以及逻辑字段增加。

2.3.3 支持元数据计算

接下来用一个简单的例子来说明:Datav 如何实现替代 API 接口支持一些数据聚合计算。例如,有一个销售表 tab_sales(这是数仓计算出来的离线数据),内容如下:

date category name order_count pay_succ_orders
20220701 衣服 A 品牌 T 恤 500 200
20220701 衣服 B 品牌 T 恤 1000 500
20220701 数码 A 品牌手机 1000 600
20220701 数码 B 品牌手机 1500 800

现在有一个需求:要求计算每个 category 的支付成功率。

按照以前的方式,API 接口会按照类型先把数据查出来,查询 SQL:

得到原始数据后需要进行计算,得到最终右侧的数据结构给到前端:

试想,如果 Datav 能够产生这样一条 SQL,查询出来的结果也能够返回同样的数据结构,是不是就可以不用依赖 API 接口了?带着这样的疑问,我们做了很多的尝试。

最终结论证明,在大部分场景下,完全能够不用依赖 API 接口。就如同上面的例子,我们将 SQL 变化一下,就能够得到相同的数据结构:

2.3.4 Datav 数据管理

为了解决上述两大问题——如何打通数据直连通道、如何支持元数据逻辑计算,Datav 建设了数据管理模块。

数据管理是比较重要的一个模块,在配置页面之前,第一步想到的应该是这个页面的数据都来自哪,页面中每个组件的数据都来自哪张表,是否是通过某些字段计算得到的等等问题。

因此,数据管理模块应该包含几大块:数据源管理、数据字段编辑(包括字段名别名、新增字段、支持字段间的计算、字段格式化、字段展示权限等)、数据主题管理(支持多表间关联产生逻辑数据宽表,以及自定义 SQL 查询生成数据主题)。流程如下:

1)数据源管理

目前数据源支持直连离线数据源(MySQL、ClickHouse),即将支持直连实时数据源(Kafka、Elasticsearch、Prometheus 等)。

2)数据字段编辑

字段编辑提供了针对表以及表字段的别名设置、表字段权限设置、新增逻辑字段、字段逻辑计算、字段格式化等一些列高级功能。

3)数据主题管理

数据主题目前支持可视化配置和自定义 SQL。目前可视化配置仅支持单表设置,即将支持多表关联形成逻辑宽表。

多表关联功能如图:

自定义 SQL 查询如图:

2.4 如何支持页面快速配置

支持页面快速配置的核心就是 Designer 的实现。跟目前业界低代码平台实现的思路类似,都是通过将页面组件的位置信息、属性用一种通用的中间协议 DSL 来描述,然后通过解析引擎在运行时动态去解析 DSL,再渲染到页面中。

架构如下图:

为了进一步提高 UI 和 FE 之间的协作效率,我们预留了一些高级功能。

  • 例如实现一个 Figma 插件,可以让 UI 在设计页面的时候就用到我们的组件,然后通过这个插件生成页面的 DSL产物,再交给 Datav 解析引擎去做页面渲染;
  • 还有一种更加大胆的想法,就是通过机器学习的方式,将图片中的组件识别出来,自动生成页面的 DSL 产物,最终再交给 Datav 解析引擎去做页面渲染。

这两种方案都还处于设计阶段,暂时还没有实现。

Designer 这一块功能比较多,而且比较复杂,这里就不展开细节讲。我们目前已经实现了两种页面布局的方式:绝对布局和 Flex 布局。针对不同的场景,采用不同的布局方式,页面配置效率会非常高。

Flex 布局:适用于页面结构简单且清晰,类似 Admin 表单类型页面的配置场景。

绝对布局:页面结构复杂且组件布局毫无规律的页面配置,大屏页面就特别符合。

2.5 页面组件直连数据源

组件直连数据源的关键点包括:

  • 理解维度和指标;
  • 理解如何生成一个 SQL 语句。

接下来先用两个例子直观说明:

这是一个二维一指标的图表,一个维度是日期,即 X轴;另一个维度是柱子的分类,指标就是 Y 轴的数据。

如果要生成这样一个图表,那我们的 SQL 语句应该这样写:

Select [indicator] from [table_xxx] group by [dimension1], [dimension2]

从 SQL 语句中可以发现,维度属性放在 group by 后面,指标属性放在 Select 后面。

再来看一个例子:

同理,这是一张一维一指标的图,对应的 SQL 如下:

Select [indicator] from [table_xxx] group by [dimension1]

理解了维度和指标,以及 SQL 的生成规则后,基于这样的思路,我们实现了一个 Data-Connector 组件,这个组件可以配置维度、指标、分页、排序等等字段,最终再根据这些配置生成一个对应的 SQL 语句。

它对应生成的 SQL 语句是这样的:

SELECT field1 FROM Demo-Table GROUP BY date_day LIMIT 1000 OFFSET 100 ORDER BY  field3  ASC

这样,我们就实现了组件直连数据源,展示对应的动态数据。

2.6 支持组件联动和筛选查询

在绝大部分的场景下,我们配置出来的页面不是一个静态页面,它需要动态数据,也需要各种交互,最常见的就是筛选这种交互。

交互对于页面配置来讲是一个难点,因为交互特别多,有些交互也特别复杂。Datav 目前只支持了部分交互,例如组件数据筛选、按钮点击事件、弹窗、tab 切换等等比较常见的功能。

我们先看一个例子,为什么一定要支持组件间的交互呢?

这是我们利用组件直连数据源查询出来的数据,你会发现数据量非常大。

这个时候,有可能会导致组件崩溃或者页面卡死。因此,解决这种问题最好的方式就是支持数据筛选,即支持一个组件可以筛选另一个组件的数据,如下图。

这就是我们希望获得的效果:用一个筛选组件控制图表组件的数据量。那么如何实现呢?

我们也调研了业界的类似方案,最常用的就是支持写代码,利用发布订阅设计模式来实现。实现原理大致如图:

这样做的优势非常明显——简单,但是同样也存在一些不足:

  • 需要写 JS 代码,只对前端同学比较友好;
  • 如果关联组件比较多,那代码维护将会变得非常复杂;
  • 页面配置的效率也会大大降低。

因此,为了解决这些问题,Datav 实现了可视化配置组件联动,对于复杂的情况,也支持写代码的方式。实现原理也不复杂,总结起来分成四个步骤:

  • 建立筛选组件和展示组件的关联关系,以及筛选组件和筛选参数的关系;
  • 监听筛选参数的变化;
  • 一旦筛选参数发生变化,通知所有相关联的展示组件,并将新的值传递给它;
  • 通知工具函数拉取新的数据并重新渲染。

原理架构图如图:

整个 Datav 平台比较庞大,有非常多的功能点,很多功能点的设计都可以单独写一篇文章来介绍。而本篇文章主要围绕 Datav 解决的一些关键问题来展开,我们希望通过这篇文章让大家了解到 Datav 是一个什么平台,能解决哪些问题,适用于哪些业务场景。因此在技术细节上面并没有太多的展开,后续会另写文章介绍。

3. Datav 带来的收益

Datav 项目带来的收益可以从流程优化、开发效率,和基础建设等方面来考量。

3.1 流程优化

整个项目流程的周期从原来的 40 天左右减少到了现在的 20 天左右。耗费的人力也有所减少,不一定需要 BE 和 QA 同学的加入了,项目周期缩短了 100%。

这是因为 PM 同学可以直接通过 Datav 平台配置页面的原型,确定好需求后,这个原型配置可以直接交给 FE 同学进行加工,加上一些交互和数据相关配置,就可以直接提测。

3.2 开发效率

单从前端的开发效率来看,平均 10 人/日缩短到了平均 3 人/日,效率提升 200%+。

从整个研发阶段的效率来看,以前需要参与的人力总和为:(Data dev) 10 人/日 + (BE Dev) 13 人/日 + (FE Dev) 10 人/日 = 33 人/日

现在人力总和为:(Data dev) 10 人/日 + (FE Dev) 3 人/日 = 13 人/日,从 33 人/日缩短到了 13 人/日,效率仍然提升了 150%+。因此 Datav 对于研发效率的提升来讲,也是意义非凡的。

3.3 基础建设

除了上面提到的量化收益,Datav 还带了比较多的隐性收益,例如在团队基础建设上的:

  • 制定了组件开发规范;
  • 建立了一套标准组件库以及组件平台;
  • 沉淀了一些标准的 Node 中间件,例如 logger;
  • 沉淀了一套标准的自动化脚本,组件创建、自动编译、自动化生成文档、代码规范检测等等;
  • 更细粒度的权限管理系统(建设中)。

本文作者

Shopee Digital Purchase & Local Services 前端团队。

Datav:从零开始的数据可视化大屏搭建系统相关推荐

  1. 为民服务 智慧政务数据可视化大屏一体化系统

    为顺应全球发展趋势,以及我国当前经济社会发展进步的需要,加快政府服务信息化.数字化建设紧跟国际步伐的同时也需要开拓引领. 今天给大家分享一个基于 数维图 的 SovitChart编辑器 构建大屏可视化 ...

  2. 基于阿里云之大数据学习:使用DataV制作实时销售数据可视化大屏

    学习目标: 了解数据可视化应用场景 掌握阿里云DataV可视化工具 了解可视化大屏制作流程 使用DataV模板制作数据可视化大屏 一.数据可视化介绍 1.数据可视化: 是指将相对复杂的数据通过可视的. ...

  3. 数据大屏|基于Flask搭建数据可视化大屏1

    项目概述 本文主要基于Flask,ECharts等,利用疫情数据搭建可视化大屏,供加深印象学习.学习案例来源网上开源项目,这里进行逐一拆分复现. 应用技术:Python,Flask,ECharts,M ...

  4. Python搭建一个系统信息实时监控数据可视化大屏

    本文分享使用python搭建服务器应用的监控系统面板,主要流程如下: 1.数据库中创建数据表 2.建立数据库连接 实时数据插入数据表,实时查询更新面板数据准备 3.监控中心大屏制作 具体步骤: 1.创 ...

  5. 阿里云大数据认证——使用DataV制作实时销售数据可视化大屏-课堂笔记

    原文链接:https://juejin.im/post/5c735004e51d45454b62dad5 阿里云Clouder认证 五.使用DataV制作实时销售数据可视化大屏 1. 课程目标 (1) ...

  6. 永洪Desktop实例分享|星巴克数据指标体系建设及炫酷可视化大屏搭建

    点击上方蓝字关注我们 在很久以前分享过一篇用Excel制作炫酷动态看板的文章,很多小伙伴看了之后直呼Excel这种操作极为炫酷,也想实践下这类操作.但是到了真正上手的时候,却发现利用Excel作动态看 ...

  7. 【Dash搭建可视化网站】项目10:疫情数据可视化大屏制作步骤详解

    疫情数据可视化大屏制作步骤详解 1 项目效果图 2 项目架构 3 文件介绍和功能完善 3.1 assets文件夹介绍 3.2 app.py和index.py文件完善 3.3 header.py文件完善 ...

  8. 大数据可视化大屏实例

    最近得到公司的一个任务,就是开发可视化大屏,这个我也没有弄过啊,所以当时是有一点手足无措的感觉,然后在进行借助搜索之后,发现数据大屏其实也就是那样,一般最经典的数据大屏就是 图加背景然后加数据就搞定了 ...

  9. 推荐三款高级可视化工具,解决90%的数据可视化大屏需求

    对于数据分析师来说,可视化可能是最能表现自己工作价值的一个途径,因为领导喜欢看这种直观的.炫酷的.具有科技感的可视化大屏,我们也能把数据分析结果直接展示给领导,比一份纸面报告要强不知多少倍! 那么领导 ...

最新文章

  1. 富文本编辑_博客的后台富文本编辑和阅读计数
  2. elasticsearch扩展ik分词器词库
  3. boost::replace_if相关的测试程序
  4. 北京80后整体亮相《北京作家》
  5. java并发synchronized 锁的膨胀过程(锁的升级过程)深入剖析(2)
  6. python123九宫格输入法_《啊哈C语言-2016最新修正版》.pdf
  7. ICCV 2019 | 上海交大MVIG团队提出InstaBoost,换个dataloader函数, COCO提升3mAP
  8. C++复习总结(涵盖所有C++基本考点)!
  9. 历时两年,微软物联网安全服务 Azure Sphere 全面上线!
  10. 从.fig文件中提取数据
  11. 全网首发:org.xml.sax.SAXNotRecognizedException: unrecognized features nonvalidating/load-external-dtd
  12. python编程方式_python的两种编程方式是什么
  13. 别踩白块游戏用html如何制作,纯用JavaScript 实现网页上《别踩白块儿》小游戏
  14. Spine 实用技巧大全
  15. HTTP请求返回状态码详解
  16. 【vue】vue安装卡住/报错
  17. 信息怎样开4g移动网络连接服务器,怎么强制手机只连接4G网络?
  18. Qt导出数据到excel
  19. 别让灵魂赶不上我们的脚步
  20. 测试使用linux日志定位BUG,Web测试中定位bug方法

热门文章

  1. Macbook双系统多分区的解决方案
  2. 华为笔记本换装linux双系统,matebook的win+ubuntu双系统安装方法
  3. 互联网APP监控即时报警解决初步方案
  4. 中职计算机专业英语ppt,中职计算机英语教学方法论文
  5. np.min()和np.argmin()函数用法
  6. 老年手机英文改中文_老年人使用智能手机(九)不会英语不用怕,装一款软件就能出国啦...
  7. ADSP21489 Target halted due to software breakpoint but no breakpoint found at address: 0x208c0b6 ()
  8. 微信小程序map 地图引入配置+腾讯地图地址坐标解析
  9. 紫砂壶的起源 计算机操作题,紫砂壶的起源与历史发展
  10. 计算机无法启动怎么重装系统,电脑开不开机怎么重装系统教程