10 | 数据服务难道就是对外提供个API吗?

你好,我是郭忆。

在上一讲中,我为你介绍了为什么必须要有数据服务,你可以看到,数据服务在数据建设中发挥着重要的作用。那有的人可能会好奇了,数据服务到底长什么样子呢? 是不是只对外提供一个API? 真的有这么简单吗?接下来,我们就带着这些问题,学习今天的内容。

而我希望你能在学完这部分内容之后,真正掌握数据服务的产品功能设计和系统架构设计。因为这会对你设计一个数据服务,或者选择一个商业化产品,有很大的帮助。

数据服务应该具备的八大功能

我认为,数据服务应该具备八个功能,只有具备这些功能,才能解决我们在上一讲提到的问题。比如,数据接入方式多样,接入效率低;数据和接口没办法共享;不知道数据被哪些应用访问……

那么为了让你更好地理解数据服务的功能,我来讲个小故事。

你肯定去过菜鸟驿站取快递吧?假设有一个很大的菜鸟驿站,里面有很多组货架,每个货架前都有一些工作人员帮助我们取快递,同时也有很多队伍排队。

取快递,要先约定好接口(比如统一使用收货码来取货)。然后,为了保证不同队伍都能取到快递,我们要对每个队伍做一些限流(比如一个队伍一次只能取一个人)。在你取走快递时,驿站会记录是谁取走了哪个快递,方便后续追查。

这段时间,菜鸟驿站服务开始升级,不仅可以取快递,还提供快递送货上门的服务。除此之外,不同种类的快递对应的货架也变得不同,比如生鲜食品,货架是冷藏冰箱,文件、信封,货架就是文件柜。

对于取快递的人来说,如果他买了生鲜,又买了信封,那他要排好几个队伍,肯定不方便。所以,一般来讲,取快递的人最好只在一个队伍排队,而驿站工作人员帮他一次把多个货架的快递都取过来。

可驿站的货架实在是太多了,为了方便每个取快递的小伙伴都能快速找到每个货架以及队伍,驿站提供了一个导览。与此同时,为了不让工作人员出错,驿站的工作人员必须经过严格的测试,才能上岗。

讲完这个故事之后,我们接着回到数据服务的这八大功能上来。在取快递的这个例子中,你可以把数据服务看成是一个菜鸟驿站,工作人员看成是API解耦库,货架可以看作是中间存储,快递则可以认为是数据。

那么对应到八个功能,就是:

  • 接口规范化定义,可以看成是取快递约定的收货码,基于统一的收货码取走快递;
  • 数据网关,可以看成是我们对每个货架前的队伍进行限流,确保每个队伍都能取走快递;
  • 链路关系的维护,可以看作是驿站会记录谁取走了什么快递;
  • 数据交付,可以看作驿站同时提供取快递和送货上门服务;
  • 提供多样中间存储,可以看成有不同类型的货架;
  • 逻辑模型,可以看成是一个工作人员,可以取多个货架的快递;
  • API接口,可以看作是驿站的不同货架的不同队伍导览;
  • API测试,可以看作是驿站工作人员上岗前的测试。

通过这个故事,你是不是已经对数据服务的八个功能有一个形象的感知了?接下来,我们来看看数据服务这八个功能具体包含什么内容。

第一个是接口规范化定义。

接口规范化定义就是取快递时我们约定的取件码。数据服务,对各个数据应用屏蔽了不同的中间存储,提供的是统一的API。

在上图中,我们可以在数据服务上,定义每个API接口的输入和输出参数。

第二,数据网关。

作为网关服务,数据服务必须要具备认证、权限、限流、监控四大功能,这是数据和接口复用的前提。这就跟我们在菜鸟驿站前取快递,要对每个队伍的人进行认证、限流一个道理。我详细介绍一下。

首先是认证,为了解决接口安全的问题,数据服务首先会为每个注册的应用分配一对accesskey和secretkey,应用每次调用API 接口,都必须携带acesskey和secretkey。

除此之外,对于每个已发布的API,API 负责人可以对应用进行授权,只有有权限的应用才可以调用该接口。同时,API接口的负责人可以对应用进行限流(例如限制每秒QPS 不超过200),如果超过设定的阈值,就会触发熔断,限制接口的访问频率。

