引入联合GraphQL以解决系统架构中的问题

news2024/11/15 11:15:38

随着使用需求的增长,用户群的扩大以及新功能的引入,让工程师按照业务的主要领域进行组织变得不可避免。当这些领域在单个实体(如类、服务、应用程序或代码库)的层面变得过于庞大难以管理时,引入联合GraphQL成为优化系统架构的有效手段。

如果GraphQL还不是您在解决开发周期延迟、团队沟通不畅和错过截止日期方面的利器,请考虑采用它作为引入API的正式约定的简便方式,从而使系统架构和依赖该架构的客户端都受益。

我们已经看到一些公司如IMDb和Netflix开始利用GraphQL联合来实现团队自治,并同时保持大规模流量的处理能力,因此让我们更详细地了解如何实现这一点。

一个示例问题空间

让我们设想一个……比如说,博客平台,并考虑在提供该体验时涉及的主要实体。我们有注册的用户,他们可以创建和发布文章,其他用户会对这些文章进行评论点赞

一个简单的数据模型可能如下:

user: id、name、email、createdAt、updatedAt•article: id、userId、title、body、publishedAt、createdAt、updatedAt•comment: id、userId、articleId、createdAt、updatedAt•favorite: id、userId、articleId、createdAt、updatedAt

请注意,我们可能将favorite作为实体的名称,而不是like,因为LIKE是SQL的关键字,可能会在未来引发问题。

4b450746e7706808cbe049fa0146880c.png
 

四个表及其关系

单一应用程序方法

考虑如何在持久层处理 API 查询以获取由给定用户创建的所有文章(让我们使用SQL来说明):

SELECT a.id AS articleId, a.title, a.body, a.publishedAt, u.id AS userId, u.name
FROM article a, user u
WHERE a.userId = u.id AND u.id = <user_id>;

然后,我们可以部署一个应用程序或无服务器函数,它以userId为输入,执行上述查询,将结果文章数组格式化为JSON响应,并返回给调用者。

在MVP阶段,这种耦合程度可能还可以接受,小的需求变更可能也会顺利处理:

我们可以添加user.imageUrl并在该查询中返回吗?

我们还可以添加article.seoKeywords吗?

这些变更可能会毫无问题地实现。

假设平台开始获得关注,用户从数百名增加到数十万名(做得很棒!),文章从数千篇增加到数百万篇,同时还有更多评论和点赞。我们可以想象这样的增长将导致我们组织内部的一些专业化,从而形成了处理用户(注册、账户管理、CRM)、内容(文章、审核、策划)和反馈(评论、点赞)的新领域和团队。

但是现在有个问题:用户和内容在最低层面上是相互关联的,更糟糕的是,它们部署在同一个应用程序中。如果用户和内容领域都有新功能要在本次迭代中发布,那么每个团队现在都依赖于彼此在规定的时间内完成开发,因为任何一端的错误都会阻塞另一端的部署。

引入GraphQL

好的,但是GraphQL有什么关系呢,更别说联合GraphQL了?

d9040dce4c01b7a581acdbafef79d7e0.gif
 

思考,思考,再思考……

最终,为了实现大规模数据服务,关键在于合同。在MVP中,用户和内容之间的合同嵌入在我们的SQL查询中的表JOIN中。这样的合同缺乏灵活性和可扩展性。

让我们试着在堆栈中向更高层次移动,寻找新的合同。也许我们可以有一个UserService类和一个ContentService类,分别查询它们自己的相关信息,并在上游控制器类中将这些查询的结果拼接成出站的文章数组和JSON响应。

ef066d1a945d6e9e303566cb0ad90666.png
 

在控制器层解决跨领域数据

这样做是更好的,但就开发速度而言,如果这些服务仍然属于同一个应用程序或部署,一个领域中的失败变更仍然会阻塞另一个领域中的成功变更。如果合同能够位于更高层次,那将会更好。

事实证明,GraphQL是声明合同的好方法,因为GraphQL模式本质上是客户端可以请求的内容和服务器将在响应中提供的内容之间的合同,类似于OpenAPI / Swagger文档可以告诉调用者关于REST API的信息

但是,GraphQL的妙处在于我们还可以在一个或多个GraphQL端点之前运行网关,并让它们协同工作,以实现统一的模式。这就是GraphQL联合,如果我们为每个领域分配自己的端点,那么每个团队可以有效地独立扩展、维护和部署合同的各个部分,而不会影响其他团队。

在实践中,我们可以利用Apollo的GraphQL功能来实现一个带有GraphQL联合的系统。具体细节可以留待另一篇文章,但是Apollo联合指南提供了您需要立即开始实施的所有内容。

联合GraphQL方法

4e53a1a6c640553a2dee9e88bc81e8e3.png
 

通过GraphQL联合实现领域分离

