GraphQL提供数据接口新思路之数据聚合解决方案

简介: GraphQL解决数据聚合和再组织的技术,通过按需获取数据的方式适应端的发展。

目标:框架打造,别具匠心。服务于业务的数据聚合平台。

screenshot

引言: 蜂巢内容平台面临的挑战:互联网的发展,多端的数据展现和业务数据聚合,如何最佳的根据的查询条件给出不同的数据聚合和数据格式? 所见即所得,是前端人员或者是接入内容平台的业务方最希望看到的结果。一切让调用者自己定义格式和请求条件。

GraphQL涉及哪些场景

一个GraphQL查询是一个字符串,它被发送给一个与数据模式无关的服务器,然后服务器返回JSON数据。GraphQL是强类型的,并避免了版本控制,同时提供了随着数据演进可以轻易改进查询语句的能力。

现有的业务场景一般是这样的,业务方提出需求,然后寻找开发资源,由后端提供数据,让前端实现各种不同的业务视图。这样的做法存在很多的重复劳动,如果能够将其中通用的内容抽取出来提供给各个业务方反复使用,必然能够节省宝贵的开发时间和开发人力。

前端的解决方案是将视图组件化,各个业务线既可以是组件的使用者,也可以是组件的生产者。那么问题来了,前端通过组件实现了跨业务的复用,后端接口如何相应地提高开发效率呢?

我们假设某个业务需要以下数据内容 a:

{
  user(id: 3500401) {
    id,
    name,
    isViewerFriend
  }
}

对,这不是 JSON,但是我们仍然可以看懂它表示的是查询 id 为 3500401 用户的 id,name 和 isViewerFriend 信息。用户信息对于各个业务都是通用的,假设另外一个业务需要这样的用户信息 b:

{
  user(id: 3500401) {
    name,
    profilePicture(size: 50)  {
      uri,
      width,
      height
    }
  }
}

对比一下,我们发现只是少了两个字段,多了一个字段而已。如果要实现我们的目标,即复用同一个接口来支持这两种业务的话,会有以下几种做法:

用同一个接口,这个接口提供了所有数据。这样做的好处是实现起来简单,但缺点是对业务做判断的逻辑会增多,而且对于业务来说,响应内容中有些数据根本用不到;
使用参数来区分不同的业务方并返回相应的数据。好处仍然是实现简单,虽然不会有用不到的数据返回,但是仍然需要增加业务逻辑判断,会造成以后维护的困难。
此外,这样还会造成不同业务之间的强依赖,每次发布都需要各个业务线一起测试和回归。不重用接口则没法提高开发效率,重用接口则会有这些问题,那么到底有没有“好一点”的解决方案呢?

这是我们在处理复杂的前后端分离中经常要面临的一个思考。

1. GraphQL,一种新的思路

我们知道,用户信息对应的数据模型是固定的,每次请求其实是对这些数据做了过滤和筛选。对应到数据库操作,就是数据的查询操作。如果客户端也能够像“查询”一样发送请求,那不就可以从后端接口这个大的“大数据库”去过滤筛选业务需要的数据了吗?

GraphQL 就是基于这样的思想来设计的。上面提到的(a)和(b)类型的数据结构就是 GraphQL 的查询内容。使用上面的查询,GraphQL 服务器会分别返回如下响应内容。

a 查询对应的响应:

{
  "user" : {
    "id": 3500401,
    "name": "peter",
    "isViewerFriend": true
  }
}

b 查询对应的响应:

{
  "user" : {
    "name": "peter",
    "profilePicture": {
      "uri": "http: //someurl.cdn/pic.jpg",
      "width": 50,
      "height": 50
    }
  }
}

只需要改变查询内容,前端就能定制服务器返回的响应内容,这就是 GraphQL 的客户端指定查询(Client Specified Queries)。假如我们能够将基础数据平台做成一个 GraphQL 服务器,不就能为这个平台上的所有业务提供统一可复用的数据接口了吗? 如果定位为:数据服务标准化管理,数据网关也是不错的架构。

image

借助于Antlr语法解析:
参考: http://www.antlr.org/
screenshot

2, 查询条件自由组合 QSQL

1) 如何让各种条件组合+逻辑判断一起使用,很自然想到的是SQL函数。
2) GraphQL同样支持条件传递和变量替换,让查询串和请求格式串分离。
3) 最终围绕多维度数据聚合进行思考

3,如何解决1+N问题?

我们先看看graphQL的执行流程 。
回到语法树的遍历: 深度遍历或者广度遍历(解决LIST数据批量获取的特性)
深度遍历
广度遍历

我们采取广度遍历算法,构建相同的节点采取批量直接构建List List这样的形式请求领域服务,完成批量问题调用。

参考:

规范:https://github.com/chentsulin/awesome-graphql
代码参考:http://facebook.github.io/graphql/
InfoQ: http://www.infoq.com/cn/news/2015/10/graphql-your-schema?_t=t

总结:

后续还有很多优化和配套工具需要继续完善,其中包括内容平台的领域模型标准化建设,一键建站服务,垃圾防控,性能优化和限流降级和接口监控等。

相关文章
|
搜索推荐
统一召回引擎的优势
统一召回引擎的优势
108 0
|
存储 SQL 关系型数据库
TiDB亿级数据亚秒响应查询整体架构
TiDB亿级数据亚秒响应查询整体架构
958 0
|
4月前
|
缓存 监控 安全
使用GraphQL构建高效数据查询:技术深度剖析与实践
【8月更文挑战第11天】GraphQL以其强大的灵活性和高效性,为现代Web开发提供了一种全新的数据查询和传输方式。通过合理使用GraphQL的核心特性和策略,开发者可以构建出高效、灵活且易于维护的API。然而,GraphQL的成功应用也需要开发者在Schema设计、查询优化、客户端缓存以及安全性等方面进行深入的思考和实践。希望本文能够为开发者在使用GraphQL构建高效数据查询方面提供一些有益的参考和启示。
|
5月前
|
前端开发 API 开发者
GraphQL在复杂数据查询中的优势
【7月更文挑战第18天】GraphQL在复杂数据查询中展现出了显著的优势,包括精确获取所需数据、支持深度嵌套的关联数据、强大的类型系统、实时数据更新、单一端点和查询组合以及简化版本管理和前后端协作。这些优势使得GraphQL成为现代应用开发中不可或缺的一部分,特别是在构建高性能、高可维护性的Web应用时。随着技术的不断发展,GraphQL的应用前景将更加广阔。
|
6月前
|
API 数据处理 开发者
GraphQL:数据查询的革命
【6月更文挑战第11天】GraphQL,由Facebook开发,是一种革命性的API查询语言,解决了RESTful API在数据查询上的局限性。它提供灵活性,允许客户端按需请求数据,优化性能,具有强类型系统,并只需单个端点处理所有请求。GraphQL在现代Web开发中广泛应用,包括数据驱动的Web应用、实时数据更新、移动端和微服务架构。尽管有学习曲线和实现挑战,但通过学习和工具,开发者能克服这些问题,发挥其潜力,推动Web开发创新。
|
7月前
|
缓存 前端开发 测试技术
使用GraphQL进行高效数据查询的技术指南
【5月更文挑战第24天】GraphQL是Facebook开源的查询语言,用于高效数据查询,解决RESTful API的过度获取、不足获取及冗余问题。它允许客户端指定所需数据,实现按需获取,具有客户端定义查询、灵活性和可扩展性、减少API数量等优势。GraphQL基于类型和模式工作,通过定义模式、实现解析器、整合前后端及测试优化来实现查询。适用于灵活数据需求、复杂关联查询和实时数据更新的场景,但也存在学习成本高、服务器实现复杂和性能优化问题。
|
6月前
|
JSON DataWorks 前端开发
只需三步即可透过 DataWorks 数据服务建构 GraphQL 服务
DataWorks数据服务提供便捷的操作即可提供大数据API,现在支持导出更完整的API文档(基于OpenAPIv3),除了能导入到三方插件(Postman、VSCode、Swagger、Redoc等),还能转成GraphQL,本文将介绍如何将DataWorks数据服务API提供到GraphQL服务上。
61 0
|
7月前
|
供应链 监控 搜索推荐
实时数据驱动:API商品数据接口的三重保证,助力您的业务飞跃
在当今快节奏、不断演变的商业世界中,企业如何能够迅速应对市场的瞬息万变?答案无疑是通过有效管理和应用数据资产。本文将带您深入理解API商品数据接口如何激活这些资产,并确保您的企业在市场竞争中始终保持领先。
|
7月前
|
供应链 监控 搜索推荐
实时数据驱动:API商品数据接口引领业务飞跃
在数字化浪潮中,企业必须快速应对市场的瞬息万变。实现这一目标的核心在于有效管理和应用数据资产。本文将深入探讨API商品数据接口如何激活这些资产,并确保您的企业在激烈的市场竞争中抢得先机。
|
7月前
|
前端开发
探索GraphQL:从概念到实践,构建高效的数据查询与交互
在传统的RESTful接口架构中,前端开发人员常常受限于数据的获取和传输方式。然而,GraphQL作为一种新兴的数据查询语言和运行时,提供了更加灵活和高效的数据交互方式。本文将介绍GraphQL的概念和原理,并通过实际案例展示如何实践GraphQL,以构建高效、可扩展的数据查询与交互系统。