需要你注意的是,对于接口复用来说,限流功能非常必要,否则会造成不同应用之间的相互影响。

当然,数据服务还要提供接口相关的监控,比如接口的90%的请求响应时间、接口调用次数、失败次数等相关的监控,另外,对于长时间没有调用的API ,应该予以下线。这样做的好处是防止没用的接口额外占用资源。

第三,全链路打通。

数据服务还必须负责维护数据模型到数据应用的链路关系。

在上图中,经营分析是一个数据应用,甄美丽是数据应用的开发,当她想要访问数据服务中的某个接口获取表A和B的数据时,她需要向接口的发布者马帅帅申请授予权限。然后经营分析就可以通过接口获取到数据。

同时,数据服务会把经营分析和表A和B的访问关系,推送给数据中台的元数据中心。接着元数据中心表A、B以及A和B的上游所有的表(图中D和E)上,就会有经营分析数据应用的标签。

当表D的产出任务异常时,马帅帅可以通过元数据中心,快速判断出该任务影响了经营分析数据产品的数据产出。同时,当马帅帅想要下线表D时,也可以通过这张表是否有标签,快速判断这个表下游是否还有应用访问。当马帅帅取消API 接口授权时,元数据中心同时会清理表的相关标签。

需要特别提到的是,一个数据应用往往涉及很多页面,如果我们在影响分析时,只分析到应用,可能粒度还是太粗了,需要到更细级别的页面的粒度,比如一个任务异常,我不光要知道是哪个数据产品,还必须得知道是哪个数据产品的哪个页面。此时,我们在接口授权时,可以标注页面名称。

第四,推和拉的数据交付方式。

相信你听到的数据服务,都是以API接口的形式对外提供服务,但是业务实际场景中,光API 还不够的。我把API 方式称为拉的方式,而实际业务中同样还需要推的场景。

比如在实时直播场景中,商家需要第一时间获得关于活动的销售数据,此时就需要数据服务具备推的能力,我把它称为数据的送货上门服务。数据服务将数据实时写入到一个Kafka中,然后应用通过订阅Kafka的Topic,可以获得实时数据的推送。

第五,利用中间存储,加速数据查询。

数据中台中数据以Hive表的形式存在,基于Hive或者是Spark计算引擎,并不能满足数据产品低延迟,高并发的访问要求,

所以,一般做法是将数据从Hive表导出到一个中间存储,由中间存储提供实时查询的能力。数据服务需要根据应用场景支持多种中间存储,我列举了一些常用的中间存储以及这些存储适用的场景,希望你能根据实际场景选择适合的中间存储。

第六,逻辑模型,实现数据的复用。

在前面取快递的场景中,每一个货架一拨工作人员,其实对取快递的人并不友好,所以最好的就是一个人帮我们把所有的快递都取了。这就有点儿类似数据服务中逻辑模型的概念了。我们可以在数据服务中定义逻辑模型,然后基于逻辑模型发布API,逻辑模型的背后实际是多个物理表,从用户的视角,一个接口就可以访问多张不同的物理表了。

逻辑模型可以类比为数据库中视图的概念,相比于物理模型,逻辑模型只定义了表和字段的映射关系,数据是在查询时动态计算的。逻辑模型可以看作是相同主键的物理模型组成的大宽表。逻辑模型的存在,解决了数据复用的问题,相同的物理模型之上,应用可以根据自己的需求,构建出不同的逻辑模型,每个应用看到不同的列。

在上面这个例子中,有三个物理模型,但是主键都是商品ID,针对商品运营系统和店铺参谋,我们可以构建两个不同的逻辑模型,分别从不同的视角看数据,逻辑模型并不实际存在,而是在查询的时候,根据逻辑模型映射的物理模型字段,动态的地将请求拆分给多个物理模型,然后对多个查询结果进行聚合,得到逻辑模型查询的结果。

第七,构建API 集市,实现接口复用。

