系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第一部分:通信协议(1)

news2024/11/8 0:48:04

本心、输入输出、结果

文章目录

  • 系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第一部分:通信协议(1)
    • 前言
      • 通信协议
      • REST API vs. GraphQL 对比
        • GraphQL
      • gRPC 运行原理
        • 步骤说明
      • 什么是 WebHook (网络钩子)
      • 如何提升 API 性能
        • 分页
        • 异步日志记录
        • 缓存
        • 有效负载压缩
        • 连接池
      • HTTP 1.0 -> HTTP 1.1 -> HTTP 2.0 -> HTTP 3.0 (QUIC)
      • 弘扬爱国精神

系统设计 - 我们如何通俗的理解那些技术的运行原理 - 第一部分:通信协议(1)


编辑:简简单单 Online zuozuo
地址:https://blog.csdn.net/qq_15071263

在这里插入图片描述

前言

我们使用视觉效果和简单术语来解释复杂的系统是如何运转的,帮助我们理解技术细节

我们使用视觉效果和简单术语来解释复杂的系统是如何运转的,帮助我们理解技术细节

在这里插入图片描述

通信协议

软件体系结构风格定义应用程序编程接口 (API) 的不同组件如何相互交互。因此,它们通过提供设计和构建 API 的标准方法来确保效率、可靠性和与其他系统的轻松集成。

以下是常见的形式

在这里插入图片描述

在这里插入图片描述

REST API vs. GraphQL 对比

下图显示了 REST 和 GraphQL 之间的比较

在这里插入图片描述

GraphQL

GraphQL 是由 Meta 开发的 API 查询语言。它提供了 API 中数据的完整描述,并让客户能够准确询问他们需要什么。

GraphQL 服务器位于客户端和后端服务之间。 GraphQL 可以将多个 REST 请求聚合到一个查询中。GraphQL 服务器在图形中组织资源。

GraphQL 支持查询、突变(将数据修改应用于资源)和订阅(接收有关模式修改的通知)

在这里插入图片描述

gRPC 运行原理

gRPC 运行原理

在这里插入图片描述

步骤说明

RPC(远程过程调用)之所以称为“远程”,是因为当服务部署到微服务体系结构下的不同服务器时,它支持远程服务之间的通信。从用户的角度来看,它的作用类似于本地函数调用。

下图说明了 gRPC 的整体数据流。

第 1 步:从客户端进行 REST 调用。请求正文通常采用 JSON 格式。

步骤 2 - 4:订单服务(gRPC 客户端)接收 REST 调用,对其进行转换,并对付款服务进行 RPC 调用。gPRC 将客户端存根编码为二进制格式,并将其发送到低级传输层。

第 5 步:gRPC 通过 HTTP2 通过网络发送数据包。由于二进制编码和网络优化,据说 gRPC 比 JSON 快 5 倍。

步骤 6 - 8:支付服务(gRPC 服务器)从网络接收数据包,对其进行解码,然后调用服务器应用程序。

步骤 9 - 11:结果从服务器应用程序返回,并被编码并发送到传输层。

步骤 12 - 14:订单服务接收数据包,对其进行解码,并将结果发送到客户端应用程序

在这里插入图片描述

什么是 WebHook (网络钩子)

我们先看看轮询和 WebHook 的对比

在这里插入图片描述

假设我们运行一个电子商务网站。客户端通过 API 网关将订单发送到订单服务,该网关转到支付服务进行支付交易。然后,支付服务与外部支付服务提供商 (PSP) 交谈以完成交易。

有两种方法可以处理与外部PSP的通信。

1、短轮询

向PSP发送付款请求后,付款服务会不断向PSP询问付款状态。经过几轮比赛,PSP终于以状态回归。

短轮询有两个缺点:

  • 状态的持续轮询需要支付服务的资源。
  • 外部服务直接与支付服务通信,从而产生安全漏洞。

2、网络钩子

我们可以向外部服务注册一个网络钩子。这意味着:当您对请求有更新时,请通过某个 URL 给我回电。当PSP完成处理后,它将调用HTTP请求来更新付款状态。

通过这种方式,编程范式发生了变化,支付服务不再需要浪费资源来轮询支付状态。

如果PSP从不回电怎么办?我们可以设置一个家政工作,每小时检查一次付款状态。

Webhook 通常被称为反向 API 或推送 API,因为服务器向客户端发送 HTTP 请求。使用网络钩子时,我们需要注意 3 件事:

  • 我们需要为外部服务设计一个合适的 API。
  • 出于安全原因,我们需要在 API 网关中设置适当的规则。
  • 我们需要在外部服务中注册正确的 URL。

在这里插入图片描述

如何提升 API 性能

我们可以参考如图所示的 5 个技巧

在这里插入图片描述

分页

当结果的大小很大时,这是常见的优化。结果将流式传输回客户端,以提高服务响应能力。

异步日志记录

同步日志记录处理每个调用的磁盘,并可能降低系统速度。异步日志记录首先将日志发送到无锁缓冲区,然后立即返回。日志将定期刷新到磁盘。这大大降低了 I/O 开销。

