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

InfoQ: http://www.infoq.com/cn/news/2015/10/graphql-your-schema?_t=t

总结:

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

相关文章
|
5月前
|
缓存 API 数据库
构建高效后端API的五大秘诀
【8月更文挑战第27天】在数字化时代,一个快速、可靠且易于维护的后端API是成功的关键。本文将深入探讨如何构建高效的后端API,涵盖设计原则、工具选择、性能优化、安全性强化以及文档编写等方面。通过实际代码示例和最佳实践,我们将揭示如何打造一个既灵活又强大的后端系统,满足现代应用的需求。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。
|
5月前
|
缓存 监控 安全
使用GraphQL构建高效数据查询:技术深度剖析与实践
【8月更文挑战第11天】GraphQL以其强大的灵活性和高效性,为现代Web开发提供了一种全新的数据查询和传输方式。通过合理使用GraphQL的核心特性和策略,开发者可以构建出高效、灵活且易于维护的API。然而,GraphQL的成功应用也需要开发者在Schema设计、查询优化、客户端缓存以及安全性等方面进行深入的思考和实践。希望本文能够为开发者在使用GraphQL构建高效数据查询方面提供一些有益的参考和启示。
|
5月前
|
前端开发 大数据 数据库
🔥大数据洪流下的决战:JSF 表格组件如何做到毫秒级响应?揭秘背后的性能魔法!💪
【8月更文挑战第31天】在 Web 应用中,表格组件常用于展示和操作数据,但在大数据量下性能会成瓶颈。本文介绍在 JavaServer Faces(JSF)中优化表格组件的方法,包括数据处理、分页及懒加载等技术。通过后端分页或懒加载按需加载数据,减少不必要的数据加载和优化数据库查询,并利用缓存机制减少数据库访问次数,从而提高表格组件的响应速度和整体性能。掌握这些最佳实践对开发高性能 JSF 应用至关重要。
80 0
|
6月前
|
前端开发 API 开发者
GraphQL在复杂数据查询中的优势
【7月更文挑战第18天】GraphQL在复杂数据查询中展现出了显著的优势,包括精确获取所需数据、支持深度嵌套的关联数据、强大的类型系统、实时数据更新、单一端点和查询组合以及简化版本管理和前后端协作。这些优势使得GraphQL成为现代应用开发中不可或缺的一部分,特别是在构建高性能、高可维护性的Web应用时。随着技术的不断发展,GraphQL的应用前景将更加广阔。
|
6月前
|
弹性计算 负载均衡 中间件
|
7月前
|
API 数据处理 开发者
GraphQL:数据查询的革命
【6月更文挑战第11天】GraphQL,由Facebook开发,是一种革命性的API查询语言,解决了RESTful API在数据查询上的局限性。它提供灵活性,允许客户端按需请求数据,优化性能,具有强类型系统,并只需单个端点处理所有请求。GraphQL在现代Web开发中广泛应用,包括数据驱动的Web应用、实时数据更新、移动端和微服务架构。尽管有学习曲线和实现挑战,但通过学习和工具,开发者能克服这些问题,发挥其潜力,推动Web开发创新。
|
8月前
|
缓存 前端开发 测试技术
使用GraphQL进行高效数据查询的技术指南
【5月更文挑战第24天】GraphQL是Facebook开源的查询语言,用于高效数据查询,解决RESTful API的过度获取、不足获取及冗余问题。它允许客户端指定所需数据,实现按需获取,具有客户端定义查询、灵活性和可扩展性、减少API数量等优势。GraphQL基于类型和模式工作,通过定义模式、实现解析器、整合前后端及测试优化来实现查询。适用于灵活数据需求、复杂关联查询和实时数据更新的场景,但也存在学习成本高、服务器实现复杂和性能优化问题。
|
8月前
|
供应链 监控 搜索推荐
实时数据驱动:API商品数据接口的三重保证,助力您的业务飞跃
在当今快节奏、不断演变的商业世界中,企业如何能够迅速应对市场的瞬息万变?答案无疑是通过有效管理和应用数据资产。本文将带您深入理解API商品数据接口如何激活这些资产,并确保您的企业在市场竞争中始终保持领先。
|
8月前
|
供应链 监控 搜索推荐
实时数据驱动:API商品数据接口引领业务飞跃
在数字化浪潮中,企业必须快速应对市场的瞬息万变。实现这一目标的核心在于有效管理和应用数据资产。本文将深入探讨API商品数据接口如何激活这些资产,并确保您的企业在激烈的市场竞争中抢得先机。
|
8月前
|
前端开发
探索GraphQL:从概念到实践,构建高效的数据查询与交互
在传统的RESTful接口架构中,前端开发人员常常受限于数据的获取和传输方式。然而,GraphQL作为一种新兴的数据查询语言和运行时,提供了更加灵活和高效的数据交互方式。本文将介绍GraphQL的概念和原理,并通过实际案例展示如何实践GraphQL,以构建高效、可扩展的数据查询与交互系统。

热门文章

最新文章