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

随着使用需求的增长,用户群的扩大以及新功能的引入,让工程师按照业务的主要领域进行组织变得不可避免。当这些领域在单个实体(如类、服务、应用程序或代码库)的层面变得过于庞大难以管理时,引入联合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模式,它们各自的团队现在可以独立于彼此进行部署,使得团队更加快速和高效。

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

实现跨领域的蓝图 🥂

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【安装】XMind2022XMind2020安装教程(资源)

Xmind是一个制作思维导图很便利的软件。 1.资源链接 Xmind2022: 链接&#xff1a;https://pan.baidu.com/s/1j4DFedxxX2YJ3HBy1-MpHw?pwdxmin 提取码&#xff1a;xmin Xmind2020: 链接&#xff1a;https://pan.baidu.com/s/1wNqMApuy0yoBF2CvpBDpDA?pwdxmin 提取码&#x…

mac使用mvn下载node-sass 会Binary download failed, trying source

m1 上使用nvm 以下node的版本可以直接下载&#xff08;Binary download&#xff0c;而不是 trying source&#xff09;而不用切换mac cpu架构 zhiwenwenzhiwenwendeMBP cockpit % nvm install 14.15.5 Downloading and installing node v14.15.5... Downloading https://node…

如何使用 ChatGPT 为 Midjourney 或 DALL-E 等 AI 图片生成提示词

人工智能为创意产业开辟了一个充满可能性的全新世界。人工智能最令人兴奋的应用之一是生成独特且原创的艺术品。Midjourney 和 DALL-E 是人工智能生成艺术的两个突出例子&#xff0c;吸引了艺术家和艺术爱好者的注意。在本文中&#xff0c;我们将探索如何使用 ChatGPT 生成 AI …

Go学习第四天

Interface空接口万能类型与类型断言机制 package mainimport "fmt"// interface{}是万能数据类型 func myFunc(arg interface{}) {fmt.Println("myFunc is celled....")fmt.Println(arg)// interface{} 该如何区分 此时引用的底层数据类型到底是什么&…

中介者模式——协调多个对象之间的交互

1、简介 1.1、概述 如果在一个系统中对象之间的联系呈现为网状结构&#xff0c;如下图所示&#xff1a; 对象之间存在大量的多对多联系&#xff0c;将导致系统非常复杂&#xff0c;这些对象既会影响别的对象&#xff0c;也会被别的对象所影响&#xff0c;这些对象称为同事对…

对于数据库查询索引和查字典索引的理解

之前面试问过我对于数据库索引的理解&#xff0c;这个问题不是具体的问题太宽泛&#xff0c;面试官也没进行引导&#xff0c;我不知道怎么回答&#xff0c;下面是结合查字典进行理解。 查字典 拿查字典举例&#xff0c;知道一个字怎么写但是不知道具体的意思以及发音&#xff…

WEB集群——http、tomcat

1. 简述静态网页和动态网页的区别。 2. 简述 Webl.0 和 Web2.0 的区别。 3. 安装tomcat8&#xff0c;配置服务启动脚本&#xff0c;部署jpress应用。 1. 简述静态网页和动态网页的区别。 1&#xff09;、静态网页 &#xff08;1&#xff09;、什么是静态网页 请求响应信息&…

Flink State 和 Fault Tolerance详解

有状态操作或者操作算子在处理DataStream的元素或者事件的时候需要存储计算的中间状态&#xff0c;这就使得状态在整个Flink的精细化计算中有着非常重要的地位&#xff1a; 记录数据从某一个过去时间点到当前时间的状态信息。以每分钟/小时/天汇总事件时&#xff0c;状态将保留…

原型链污染分析

原型链污染问题 原型链原型的继承原型链污染 原型链 原型的继承 先创建一个对象&#xff0c;查看一下属性 const obj { prop1: 111, prop2: 222,} 这里的Object.prototype就是对象的原型。 原型里面有许多的属性&#xff0c;这里面的constructor是我们需要着重关注的。 除此…

在线LaTeX公式编辑器编辑公式

在线LaTeX公式编辑器编辑公式 在编辑LaTex文档时候&#xff0c;需要输入公式&#xff0c;可以使用在线LaTeX公式编辑器编辑公式&#xff0c;其链接为: 在线LaTeX公式编辑器&#xff0c;https://www.latexlive.com/home 图1 在线LaTeX公式编辑器界面 图2 在线LaTeX公式编辑器…