缓存

我们可以将经常访问的数据缓存到缓存中。客户端可以先查询缓存,而不是直接访问数据库。如果缓存未命中,客户端可以从数据库进行查询。像 Redis 这样的缓存将数据存储在内存中,因此数据访问比数据库快得多。

有效负载压缩

请求和响应可以使用gzip等进行压缩,以便传输的数据大小要小得多。这样可以加快上传和下载速度。

连接池

在访问资源时,我们经常需要从数据库中加载数据。打开关闭的数据库连接会增加大量开销。因此,我们应该通过开放连接池连接到数据库。连接池负责管理连接生命周期。

在这里插入图片描述

HTTP 1.0 -> HTTP 1.1 -> HTTP 2.0 -> HTTP 3.0 (QUIC)

让我们了解一下每一代的 HTTP 都做了什么事情

  • HTTP 1.0于1996年完成并完整记录。对同一服务器的每个请求都需要单独的 TCP 连接。
  • HTTP 1.1 发布于 1997 年。TCP 连接可以保持打开状态以供重用(持久连接),但它不能解决 HOL(行头)阻塞问题。
  • HOL 阻塞 - 当浏览器中允许的并行请求数用完时,后续请求需要等待前一个请求完成。
  • HTTP 2.0 于 2015 年发布。它通过请求多路复用解决了 HOL 问题,从而消除了应用层的 HOL 阻塞,但 HOL 仍然存在于传输 (TCP) 层。
  • 正如你在图中所看到的,HTTP 2.0引入了HTTP“流”的概念:一种抽象,允许将不同的HTTP交换多路复用到同一个TCP连接上。每个流不需要按顺序发送。
  • HTTP 3.0 初稿于 2020 年发布。它是HTTP 2.0的后继者。它使用 QUIC 而不是 TCP 作为底层传输协议,从而消除了传输层中的 HOL 阻塞

QUIC基于UDP。它将流作为一等公民引入传输层。QUIC 流共享相同的 QUIC 连接,因此不需要额外的握手和缓慢启动来创建新流,但 QUIC 流是独立交付的,因此在大多数情况下,影响一个流的数据包丢失不会影响其他流

在这里插入图片描述

弘扬爱国精神

在这里插入图片描述

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

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

相关文章

[HCTF 2018] Hide and seek(buuctf),Unzip(ctfshow)

考核完对python软连接还是不熟悉&#xff0c;把这两道题在做一下 [HCTF 2018]Hideandseek 登录注册之后发现可以上传文件&#xff0c;随便上传一个 回显说不是zip文件 上传一个zip文件&#xff0c;发现他会自动解析 上传了一个 GIF89a <?php eval($_POST[zxc]); ?> …

mstsc改端口为33389

windows 远程默认端口3389不太安全&#xff0c;改成33389防下小人 把下面的2个文本存在后缀.reg的文件&#xff0c;双击导入注册表&#xff0c;"PortNumber"dword:0000826d 这个就是33389对应的端口号的16进制值&#xff0c;要想自己改成其它的换下值即可 Windows …

什么是超融合?超融合基础架构的本质是什么?

近年来各个行业对超融合&#xff08;Hyperconverged Infrastructure, 简称 HCI&#xff09;的关注度越来越高&#xff0c;但各家厂商的超融合架构实现方法各有不同。我们在这里不评判对错&#xff0c;也不去探究这些是不是真正的超融合&#xff0c;而是重新追本溯源&#xff0c…

jenkins 原理篇——pipeline流水线 声明式语法详解

大家好&#xff0c;我是蓝胖子&#xff0c;相信大家平时项目中或多或少都有用到jenkins&#xff0c;它的piepeline模式能够对项目的发布流程进行编排&#xff0c;优化部署效率&#xff0c;减少错误的发生&#xff0c;如何去写一个pipeline脚本呢&#xff0c;今天我们就来简单看…

行业追踪,2023-10-20

自动复盘 2023-10-20 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

Note——torch.size() umr_maximum() array.max() itertools.product()