首先,我们需要搭建一个网关服务器,该服务器配置有一个服务列表,即参与组合GraphQL模式的URL数组。在我们的情况下,这意味着为每个领域(用户、内容和反馈)都搭建一个单独的端点。

用户和内容的一些模式片段可能如下所示:

services/user/index.graphql

services/content/index.graphql

然后,每个个别的GraphQL模式,称为子图,都贡献到整体模式中,并可以在网关中访问。但是,真正的魔法发生在我们开始定义这些子图之间类似外键的依赖关系时。

例如,我们有一个Article模式,其中包含一个userId属性。如果我们可以根据来自用户服务的实际User类型定义一个User属性,那将会怎样?例如,用户服务端点定义的User类型,即在用户端点中定义的User类型。

要做到这一点,我们需要围绕Article类型中的外键userId形成一个合同,这样,每次请求Article中的User属性时,网关服务器将从用户服务端点获取User属性,并将其拼接到出站响应中。

extend语法和将相关属性装饰为@external允许我们在用户领域中定义与其他领域类型(如Article)相关的关系。这相当于我们在外键上进行SQL连接,但是在网关层面进行的连接,这已经是我们在后端响应中能够实现的最远的地方了。

services/user/index.graphql

现在,唯一剩下的就是在解析器中处理我们的User属性,我们在输入中给出userId并用它作为查找依据。

services/user/resolver.ts

这意味着在网关的最终合同中,联合GraphQL模式中User和Article的类型如下所示:

实现领域分离

因为用户和内容领域都拥有各自的端点和GraphQL模式,它们各自的团队现在可以独立于彼此进行部署,使得团队更加快速和高效。

现在,仅仅依赖于各自子图中的外键关系,这些关系在网关层面更容易维护。

实现跨领域的蓝图 🥂

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/823794.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

任务通知

Q: 什么是任务通知&#xff1f; A: FreeRTOS 从版本 V8.2.0 开始提供任务通知这个功能&#xff0c;每个任务都有一个 32 位的通知值。按照 FreeRTOS 官方的说法&#xff0c;使用消息通知比通过二进制信号量方式解除阻塞任务快 45%&#xff0c; 并且更加省内存&#xff08;无需…

图为科技加入深圳市智能交通行业协会 ,打 …

图为科技加入深圳市智能交通行业协会&#xff0c;打造智能交通新生态&#xff01; 交通是国民经济发展的“大动脉”&#xff0c;交通拥堵、事故频发等问题不仅影响了人们的出行体验&#xff0c;也对经济的发展产生了负面影响。安全、高效、便捷的出行&#xff0c;一直是人们的…

策略路由实现多ISP接入Internet

组网需求&#xff1a; 企业分别从ISP1和ISP2租用了一条链路 PC3用户上网访问Server1时走ISP1PC4用户上网访问Server1时走ISP2 拓扑图 一、ISP1 运营商 R1路由器 <Huawei>sys [Huawei]sys R1 [R1]un in en[R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip addr 2.2.2.2 2…

【电影推荐系统】数据爬取、数据加载进MongoDB数据库

概览 本篇主要介绍数据来源、数据加载进数据库过程 1 数据获取 使用Scrapy爬取豆瓣电影数据&#xff0c;然后利用movielens数据集来造一份rating数据。 1.1 数据集获取 数据集获取&#xff1a;选取movielens 数据集&#xff1a;movielens官网数据集包括&#xff1a;movies…

【计算机网络】网络基础(上)

文章目录 1. 网络发展认识协议 2.网络协议初识协议分层OSI七层模型 | TCP/IP网络传输基本流程情况1&#xff1a;同一个局域网(子网)数据在两台通信机器中如何流转协议报头的理解局域网通信原理(故事版本)一般原理数据碰撞结论 1. 网络发展 计算工作是不可能一个科学家搞出来的…

机器学习(一)---概述

文章目录 1.人工智能、机器学习、深度学习2.机器学习的工作流程2.1 获取数据集2.2 数据基本处理2.3 特征工程2.3.1 特征提取2.3.2 特征预处理2.3.3 特征降维 2.4 机器学习2.5 模型评估 3.机器学习的算法分类3.1 监督学习3.1.1 回归问题3.1.2 分类问题 3.2 无监督学习 1.人工智能…

FastAPI 教程、结合vue实现前后端分离

英文版文档&#xff1a;https://fastapi.tiangolo.com/ 中文版文档&#xff1a;https://fastapi.tiangolo.com/zh/ 1、FastAPI 教程 简 介 FastAPI 和 Sanic 类似&#xff0c;都是 Python 中的异步 web 框架。相比 Sanic&#xff0c;FastAPI 更加的成熟、社区也更加的活跃。 …

8.1作业

文件IO函数实现拷贝文件。子进程先拷贝后半部分&#xff0c;父进程再拷贝前半部分&#xff0c;允许使用sleep函数 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<head.h> int main(int argc, const char *argv[]) {pid_t cpidfo…