【iOS RunLoop】

文章目录 前言-什么是RunLoop&#xff1f;默认情况下主线程的RunLoop原理 1. RunLoop对象RunLoop对象的获取 CFRunLoopRef源码部分&#xff08;引入线程相关&#xff09; 2. RunLoop和线程3. RunLoop相关的类RunLoop相关类的实现CFRunLoopModeRef五种运行模式CommonModes CFRun…

VBA技术资料MF39:VBA_计算单元格中的字符数

【分享成果&#xff0c;随喜正能量】依赖也好&#xff0c;不依赖也罢&#xff0c;人的心灵都是需要安放的&#xff0c;有人安放在另一个人身上&#xff0c;有人安放在喜欢的事业之上&#xff0c;有人安放在宗教信仰之上&#xff0c;过程不同&#xff0c;终点都一样&#xff0c;…

全面升级:华为鸿蒙HarmonyOS4正式发布,玩趣个性化,小艺AI升级

8月4日新闻&#xff0c;今天下午&#xff0c;华为正式发布了最新版本的鸿蒙操作系统——HarmonyOS 4&#xff01; 在华为发布会上&#xff0c;鸿蒙HarmonyOS迎来了一系列令人激动的功能升级。其中包括个性化空间、多种生产力工具以及增强的手机AI助手"小艺"。这次更…

自动化应用杂志自动化应用杂志社自动化应用编辑部2023年第11期目录

数据处理与人工智能 大数据视域下无轨设备全生命周期健康管理技术的研究 赖凡; 1-3 三维激光扫描结合无人机倾斜摄影在街区改造测绘中的技术应用 张睿; 4-6 井上变电站巡检机器人的设计与应用 刘芳; 7-9 《自动化应用》投稿邮箱&#xff1a;cnqikantg126.com 基于机…

Visual Studio 2022的MFC框架——应用程序向导

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Visual Studio 2022开发工具下的MFC框架知识。 MFC(Microsoft Foundation Class&#xff0c;微软基础类库&#xff09;是微软为了简化程序员的开发工作所开发的一套C类的集合&#xf…

AI 绘画Stable Diffusion 研究(三)sd模型种类介绍及安装使用详解

本文使用工具&#xff0c;作者:秋葉aaaki 免责声明: 工具免费提供 无任何盈利目的 大家好&#xff0c;我是风雨无阻。 今天为大家带来的是 AI 绘画Stable Diffusion 研究&#xff08;三&#xff09;sd模型种类介绍及安装使用详解。 目前&#xff0c;AI 绘画Stable Diffusion的…

深度学习训练营之CGAN生成手势图像

深度学习训练营之CGAN生成手势 原文链接CGAN简单介绍环境介绍前置工作数据导入所需的包加载数据创建数据集查看数据集 模型设置初始化模型的权重定义生成器构造判别器 模型训练定义损失函数设置超参数正式开始训练 结果可视化 原文链接 &#x1f368; 本文为&#x1f517;365天…

Palo Alto Networks® PA-220R 下一代防火墙 确保恶劣工况下的网络安全

一、主要安全功能 1、每时每刻在各端口对全部应用进行分类 • 将 App-ID 用于工业协议和应用&#xff0c;例如 Modbus、 DNP3、IEC 60870-5-104、Siemens S7、OSIsoft PI 等。 • 不论采用何种端口、SSL/SSH 加密或者其他规避技术&#xff0c;都会识别应用。 • 使用…

Apache Flink概述

Flink 是构建在数据流之上的一款有状态的流计算框架&#xff0c;通常被人们称为第三代大数据分析方案 第一代大数据处理方案&#xff1a;基于Hadoop的MapReduce 静态批处理 | Storm 实时流计算 &#xff0c;两套独立的计算引擎&#xff0c;难度大&#xff08;2014年9月&#x…

JavaWeb 项目实现(四) 验证旧密码

1.验证旧密码 步骤很简单&#xff0c;从Session中取到当前密码&#xff0c;和修改密码界面得到的旧密码对比&#xff0c;判断是否相等。 特别之处在于实现用到了Ajax&#xff0c;可以不刷新整个页面的情况下与Web服务器进行通信。 2.Ajax Ajax&#xff08;Asynchronous Java…