Newsletter
C++,Java,Python如何工作
- 编译语言由编译器编译成机器代码。机器代码随后可以由 CPU 直接执行。示例:C、C++、Go
- 像 Java 这样的字节码语言,首先将源代码编译成字节码,然后 JVM 执行程序。有时 JIT(Just-In-Time)编译器会将源代码编译为机器代码以加快执行速度。示例:Java、C#
- 解释型语言不被编译。它们在运行时由解释器解释。示例:Python、Javascript、Ruby
- 一般来说,编译语言比解释语言运行得更快
当在浏览器中输入 URL 时会发生什么?
- 步骤 1:用户在浏览器中输入 URL(www.bytebytego.com)并按 Enter。我们需要做的第一件事是将 URL 转换为 IP 地址。映射通常存储在缓存中,因此浏览器会在多层缓存中查找 IP 地址:浏览器缓存、操作系统缓存、本地缓存和 ISP 缓存。如果浏览器在缓存中找不到该映射,则会请求 DNS(域名系统)解析器进行解析
- 步骤 2:如果在任何缓存中都找不到 IP 地址,则浏览器将前往 DNS 服务器进行递归 DNS 查找,直到找到 IP 地址
- 步骤3:现在我们有了服务器的IP地址,浏览器向服务器发送HTTP请求。为了安全访问服务器资源,我们应该始终使用 HTTPS。它首先通过 TCP 3 次握手与服务器建立 TCP 连接。然后它将公钥发送给客户端。客户端使用公钥加密会话密钥并发送给服务器。服务器使用私钥来解密会话密钥。客户端和服务器现在可以使用会话密钥交换加密数据
- 步骤4:服务器处理请求并发回响应。对于成功的响应,状态代码为 200。响应中有 3 部分:HTML、CSS 和 Javascript。浏览器解析HTML并生成DOM树。它还解析 CSS 并生成 CSSOM 树。然后它结合 DOM 树和 CSSOM 树来渲染树。浏览器将内容呈现并显示给用户
8 种流行的网络协议
1、HTTP(超文本传输协议)
- HTTP 是一种用于获取 HTML 文档等资源的协议。它是 Web 上任何数据交换的基础,是一种客户端-服务器协议
2、HTTP/3
- HTTP/3 是 HTTP 的下一个主要修订版。它运行在 QUIC 上,这是一种专为移动互联网使用而设计的新传输协议。它依赖于 UDP 而不是 TCP,从而实现更快的网页响应。 VR 应用程序需要更多带宽来渲染虚拟场景的复杂细节,并且可能会从迁移到由 QUIC 提供支持的 HTTP/3 中受益
3、HTTPS(安全超文本传输协议)
- HTTPS 扩展了 HTTP 并使用加密来实现安全通信
4、WebSocket
- WebSocket 是一种通过 TCP 提供全双工通信的协议。客户端建立WebSocket来接收来自后端服务的实时更新。与总是 “拉取” 数据的 REST 不同,WebSocket 允许 “推送” 数据。在线游戏、股票交易和消息传递应用程序等应用程序利用 WebSocket 进行实时通信
5、TCP(传输控制协议)
- TCP 旨在通过互联网发送数据包,并确保通过网络成功传送数据和消息。许多应用层协议构建在 TCP 之上
6、UDP(用户数据报协议)
- UDP 直接将数据包发送到目标计算机,无需先建立连接。 UDP 通常用于时间敏感的通信,其中偶尔丢弃数据包比等待更好。语音和视频流量通常使用此协议发送
7、SMTP(简单邮件传输协议)
- SMTP 是一种用于将电子邮件从一个用户传输到另一个用户的标准协议
8、FTP(文件传输协议)
- FTP 用于在客户端和服务器之间传输计算机文件。它具有单独的控制通道和数据通道连接
Token,Cookie,Session
这些术语都与用户身份管理相关。当您登录网站时,您声明您是谁(身份)。您的身份已得到验证(身份验证),并且您被授予必要的权限(授权)。过去已经提出了许多解决方案,并且这个列表还在不断增加
从简单到复杂,以下是对用户身份管理的理解:
- WWW-Authenticate 是最基本的方法。浏览器会要求您输入用户名和密码。由于无法控制登录生命周期,目前很少使用
- 对登录生命周期更精细的控制是session-cookie。服务器维护会话存储,浏览器保存会话的ID。 Cookie 通常仅适用于浏览器,对移动应用程序不友好
- 为了解决兼容性问题,可以使用token。客户端将令牌发送到服务器,服务器验证令牌。缺点是需要对token进行加密和解密,这可能比较耗时
- JWT 是表示令牌的标准方式。该信息可以被验证和信任,因为它是经过数字签名的。由于JWT包含签名,因此不需要在服务器端保存会话信息
- 通过使用 SSO(单点登录),您只需登录一次即可登录多个网站。它使用CAS(中央认证服务)来维护跨站点信息
- 通过使用OAuth 2.0,您可以授权一个网站访问您在另一网站上的信息
REST API 的基础:HTTP
什么是超文本?
- HTTP,即超文本传输协议,其名称来源于 “超文本”
- 想象一下通过超链接的魔力将文本、图像和视频拼接在一起的混合体。这些链接充当门户,允许我们从一组超文本跳转到另一组超文本。 HTML(即超文本标记语言)是超文本的一个主要示例
- HTML 是纯文本文件。它包含许多定义图像、视频等链接的标签。浏览器解释这些标签后,将看似普通的文本文件转变为充满文本和图像的网页
HTTP/1.1、HTTP/2 和 HTTP/3
自 1989 年 0.9 版本问世以来,HTTP 经历了重大变革。让我们回顾一下每个版本的 HTTP 所解决的问题。下图显示了主要改进:
- HTTP/1.0 于 1996 年最终确定并正式记录。该版本有一个关键限制:对同一服务器的每个请求都需要单独的 TCP 连接
- 接下来,HTTP/1.1 于 1997 年问世。它引入了“持久连接”的概念,这意味着 TCP 连接可以保持打开状态以供重用。尽管有这样的增强,HTTP/1.1 仍无法解决 “队头” (HOL) 阻塞问题。简单来说,当浏览器中的所有并行请求槽都被填满时,就会发生 HOL 阻塞,从而迫使后续请求等待直到先前的请求完成
- HTTP/2.0 于 2015 年发布,旨在解决 HOL 阻塞问题。它实现了 “请求多路复用”,这是一种消除应用层 HOL 阻塞的策略。如下图所示,HTTP/2.0 引入了 HTTP “流” 的概念。这种抽象允许将不同的 HTTP 交换复用到同一个 TCP 连接上,使我们无需按顺序发送每个流。然而,HOL 阻塞仍然可能发生在传输 (TCP) 层
- HTTP/3.0 于2020年发布草案首次亮相,定位为 HTTP/2.0 的后继者,以 QUIC 取代TCP作为底层传输协议。这有效地消除了传输层的 HOL 阻塞。 QUIC 基于 UDP。它将流作为传输层的一等公民引入。 QUIC 流共享相同的 QUIC 连接,不需要额外的握手或缓慢启动来创建新的连接。 QUIC 流是独立交付的。这意味着在大多数情况下,一个流中的数据包丢失不会影响其他流
HTTP 标头
- HTTP 标头在客户端和服务器如何发送和接收数据方面发挥着至关重要的作用。它们为这些实体提供了一种结构化的方式来传达有关请求或响应的重要元数据。此元数据可以包含各种信息,例如发送的数据类型、长度、压缩方式等
- HTTP 标头由多个字段组成,每个字段都有特定的作用和含义
HTTP 字段
- Host:这是服务器的域名
- Content-Length:请求或响应标头中的该字段在数据传输中起着至关重要的作用。它具体指示请求或响应正文的大小(以字节为单位)。这有助于接收方了解当前消息何时结束,并为下一条消息做好准备,特别是在通过同一连接发送多个 HTTP 消息的情况下
- Connection:此字段在 HTTP 持久连接中至关重要,其中单个 TCP 连接用于发送和接收多个 HTTP 请求和响应
- Content-type:该字段告诉客户端它正在接收的数据的格式
- Content-encoding:该字段指示数据使用的压缩格式。例如,如果客户端看到 “gzip” 编码,它就知道需要解压缩数据
HTTP GET 与 HTTP POST
HTTP 协议定义了各种方法或 “动词” 来对 Web 资源执行不同的操作。常用的有GET、POST、PUT、DELETE,常用于读取、创建、更新、删除资源。不太常见的方法包括 HEAD、CONNECT、OPTIONS、TRACE 和 PATCH
- HTTP GET:此方法通过 URL 从服务器检索资源,不会产生任何其他效果。由于 GET 请求通常缺少有效负载主体,因此它们支持网页的书签、共享和缓存
- HTTP POST:此方法根据负载主体与资源进行交互。交互根据资源类型而变化。例如,如果我们在购买 iPhone 15 后留下评论,则单击 “提交” 会向服务器发送 POST 请求,并在消息正文中包含评论。虽然 HTTP 协议本身对 POST 请求中消息正文的大小没有明确的限制,但实际上,浏览器和服务器通常会施加自己的限制
HTTP缓存
每个浏览器都实现了其独特的内存缓存系统。通过在本地缓存请求-响应对,数据检索速度更快。虽然缓存实现可能有所不同,但它始于 HTTP 缓存指令:Cache-Control 和 Expires
- Cache-Control 告诉浏览器可以缓存数据多长时间。这是一个相对时间
- Expires 设置数据过期的绝对日期和时间
HTTPS
- HTTP通过网络传输明文,存在信息泄露的风险。 HTTPS(安全超文本传输协议)通过结合 TLS(传输层安全性)或 SSL(安全套接字层)来加密消息,从而降低了这种风险。这意味着任何截获的数据都将是不可读的二进制代码
HTTP 和 HTTPS 有什么区别?
-
建立 HTTP 连接很简单,但 HTTPS 需要在 TCP 3 次握手之后进行 SSL/TLS 握手,然后才能传输加密消息
-
HTTP 的默认端口是 80,HTTPS 的默认端口是 443
-
HTTPS 需要来自 CA(证书颁发机构)的数字证书来验证服务器的可信度
HTTPS 是如何工作的?
- 步骤 1 - 客户端(浏览器)和服务器建立 TCP 连接
- 步骤 2 - 客户端向服务器发送 “客户端问候”。该消息包含一组必要的加密算法(密码套件)及其可以支持的最高 TLS 版本。服务器响应 “服务器问候”,确认算法和 TLS 版本的兼容性。然后,服务器将其 SSL 证书发送给客户端进行验证。证书包含公钥、主机名、到期日期等
- 步骤 3 - 验证 SSL 证书后,客户端生成会话密钥,使用公钥对其进行加密,然后将其发送到服务器。服务器接收加密的会话密钥并使用其私钥对其进行解密
- 步骤 4 - 现在客户端和服务器都拥有相同的会话密钥(对称加密),它们可以在双向通道中安全地交换加密数据
为什么HTTPS改用对称加密进行数据传输?
- 安全性:初次握手后,客户端和服务器都切换到使用共享密钥的对称加密。该密钥是为该特定会话生成的,并且只有客户端和服务器知道。由于该密钥永远不会通过网络传输,因此窃听者几乎不可能获得它。即使攻击者设法解密一个会话的数据,下一个会话也将使用不同的密钥,从而限制潜在的损害
- 效率:对称加密算法的效率明显高于非对称加密算法。非对称加密涉及大量复杂的数学运算,计算成本很高,并且会减慢数据传输速度。对称加密使用简单的操作(如异或和位移位),使其速度更快,更适合加密大量数据
HTTPS 可靠吗?
- 是的,HTTPS 对于保护传输中的数据是可靠的。然而,其可靠性在很大程度上取决于证书颁发机构 (CA) 的可信度和客户端环境的安全性
- Fiddler 等工具通过在客户端和服务器之间创建桥梁来充当 “中间主”(MITM)。它有效地创建了两个独立的 HTTPS 连接:一个与客户端连接,另一个与服务器连接
总结
HTTP 是 RESTful 服务的基础,它利用其简单且广泛使用的请求响应机制来促进浏览器和服务器之间的通信
了解数据库类型
关系数据库
关系数据库基于关系模型,它将数据组织成具有行和列的表。这些数据库由于其强大的一致性、对复杂查询的支持以及对 ACID 属性(原子性、一致性、隔离性、持久性)的遵守,已成为许多应用程序的标准选择。关系数据库的主要特性和优点包括:
- 结构化数据组织:关系数据库中的数据存储在具有预定义架构的表中,从而在整个数据库中强制采用一致的结构。这种组织使得管理和维护数据变得更加容易,特别是在处理大量结构化数据时
- 关系和参照完整性:关系数据库中表之间的关系由主键和外键定义,确保参照完整性。该功能可以高效查询相关数据并支持复杂的数据关系
- SQL 支持:关系数据库使用结构化查询语言 (SQL) 来查询、操作和管理数据。 SQL 是一种功能强大且广泛采用的语言,使开发人员能够执行复杂的查询和数据操作
- 事务和 ACID 属性:关系数据库支持事务,事务是一组整体成功或失败的相关操作。此功能可确保维护 ACID 属性(原子性、一致性、隔离性和持久性),从而保证数据的一致性和完整性
- 索引和优化:关系数据库提供各种索引技术和查询优化策略,有助于提高查询性能并减少资源消耗
关系数据库也有一些缺点:
- 可扩展性有限:水平扩展关系数据库(添加更多节点)可能具有挑战性,特别是与某些专为分布式环境设计的 NoSQL 数据库相比
- 刚性:关系数据库中的预定义模式很难适应不断变化的需求,因为更改模式可能需要对现有数据和应用程序进行重大修改
- 大型数据集的性能问题:随着数据量的增长,关系数据库可能会遇到性能问题,特别是在处理复杂查询和大规模数据操作时
- 对于非结构化或半结构化数据效率低下:关系数据库是为结构化数据设计的,可能不适合管理非结构化或半结构化数据,例如社交媒体数据或传感器数据
流行的关系数据库包括 MySQL、PostgreSQL、Microsoft SQL Server 和 Oracle。每个选项都有其独特的功能、优点和缺点,使其适合不同的用例和要求。在考虑关系数据库时,必须评估应用程序在数据一致性、复杂查询支持和可扩展性等方面的具体需求
NOSQL
NoSQL 数据库的开发是为了应对关系数据库的局限性,特别是在某些条件下的可扩展性、灵活性和性能方面。与关系数据库不同,NoSQL 数据库并不严格遵循关系模型或传统的基于表的存储。它们可以以各种格式存储数据,这使得它们适用于各种用例。 NoSQL 数据库可大致分为四个子类型,每个子类型都有其独特的特征:
- 基于文档的数据库将数据存储在半结构化文档中,例如 JSON 或 BSON。这种格式为数据建模提供了更大的灵活性。它允许更动态的模式,这些模式可以随着应用程序需求的变化而发展。基于文档的数据库非常适合处理分层或嵌套数据结构的应用程序,例如内容管理系统、电子商务平台和分析应用程序。一些流行的基于文档的数据库包括 MongoDB 和 Couchbase
- 基于列的数据库,也称为宽列存储或列族存储,以列而不是行的形式组织数据。这种结构优化了基于列的查询,提供了改进的压缩和更好的读取性能。基于列的数据库专为需要跨多个节点存储和查询大量数据的应用程序而设计,使其成为大数据和分析应用程序以及具有高写入和读取工作负载的应用程序的流行选择。一些著名的基于列的数据库是 Apache Cassandra 和 HBase
- 键值存储提供了一种简单有效的方式将数据存储为键值对。这些数据库非常适合需要高速读写以及水平可扩展性的用例。键值存储可以用作缓存层、会话存储或配置存储等。它们通常用于对性能和低延迟数据访问至关重要的应用程序,例如游戏平台、实时分析系统和推荐引擎。流行的键值存储示例包括 Redis 和 Amazon DynamoDB
- 图数据库专注于将数据存储为图中的节点和边。它可以有效处理复杂的关系、遍历和基于图的算法。这种类型的数据库对于涉及实体之间复杂关系的应用程序特别有用,例如社交网络、欺诈检测系统和推荐引擎。图形数据库提供了强大的查询功能,用于遍历和分析互连数据,使其成为这些用例的有吸引力的选择。 Neo4j 和 Amazon Neptune 是图形数据库的示例
值得注意的是,NoSQL 数据库有其自身的一系列弱点:
- 缺乏标准化:与遵循标准化 SQL 查询语言的关系数据库不同,NoSQL 数据库通常使用自己的查询语言或 API。在不同 NoSQL 数据库之间迁移或与其他系统集成时,这可能会导致学习曲线增加和困难
- 一致性较弱:许多 NoSQL 数据库采用最终一致性模型来实现更高的性能和可用性。虽然这可能适合某些应用程序,但在需要严格数据一致性的情况下可能会导致问题
- 对复杂查询和事务的支持有限:某些 NoSQL 数据库(例如键值存储和基于列的数据库)并不是为复杂查询或多记录事务而设计的。这使得直接在数据库中实现某些业务逻辑或报告要求变得具有挑战性
每个 NoSQL 子类型都有其优点和缺点,使它们根据具体要求适合不同的应用程序。在考虑 NoSQL 数据库时,重要的是评估应用程序在可扩展性、数据建模、查询模式和性能方面的具体需求,以确定最适合的数据库
NewSQL
NewSQL 数据库是一种结合了关系数据库和 NoSQL 数据库优势的现代方法。它们维护关系模型、ACID 属性和 SQL 支持,同时提供通常与 NoSQL 数据库相关的改进的可扩展性、分布式架构和性能增强。 NewSQL 数据库旨在解决现代应用程序的挑战,例如处理大规模、分布式和高度并发的工作负载,而不牺牲数据的一致性和完整性
- 分布式架构:NewSQL数据库是分布式的。他们利用跨多个节点甚至数据中心的数据分区和复制。该架构具有更好的容错能力、高可用性和全球规模
- 可扩展性:NewSQL 数据库可以水平扩展。它们通过向系统添加更多节点来适应增加的工作负载。此功能使它们适合需要强一致性并能够处理大量事务或用户的应用程序
- 并发控制:NewSQL数据库使用先进的并发控制机制,例如多版本并发控制(MVCC)或乐观并发控制。这些机制允许有效地处理大量同时发生的事务。这对于具有高并发要求的现代应用程序至关重要
- SQL 支持和兼容性:NewSQL 数据库保留了用于查询和操作数据的熟悉的 SQL 语言,简化了开发人员的学习曲线。它们通常提供与现有关系数据库和工具的兼容性,从而简化迁移过程
考虑 NewSQL 的缺点很重要:
- 复杂性:与传统关系数据库相比,NewSQL 数据库的分布式架构和高级功能会在配置、维护和故障排除方面带来额外的复杂性
- 供应商锁定:某些 NewSQL 数据库由特定供应商作为托管服务提供,这可能会导致供应商锁定并限制切换供应商的灵活性
- 缺乏成熟度:作为一项相对较新的技术,NewSQL 数据库可能缺乏传统关系数据库的成熟度和广泛的生态系统,这可能导致支持、文档和社区资源有限
流行的 NewSQL 数据库包括 CockroachDB、Google Spanner 和 TiDB。每个选项都提供独特的特性和功能,使其适合不同的用例和要求。在考虑 NewSQL 数据库时,必须评估应用程序在可扩展性、数据一致性、性能和开发人员熟悉程度方面的具体需求,以确定最适合的数据库
Time-series
时间序列数据库专门处理带时间戳的数据,其特点是顺序性和基于时间的排序。时间序列数据在金融市场、物联网和监控系统等各个领域都很常见。这些数据库旨在优化带时间戳的数据的存储、检索和分析。它们提供专门针对时间序列数据带来的独特挑战的功能
- 高写入和查询性能:时序数据库针对处理高速数据流进行了优化,这需要高效的写入性能。它们还提供快速查询性能,允许对时间序列数据进行实时或近实时分析
- 数据压缩:由于时序工作负载生成的数据量很大,时序数据库使用各种数据压缩技术来降低存储需求并提高查询性能
- 基于时间的数据保留策略:时间序列数据库可以轻松管理基于时间的数据保留策略。此功能允许自动数据老化,有助于保持存储效率并确保数据相关性
- 内置时序函数:时序数据库通常包含内置函数和工具,以方便时序数据分析,例如聚合、下采样和预测。这些函数简化了处理时间序列数据的过程,可以帮助开发人员构建更高效的应用程序
- 可扩展性:时间序列数据库旨在水平扩展,使其能够处理大量数据和高摄取率。此功能对于需要存储和分析大量时间序列数据的应用程序(例如物联网应用程序或监控系统)至关重要
流行的时间序列数据库包括 InfluxDB 和 TimescaleDB。这些选项中的每一个都提供了针对时间序列数据管理和分析而定制的独特特性和功能,使其适合不同的用例和要求。在考虑时序数据库时,必须评估应用程序在数据摄取率、查询性能、数据保留和可扩展性方面的具体需求
为了比较数据库类型及其用例,我们必须考虑各种因素,例如它们处理的数据类型、可扩展性、性能、一致性和复杂性。例如,关系数据库通常更适合需要严格数据一致性和复杂查询的应用,而NoSQL数据库更适合处理大量非结构化数据或需要高扩展性的项目
你知道多少种 API 架构分格?
架构风格定义了应用程序编程接口 (API) 的不同组件如何相互交互。因此,它们通过提供设计和构建 API 的标准方法来确保效率、可靠性以及与其他系统集成的便捷性。以下是最常用的样式:
- SOAP
- 成熟、全面、基于 XML
- 最适合企业应用
- RESTful
- 流行的、易于实现的 HTTP 方法
- 网络服务的理想选择
- GraphQL
- 查询语言,请求特定数据
- 减少网络开销,加快响应速度
- gRPC
- 现代、高性能协议缓冲区
- 适合微服务架构
- WebSocket
- 实时、双向、持久连接
- 非常适合低延迟数据交换
- Webhook
- 事件驱动、HTTP 回调、异步
- 事件发生时通知系统
解释 9 种 API 测试
- 烟雾测试:这是在 API 开发完成后完成的。只需验证 API 是否正常工作并且没有出现任何问题
- 功能测试:这将根据功能需求创建测试计划,并将结果与预期结果进行比较
- 集成测试:该测试结合了多个 API 调用来执行端到端测试。测试业务内通信和数据传输
- 回归测试:此测试可确保错误修复或新功能不会破坏 API 的现有行为
- 负载测试:这通过模拟不同的负载来测试应用程序的性能。然后我们就可以计算出应用程序的容量
- 压力测试:我们故意给API创建高负载,并测试API是否能够正常运行
- 安全测试:这将针对所有可能的外部威胁测试 API
- 用户界面测试:这会测试 UI 与 API 的交互,以确保数据可以正确显示
- 模糊测试:这会将无效或意外的输入数据注入 API 并尝试使 API 崩溃。通过这种方式,它可以识别API漏洞
API VS SDK
API(应用程序编程接口)和 SDK(软件开发工具包)是软件开发领域的重要工具,但它们具有不同的用途
API(应用程序编程接口)
API 是一组规则和协议,允许不同的软件应用程序和服务相互通信
- 它定义了软件组件如何交互
- 促进软件组件之间的数据交换和功能访问
- 通常由端点、请求和响应组成
SDK(软件开发工具包)
SDK 是一个包含工具、库、示例代码和文档的综合包,可帮助开发人员为特定平台、框架或硬件构建应用程序
- 提供更高级别的抽象,简化特定平台的开发
- 针对特定平台或框架量身定制,确保该平台上的兼容性和最佳性能
- 提供对特定于平台的高级特性和功能的访问,否则从头开始实施可能会具有挑战性
如何提高 API 性能
- 分页:当结果很大时,这是一种常见的优化。结果会流回客户端以提高服务响应能力
- 异步日志记录:同步日志记录每次调用都会处理磁盘,并且会降低系统速度。异步日志记录首先将日志发送到无锁缓冲区并立即返回。日志将定期刷新到磁盘。这显着减少了 I/O 开销
- 缓存:可以将经常访问的数据缓存到缓存中。客户端可以先查询缓存,而不是直接访问数据库。如果缓存未命中,客户端可以从数据库中查询。像 Redis 这样的缓存将数据存储在内存中,因此数据访问比数据库要快得多
- 有效负载亚缩:可以使用 gzip 等压缩请求和响应,以便传输的数据大小小得多。这可以加快上传和下载速度
- 连接池:在访问资源时,我们经常需要从数据库加载数据。打开正在关闭的数据库连接会增加大量开销。因此,我们应该通过打开的连接池连接到数据库。连接池负责管理连接生命周期
解释对象存储的 6 大用例
什么是对象存储?
- 对象存储使用对象来存储数据。与使用分层结构存储文件的文件存储或将文件划分为大小相等的块的块存储相比,对象存储将元数据与对象一起存储。典型产品包括AWS S3、Google Cloud Storage和Azure Blob Storage
案例一:数据归档
- 随着业务数据量的不断增长,我们无法将所有数据都存储在核心存储系统中。我们需要有分层的存储计划。对象存储可用于存档用于审计或客户端语句的旧数据。这是一种具有成本效益的方法
案例2:非结构化数据存储
- 我们经常需要处理非结构化数据或半结构化数据。过去,它们通常以 blob 的形式存储在关系数据库中,效率相当低。对象存储非常适合音乐、视频文件和文本文档。 Spotify 或 Netflix 等公司使用对象存储来保存其媒体文件
案例三:云原生存储
- 对于云原生应用来说,我们需要数据存储系统具有灵活性和可扩展性。主要公共云提供商可以轻松通过 API 访问其对象存储产品,并可用于经济的存储选择
案例4:数据湖
- 分布式系统中有多种类型的数据。对象存储支持的数据湖为不同业务线提供了一个转储数据以供以后分析或机器学习的好地方。对象存储的高效读写有助于数据处理管道中的更多步骤,包括 ETL(提取-转换-加载)或构建数据仓库
案例5:物联网(IoT)
- 物联网传感器产生各种数据。对象存储可以存储这种类型的时间序列,然后对其运行分析或人工智能算法。主要公共云提供商提供将原始物联网数据提取到对象存储中的管道
案例六:备份与恢复
- 对象存储可用于存储数据库或文件系统备份。稍后,可以加载备份以进行快速恢复。这提高了系统的可用性
Kafka 5 大用例
与它的前辈不同,Kafka 不仅仅是一个消息队列,它还是一个适用于各种情况的开源事件流平台
- 日志处理与分析:上图显示了典型的 ELK(Elastic-Logstash-Kibana)堆栈。 Kafka 有效地从每个实例收集日志流。 ElasticSearch 使用来自 Kafka 的日志并为其建立索引。 Kibana 在 ElasticSearch 之上提供了搜索和可视化 UI
- 推荐中的数据流:像亚马逊这样的电子商务网站使用过去的行为和相似的用户来计算产品推荐。上图展示了推荐系统的工作原理。 Kafka 传输原始点击流数据,Flink 对其进行处理,模型训练则使用来自数据湖的聚合数据。这使得能够持续改进每个用户的推荐的相关性
- 系统监控和警报:与日志分析系统类似,我们需要收集系统指标以进行监控和故障排除。区别在于指标是结构化数据,而日志是非结构化文本。指标数据发送到 Kafka 并在 Flink 中聚合。聚合数据由实时监控仪表板和警报系统(例如 PagerDuty)使用
- CDC(更改数据捕获):更改数据捕获 (CDC) 将数据库更改流式传输到其他系统以进行复制或缓存/索引更新。例如,在下图中,事务日志发送到 Kafka 并由 ElasticSearch、Redis 和辅助数据库摄取
- 系统迁移:升级遗留服务具有挑战性——旧的语言、复杂的逻辑和缺乏测试。我们可以通过利用消息传递中间件来降低风险。在上图中,为了升级下图中的订单服务,我们更新旧的订单服务以使用来自 Kafka 的输入并将结果写入 ORDER 主题。新订单服务使用相同的输入并将结果写入 ORDERNEW 主题。调节服务比较 ORDER 和 ORDERNEW。如果它们相同,则新服务通过测试
数据无处不在,但常用的数据术语你都知道吗?
- 数据仓库:来自各种来源的集成数据的大型结构化存储库,用于复杂的查询和历史分析
- 数据集市:数据仓库的更集中、特定于部门的子集,提供快速数据检索和分析
- 数据湖:以本机格式存储的大量原始非结构化数据,直到需要使用为止
- Delta Lake:一个开源存储层,为数据湖带来可靠性和 ACID 事务,统一批处理和流数据处理
- 数据管道:将数据从一个系统移动和转换到另一个系统的过程,通常用于填充数据仓库和数据湖
- 数据网格:一种架构和组织方法,其中数据所有权和交付分散在特定领域的跨职能团队中
Slack 消息的旅程是怎样的?
- 由于通道数量过多,通道服务器(CS)使用一致性哈希将数百万个通道分配给许多通道服务器
- Slack 消息通过 WebApp 和管理服务器传递到正确的通道服务器
- Channel Server 通过 Gate Server 和 Envoy(代理)将消息推送给消息接收者
- 消息接收方使用WebSocket,这是一种双向消息传递机制,因此它们能够实时接收更新
Slack 消息会经过五个重要服务器:
- WebApp:定义 Slack 客户端可以使用的 API
- 管理服务器(AS):使用通道 ID 查找正确的通道服务器
- Channel Server(CS):维护消息通道的历史记录
- 网关服务器(GS):部署在每个地理区域。维护 WebSocket 通道订阅
- Envoy:云原生应用程序的服务代理
为什么 Nginx 被称为 “反向” 代理?
正向代理
- 正向代理是位于用户设备和互联网之间的服务器
正向代理通常用于:
- 保护客户
- 避免浏览限制
- 阻止访问某些内容
反向代理
- 反向代理是一种服务器,它接受客户端的请求,将请求转发到 Web 服务器,并将结果返回给客户端,就好像代理服务器已经处理了请求一样
反向代理适用于:
- 保护服务器
- 负载均衡
- 缓存静态内容
- 加密和解密 SSL 通信
Docker 与 Kubernetes 应该使用哪一个?
什么是 Docker?
- Docker 是一个开源平台,允许您在隔离的容器中打包、分发和运行应用程序。它专注于容器化,提供封装应用程序及其依赖项的轻量级环境
什么是 Kubernetes?
- Kubernetes,通常称为 K8s,是一个开源容器编排平台。它提供了一个框架,用于跨节点集群自动部署、扩展和管理容器化应用程序
两者有何不同?
Docker:
-
Docker 在单个操作系统主机上的单个容器级别上运行
-
必须手动管理每个主机,并且为多个相关容器设置网络、安全策略和存储可能很复杂
Kubernetes:
- Kubernetes 在集群级别运行。它管理跨多个主机的多个容器化应用程序,为负载平衡、扩展和确保应用程序的所需状态等任务提供自动化
简而言之,Docker 专注于容器化和在单个主机上运行容器,而 Kubernetes 专注于跨主机集群大规模管理和编排容器
Git VS Github
- 首先,认识一下 Git,它是开发人员的基本工具。它在本地运行,允许您跟踪代码中的更改,就像拍摄项目进度的快照一样。这使得与您的团队的协作变得轻而易举,即使您正在处理同一个项目
- 现在,我们来谈谈 GitHub。它不仅仅是一个平台;它是在线托管 Git 存储库的强大工具。通过 GitHub,您可以简化团队协作和代码共享
公司如何将代码交付到生产环境?
- 步骤 1:该流程从产品负责人根据需求创建用户故事开始
- 步骤 2:开发团队从待办事项列表中选取用户故事,并将其放入为期两周的开发周期的冲刺中
- 步骤3:开发人员将源代码提交到代码存储库 Git 中
- 步骤4:在 Jenkins 中触发构建。源代码必须通过 SonarQube 中的单元测试、代码覆盖率阈值和门
- 步骤5:构建成功后,构建结果将存储在 artifactory 中。然后将构建部署到开发环境中
- 步骤6:可能有多个开发团队致力于不同的功能。这些功能需要独立测试,因此部署到 QA1 和 QA2
- 步骤 7:QA 团队选择新的 QA 环境并执行 QA 测试、回归测试和性能测试
- 步骤 8:一旦 QA 构建通过 QA 团队的验证,它们就会被部署到 UAT 环境中
- 步骤 9:如果 UAT 测试成功,构建版本将成为候选版本,并将按计划部署到生产环境
- 步骤10:SRE(站点可靠性工程)团队负责产品监控