构建语言模型:BERT 分步实施指南

学习目标 了解 BERT 的架构和组件。了解 BERT 输入所需的预处理步骤以及如何处理不同的输入序列长度。获得使用 TensorFlow 或 PyTorch 等流行机器学习框架实施 BERT 的实践知识。了解如何针对特定下游任务(例如文本分类或命名实体识别)微调 BERT。为什么我们需要 BERT? 正…

保护云数据库实用指南

在数字化转型时代&#xff0c;越来越多的企业将运营转移到云端&#xff0c;导致对云数据库的依赖越来越大。虽然它们提供了可扩展性和可访问性等显着优势&#xff0c;但它们也带来了独特的安全挑战&#xff0c;需要解决这些挑战以保护敏感数据免受各种威胁。 在本文中&#x…

巨人互动|Facebook海外户Facebook page的功能以及如何应用

Facebook Page是Facebook平台上的一种工具&#xff0c;是企业、品牌、机构、公益组织等组织和个人创建社交媒体宣传页面的主要方式之一&#xff0c;通过Page可以将内容传播到更广泛的受众群体&#xff0c;提高品牌知名度和曝光率。下面将详述Facebook Page的功能以及如何应用。…

第125天:内网安全-隧道技术SMBICMP正反向连接防火墙出入规则上线

知识点 #知识点&#xff1a; 1、入站规则不出网上线方案 2、出站规则不出网上线方案 3、规则-隧道技术-SMB&ICMP-隧道技术&#xff1a;解决不出网协议上线的问题&#xff08;利用出网协议进行封装出网&#xff09; -代理技术&#xff1a;解决网络通讯不通的问题&#xff0…

Redis 集群 (cluster)

是什么 官网&#xff1a;Redis cluster specification | Redis 由于数据量过大&#xff0c;单个Master复制集难以承担&#xff0c;因此需要对多个复制集进行集群&#xff0c;形成水平扩展每个复制集只负责存储整个数据集的一部分&#xff0c;这就是Redis的集群&#xff0c;其作…

递归——在运行的过程中调用自己

递归&#xff0c;就是在运行的过程中调用自己 递归必须要有三个要素&#xff1a; ①、边界条件 ②、递归前进段 ③、递归返回段 当边界条件不满足时&#xff0c;递归前进&#xff1b;当边界条件满足时&#xff0c;递归返回。 递归关键&#xff1a;写出递推公式&#xff0c;找…

maven里面没有plugins dependence问题解决

说明&#xff1a;今天在做Nacos、Dubbo整合的时候&#xff0c;在父模块中做了版本限制&#xff0c;出错后就又把版本控制什么都删掉&#xff0c;回退到最开始的状态&#xff0c;此时父模块下面的服务右侧的 maven里面没有plugins dependence &#xff0c;然后项目全都报错。 问…

openSUSE安装虚拟化 qemu kvm

1) 第一种&#xff1a;图形界面yast安装虚拟化 左下角开始菜单搜索yast 点一下就能安装&#xff0c;是不是很简单呢 2&#xff09;第二种&#xff1a; 命令行安装 网上关于openSUSE安装qemu kvm的教程比较少&#xff0c;可以搜索centos7 安装qemu kvm的教程&#xff0c;然后…

/bin/bash: Resource temporarily unavailable

有现场反馈plsql无法连接数据库了&#xff0c;登录环境查看时发现从root切换到grid时报错/bin/bash: Resource temporarily unavailable [rootdb1 ~]# su - grid Last login: Thu Jul 27 18:45:04 CST 2023 su: failed to execute /bin/bash: Resource temporarily unavailab…

Ajax快速入门

Ajax Ajax就是前端访问服务器端数据的一个技术 还有主要就是异步交互 就是在不刷新整页面的情况下&#xff0c;和服务器交换部分我也数据 比如搜索的联想技术 同步和异步的概念 一个是客户端需要等待服务器完成处理&#xff0c;才能进行别的事 一个是客户端不需要等待服务器处…

剑指offer刷题笔记--Num61-68

1--扑克牌中的顺子&#xff08;61&#xff09; 主要思路&#xff1a; 五个数是顺子的充要条件&#xff1a;① 最大值 - 最小值 < 5&#xff08;大小王除外&#xff09;&#xff1b;② 没有出现重复的值&#xff08;大小王除外&#xff09;&#xff1b; 判断是否出现重复的值…

Centos虚拟机修改密码

1.重启系统 2.在这个选择界面&#xff0c;按e 3.找到如下位置&#xff0c;插入init/bin/sh 4.填写完成后按Ctrlx引导启动 5.输入mount -o remount, rw / (注意空格) 6.重置密码 出现以下为重置成功 7.执行touch /.autorelabel 8.退出exec /sbin/init 9.输入你的新密码…