为了实现接口的复用,我们需要构建API的集市,应用开发者可以直接在API 集市发现已有的数据接口,直接申请该接口的API 权限,即可访问该数据,不需要重复开发。

需要特别指出的是,数据服务通过元数据中心,可以获得接口访问的表关联了哪些指标。使用者可以基于指标的组合,筛选接口,这样就可以根据想要的数据,查找可以提供这些数据的接口,形成了一个闭环。

讲了这么多数据服务应该具备的功能,你可能会问,那数据服务应该如何实现呢? 我们下面就来讲数据服务的架构设计。

数据服务系统架构设计

网易在实现数据服务时,主要采用了云原生、逻辑模型和数据自动导出三个关键设计,关于这部分内容,我希望你能通过学习,在实际工作中可以借鉴我们的方式完成数据服务的设计,或者在选择商业化产品时,给你一个架构选型方面的参考。

云原生

云原生的核心优势在于每个服务至少有两个副本,实现了服务的高可用,同时根据访问量大小,服务的副本数量可以动态调整,基于服务发现,可以实现对客户端透明的弹性伸缩。服务之间基于容器实现了资源隔离,避免了服务之间的相互影响。这些特性非常适用于提供高并发、低延迟,在线数据查询的数据服务。

上图是网易数据服务的部署架构,在这个图中,每个已经发布上线的API接口都对应了一个Kubernates的Service,每个Service 有多个副本的Pod组成,每个API 接口访问后端存储引擎的代码运行在Pod对应的容器中,随着API接口调用量的变化,Pod 可以动态的创建和销毁。

Envoy 是服务网关,可以将Http请求负载均衡到Service的多个Pod上。Ingress Controller 可以查看 Kubernates中每个Service的Pod 变化,动态地将Pod IP写回到Envoy,从而实现动态的服务发现。前端的APP,Web或者是业务系统的Server端,通过一个4层的负载均衡LB接入到Envoy。

基于云原生的设计,解决了数据服务不同接口之间资源隔离的问题,同时可以基于请求量实现动态的水平扩展。同时借助Envoy实现了限流、熔断的功能。你也可以借鉴我们的方案,实现原原生的数据服务设计。

逻辑模型

相较于物理模型,逻辑模型并没有保存实际的数据,而只是包括了逻辑模型和物理模型的映射关系,数据在每次查询时动态生成。逻辑模型的设计,解决了不同接口,对于同一份数据,需要只看到自己需要的数据的需求。

下图是网易数据服务逻辑模型的系统设计图。

接口发布者在数据服务中选择主键相同的多张物理表构建一个逻辑模型,然后基于逻辑模型发布接口。API 服务接到查询请求后,根据逻辑模型和物理模型字段的映射关系,将逻辑执行计划拆解为面向物理模型的物理执行计划,并下发多个物理模型上去执行,最后对执行的结果进行聚合,返回给客户端。

一个逻辑模型关联的物理模型可以分布在不同的查询引擎上,但是这种情况下,考虑性能因素,只支持基于主键的筛选。

数据自动导出

数据服务选择的是数据中台的一张表,然后将数据导出到中间存储中,对外提供API 。那数据什么时候导出到中间存储中呢? 要等数据产出完成。

所以在用户选择了一张数据中台的表,定义好表的中间存储后,数据服务会自动生成一个数据导出任务,同时建立到这个数据中台表的产出任务的依赖关系,等到每次调度产出任务结束,就会触发数据导出服务,将数据导出到中间存储中,此时API 接口就可以查询到最新的数据。

课堂总结

你看,数据服务化不是一个API接口这么简单吧,它的背后是数据标准化交付的整套流程。通过这节课,我为你介绍了数据服务的八大关键功能设计和三大系统架构设计。

在最后,我还想强调几个点:

  • 数据服务实现了数据中台模型和数据应用的全链路打通,解决了任务异常影响分析和数据下线不知道影响哪些应用的难题;
  • 基于相同主键的物理模型,可以构建逻辑模型,逻辑模型解决了数据复用的难题,提高了接口模型的发布效率;
  • 数据服务宜采用云原生的设计模式,可以解决服务高可用、弹性伸缩和资源隔离的问题。