torch.size Problem TypeError: ‘torch.Size’ object is not callable Reason Analysis torch.Size函数不可调用 因为torch只可以.size() 或 shape Solution 将y.shape()替换为y.size() 或 y.shape ytorch.normal(0,0.01,y.size())2 return umr_maximum(a, axis, None…

那些你面试必须知道的ES6知识点

目录 1、var、let、const的区别2、作用域考题3、合并两个对象4、箭头函数和普通函数的区别5、Promise有几种状态6、find和filter的区别7、some和every的区别 1、var、let、const的区别 区别一&#xff1a; var有变量提升&#xff0c;而let和const没有 <script>console.l…

英伟达禁售?FlashAttention助力LLM推理速度提8倍

人工智能领域快速发展&#xff0c;美国拥有强大的AI芯片算力&#xff0c;国内大部分的高端AI芯片都是采购英伟达和AMD的。而为了阻止中国人工智能领域发展&#xff0c;美国频繁采取出口管制措施。10月17日&#xff0c;美国拜登突然宣布&#xff0c;升级芯片出口禁令。英伟达限制…

【openwrt学习笔记】Dying Gasp功能和pstore功能的配置(高通 ipq95xx)

目录 一、Dying Gasp信号1.1 概念1.2 实现原理 二、pstore 功能2.1 概念2.2 实现原理 三、openwrt中开启pstore功能3.1 软硬件参数3.2 各文件修改3.2.1 defconfig3.2.2 dts(ipq9574-default-memory.dtsi)3.2.3 fs/pstore/ram.c 四、测试4.1 挂载4.2 触发命令和效果 参考资料&am…

cocos creator 在网页中调试的时候直接代码调试方法

cocos creator 在网页中调试的时候直接代码调试方法

数据结构───顺序表(梦开始的地方)

从一个编程小白到入门&#xff0c;大学选的软件工程&#xff0c;从大一开始就没有真正的了解这个专业&#xff0c;更别说以后的发展方向。活了几十年&#xff0c;也不知道自己究竟要成为一个什么样的人。似乎在大二的某一天&#xff0c;忽然意识到我不该如此庸碌下去&#xff0…

对话 L2 潜力新星 Mantle:模块化理念推动生态可持续建设

作为一个由 DAO 主导实现快速增长&#xff0c;致⼒推动⼤众应⽤与数字虚拟资产治理技术—— Mantle 如何凭借模块化设计理念、可扩展性技术优势、高效能数据处理机制在 Layer2 版图中成长为新晋潜力项目&#xff1f;从测试网到主网上线&#xff0c;Mantle 经历了数个技术更新阶…

【(数据结构)— 双向链表的实现】

&#xff08;数据结构&#xff09;— 双向链表的实现 一.双向链表的结构二. 双向链表的实现2.1 头文件 ——双向链表的创建及功能函数的定义2.2 源文件 ——双向链表的功能函数的实现2.3 源文件 ——双向链表功能的测试2.4 双向链表各项功能测试运行展示2.4.1 双向链表的初始化…

发现一不错的编程助手 Amazon CodeWhisperer

Amazon CodeWhisperer 是一款 AI 编程助手&#xff0c;旨在为开发人员提供智能化的编程辅助工具。作为一款基于人工智能的编程助手&#xff0c;CodeWhisperer 的目标是提高开发人员的生产效率、降低开发成本&#xff0c;并提供高质量的编程解决方案。 1.安装过程参考官网 htt…

C++11函数适配器bind() --- C++11新语法bind() 你了解多少?什么是适配器???

文章目录 1.介绍头文件定义原型 2.引入2.1现有语法无法解决2.2bind的文档阅读2.3bind()绑定函数对于2.1问题的解决 1.介绍 头文件 #include <functional> 定义 bind函数定义在头文件中&#xff0c;是一个函数模板&#xff0c;它就像一个函数包装器(适配器)&#xff0c…

苹果 AirPods Pro 2 耳机新固件(6A305)

苹果公司对采用 Lightning 端口和 USB-C 端口的 AirPods Pro 2 耳机&#xff0c;推出了内部编号为 6A305 的全新固件&#xff0c;高于 10 月 10 日发布的 6A303 更新。用户无需手动更新&#xff0c;只需将 AirPods 通过蓝牙连接到 iPhone &#xff0c;此时便会自动安装新的固件…

甄知科技张礼军:数智化转型助企业破茧成蝶!

数智化浪潮滚滚向前&#xff0c;正席卷各行各业&#xff0c;带领企业从数字化时代跨入数智化时代。可什么是数智化&#xff1f;如何实现数智化转型&#xff1f;已经成为横亘在无数企业面前的大难题&#xff01; 事实上&#xff0c;数智化是数字化、AI和业务三个要素的交集&…

SQLServe联合主键、联合索引、唯一索引,聚集索引,和非聚集索引、主键、唯一约束和外键约束、索引运算总结

联合主键 SQL server 中给表增加联合主键的两种方法 第一种方法&#xff0c;新建表时增加联合主键&#xff1a; create table t_students(id int not null,name varchar(10) not null Primary Key (id, name),age int,dept_id int )注&#xff1a;联合主键的列需要限制非空约…

操作系统【OS】系统调用

系统调用 定义 操作系统对应用程序和程序员提供的接口用户程序执行陷入指令&#xff08;Trap或访管指令&#xff09;来发起系统调用&#xff0c;请求操作系统提供服务OS 通过提供系统调用避免用户程序直接访问外设【应用程序通过系统调用使用OS的设备管理服务】操作系统不同, …

弹出框,使用树结构查询数据

效果如下: 描述:希望点击某个按钮,弹出一个窗口,然后通过下拉框,点击下拉框里面的组织信息,然后查询对应组织的成员对象列表,并展示到表格中 HTML代码(最主要的就是树的那个): <el-dialog :visible.sync="TesteePage.showDialog" width="70%&quo…