数据服务化对于加速数据交付流程,以及数据交付后的运维管理效率有重要作用,也是数据中台关键的组成部分。

思考时间

数据服务要想解决数据被哪些应用访问的问题,就必须确保所有数据应用都必须通过数据服务获取数据中台的数据,那问题来了,如何确保数据服务是数据中台的唯一出口?欢迎在留言区与我互动。

最后感谢你的阅读,如果这节课让你有所收获,也欢迎你将它分享给更多的朋友。

精选留言

  • 你好

    2020-05-02 14:21:01

    老师,逻辑模型映射物理模型,对于一对多的情况,会不会这多个物理模型是来源于多个存储(比如gp、mysql、hbase),如果是的话,是怎么实现的?
    作者回复

    你好,问的问题挺好的。

    一对多的话,一个逻辑模型对应多个物理模型,有可能存在分散在不同的数据源的情况,比如一个是MySQL的表,一个是HBase的表,这个时候,我们就得实现跨数据源的查询,当然,是有限制的,比如只能基于主键做Join,你在构建逻辑模型的时候。

    数据服务,接受到请求后,会根据逻辑模型和物理模型的映射关系,把逻辑模型拆分成多个物理查询请求,然后对返回结果进行聚合。这里面必须要限制查询的条数。

    2020-05-09 17:05:09

  • zhuxueyu

    2020-05-17 22:38:24

    要让数据服务成为数据中台的唯一出口,个人觉得要从三点收口:
    1、数据中台的数据能基本覆盖业务的数据需求;
    2、业务通过数据服务获取数据更便捷
    3、公司层面统一数据出口 - 数据中台
    作者回复

    总结的不错~

    2020-05-25 20:47:00

  • leed

    2020-11-27 16:30:05

    郭老师,看了您的文章受益匪浅,在数据服务这有一点不知道你们是怎么做的,就是填好api信息后,自动生成api接口,这个是有什么开源的框架吗
  • 无语飞涵

    2020-05-18 10:49:05

    老师留的问题我觉得是需要上升到整个组织架构和流程管理,如,每个业务部门提出的需求,需要经过组织中负责企业级数据的部门团队或者评审会,确认该需求是否是属于数据应用类,必须通过数据中台来实现。
    作者回复

    我觉得,有一个点,你说的很好,技术并不能解决所有的问题,很多问题需要管理机制来配合完成,但是技术本身可以降低管理的复杂性,增强管理的可落地性。

    感谢你的留言~

    2020-05-25 20:46:48

  • 特种流氓

    2020-05-07 09:24:35

    实时部分如何融合到数据到数据中台里面来 与离线模型一起统一对外提供服务
    作者回复

    今年之前,网易的离线和实时数据架构,还是采用的Lamda架构,即实时采用kafka+flink的方式,离线采用spark+hdfs的方式,从ods原始数据开始,kafka会归档一份数据到hdfs,然后分别计算,在数据应用场景上,T+1的数据用离线计算的,T+0的数据用实时链路的。历史数据以离线计算为准。

    今年,我们引入的iceburg,正在研发批流一体的实时数据中台架构,iceburg可以实现upsert功能,可以实时更新,避免merge操作。用iceburg统一离线和实时的存储,同时在计算引擎上,主要使用flink,然后辅助用Spark进行校验。目前整套数据湖的方案还在研发中,当然Iceburg也存在一些挑战,比如怎么和现有的impala mpp集成,怎么基于iceburg文件粒度的元数据统计优化计算引擎性能,都是我们目前正在推进的工作。

    感谢你的阅读~祝好~

    2020-05-13 20:08:41

  • Bill

    2020-04-24 11:14:36

    👍 到目前为止,几乎和我设想以及实践方式一致。
    数据服务这块儿其实可以更简单
    - 被动获取:通过1个API解决所有数据请求,只变响应结构即可
    - 主动推送:按需按时推送到使用方,做数据增量/全量同步即可。
    作者回复

    感谢你的认可,看来你对这个问题也有深入的思考。数据服务,最早我们其实只提供了API的方式,但是其实发现很难满足业务的全部要求,比如实时数据推送的这个场景,你靠API就搞不定。所以我们又做了送货上门的推的服务。

    感谢你的阅读,下一次留言区再会~

    2020-04-25 23:21:39

  • 海军陆战队

    2020-07-30 07:39:29

    您好,对于逻辑模型这块没有看明白,文章中展示的API创建页面都是选定一个数据源,一张表来生成的,多张表,甚至是跨数据源的逻辑模型配置是怎么做的,系统功能是怎样实现的?
  • 风轻云淡

    2020-07-18 18:00:53

    老师,你之前说数据中台的核心是共享、服务和连接,连接怎么理解?
    作者回复

    其实,这门课,我并没有涉及到OneID的概念,比如都是一个用户,他在不同的app之间,是否可以唯一的标识,这个就是把不同业务系统的相同实体用唯一的ID打通,可以横向关联分析,这就是连接的内涵。另外一个用户,即使在同一个App内,登录前,登陆后,能不能标识成一个人,也属于OneID的概念。

    连接、服务、共享,是中台思想的核,不仅仅是在数据中台,同样对应于其他中台。

    感谢你的提问,祝好~

    2020-07-20 20:18:04

  • Sandflass

    2020-05-02 00:43:04

    老师,请问一下对于实时的数据服务,比如您提到的实时直播场景,您只提到了最后的数据服务通过kafka推送,但是中间的数据源实时接入、数据实时加工应该采用何种技术方案呢?应该是有异于离线计算的方案吧?我们公司一些业务对于数据实时服务要求比较高,计算量并不大,这种场景应如何做技术选型呢?
    作者回复

    你好,数据服务,只负责数据的交付,数据的接入和加工,不是数据服务负责的范畴,是数据集成和数据开发中心负责的范畴。

    实时数据集成,对于关系数据库,可以基于MySQL的二进制日志binlog,实时同步到kafka,然后基于flink对数据进行清洗加工,然后推送给最终的kafka数据,在实时直播场景下,常见的也有写入到redis,然后应用系统通过数据服务,高频率刷新读redis。

    感谢你的提问~

    2020-05-13 19:56:04

  • Lee

    2020-10-03 16:20:47

    老师,“网易数据服务逻辑模型的系统设计图”中的“查询服务”是全部自己实现的吗?是否可以利用开源的工具比如:presto、calcite 做这个统一的引擎层?
  • 你好

    2020-05-14 00:23:41

    老师,数仓统计好的表在hive中,然后落地到hbase才能对外提供api,这个场景应该有吧。我想问的是怎么落地到hbase呢?(数据量大的话还得提前预分区hbase)
    ,两个库之间衔接问题。
    作者回复

    我们是基于数据传输这个工具,把数据从Hive抽取到HBase中的,数据传输工具是基于Spark实现的。

    2020-06-15 20:42:03

  • 阿巍-豆夫

    2020-04-24 09:55:32

    数据服务太大了。一个数据服务就远比数据治理麻烦的多
    作者回复

    数据服务,确实技术门槛还挺高的,不过只有数据服务做好,整个数据中台的数据出口才能收口,才能从根本上解决指标管理、全链路血缘建立的问题。

    感谢你的阅读,我们下一次留言区再会~

    2020-04-25 23:22:49

  • 僊峯

    2021-11-03 14:22:51

    老师,关于逻辑模型的查询你们是自己写的还是用的开源查询引擎,比如presto
  • ZSW

    2020-05-31 17:14:28

    老师,你好,对于实时数据和离线数据怎么结合这一部分有点疑问,现在离线和实时先分别计算,计算之后,数据是合并到一起呢?我大概想到2两种思路:
    1、从物理存储上就合并在一起,离线数据统计结果写入A表,实时统计结果追加到A表?如果这种方式有什么好的实现方案吗?
    2、物理存储层面分别存储, 如果分别存储,那如果一个查询查的时间跨度是“从历史数据查到今天的实时数据”,是不是在逻辑层分别取出来之后,再进行合并?
    作者回复

    你的问题涉及到批流一体了。批计算和流计算,有两种架构,一种是lamda架构,一种是kappa架构。

    lamda架构目前在实际企业中落地最多。一般当天数据用实时,过往数据用离线。

    kappa架构应该是未来一个趋势,现在数据湖概念比较火热,可以基于iceburg实现批流一体的存储层统一。

    2020-06-15 20:39:36

  • Weehua

    2020-05-23 16:44:37

    感谢郭老师的分享。我提2个问题:
    1. 数据中台的数据,大部分应该还是离线为主,这些T+1时效性的数据,可以用在核心的业务流程中吗?
    2. 实时数据,数据中台和业务中台怎么划清责任边界呢?
    作者回复

    HI, 你好,WeehuaZheng,

    第一个问题: 实时数据中台一定是数据中台发展的下一站,解决了离线数据的共享和复用,实时数据的复用和共享将会是下一个阶段关注的重点。一般在使用过程中,T+1的统计数据使用离线数据,当天的数据使用实时数据。

    第二个问题: 实时数据中台与离线数据中台,在方法论上也是相似的,实时数据中台同样也需要通过数据服务接口的方式对外暴漏服务。业务中台与数据中台的责任边界,数据中台负责统计分析型数据的展现。在大数据量下,业务系统去做实时数据的分析是非常耗资源的,而且还面临指标统计口径问题,所以统一由数据中台对接。

    感谢你的提问,欢迎你在留言区与我交流~

    2020-05-25 19:41:51

  • 你好

    2020-05-02 09:13:25

    老师,逻辑模型底层是个复杂的多表连接的SQL吗?还是个基于这个SQL创建好的视图?
    作者回复

    逻辑模型,跟你定义视图其实是一样的,对应的其实就是一条SQL,这个SQL 表明了你的逻辑模型。

    视图也是对应的一条SQL。

    2020-05-09 17:06:02

  • 周正品

    2020-09-10 17:37:31

    老师你好,就是我们刚开始建设基于hadoop 体系建设数据仓库,就是关于业务库有涉及修改以及物理删除的数据,就是业务数据增量到ods后 ,请问下这些数据如何去把控,是分区的形式还是对ods 进行数据合并后再去跑dw层的数据。以及问下目前对外提供api的话,有没有快速的基于sql的形式马上可以供对外完成一个api的产品?
    作者回复

    你好,更多的情况是通过分区的形式存在的。成熟的数据服务的产品,开源的目前还没有,商业化产品,可以关注一下网易的大数据产品。

    2020-09-29 19:56:53

  • Geek_ba5f3b

    2020-07-28 21:49:46

    郭老师好!目前公司没有完整的数据中台服务,所以目前面临一个比较尴尬的问题:就是如何对每日产生打大量数据(千万--亿级)进行快速计算。目前的做法是通过etl将数据从业务库(PG)抽取到我们数据可视化应用本地库(PG),但在这过程中速度慢不说,一旦统计超过一个月数据,数据库会直接撑不住,不知道如何解决现在的问题。求教~~
  • 菜鸟和谐号

    2020-07-03 15:45:33

    数据服务是基于明细数据还是结果数据,如果在明细数据表上加视图,实现数据api地图我觉的太难了,毕竟大部分的app层的明细表是基于报表开发的,开发人员有时都懵逼,还让业务开发人员去基于app层的视图去求指标,我觉的简直是一个不可能完成的任务。而且维护成本很高。如果基于结果数据去做视图,数据维度太多,难免会丢失统计维度。
  • 你好

    2020-05-02 14:26:04

    老师,数据服务涉及api、网关什么的各个方面,听起来很复杂,有现成的开源产品或收费产品吗?还是一般是自己开发,我看在发布服务时还会在元数据产品中写入标签数据,好像也不像个独立的产品,应该和元数据是一个产品好像又得自己开发整套东西。。
    作者回复

    Hi,你好,数据服务就我所知,目前没有一个很成熟的开源产品,我们是自研的。

    数据服务和元数据中心不是一个产品,只是要打通,在数据服务发布接口的时候,可以把哪个应用的哪个接口下沉到元数据中心,这样可以方便在数据地图,任务运维中心,我们可以看到某张表,下游影响哪些接口。

    2020-05-12 22:14:20