本周系统设计复习:

  • API 安全前 12 大技巧
  • 当你在浏览器中输入 google.com 时会发生什么?
  • 基础设施即代码景观速查表
  • 为什么 Kafka 快?
  • 架构可扩展性速成课程

API 安全前 12 大技巧

  1. 使用 HTTPS
  2. 使用 OAuth2
  3. 使用 WebAuthn
  4. 使用分级 API 密钥
  5. 授权
  6. 速率限制
  7. API 版本控制
  8. 白名单
  9. 检查 OWASP API 安全风险
  10. 使用 API 网关
  11. 错误处理
  12. 输入验证

当你在浏览器中输入 google.com 时会发生什么?

  1. 首先,你在浏览器的地址栏中输入网站地址。

  2. 浏览器首先检查其缓存。 如果有缓存未命中,它必须找到 IP 地址。

  3. DNS 查找开始(想象成查找电话号码)。请求经过不同的 DNS 服务器(根、TLD 和权威)。最后,检索到 IP 地址。

  4. 接下来,你的浏览器像握手一样发起 TCP 连接。 例如,在 HTTP 1.1 的情况下,客户端和服务器执行 TCP 三次握手,带有 SYN、SYN-ACK 和 ACK 消息。

  5. 一旦握手成功,浏览器向服务器发出 HTTP 请求,服务器响应 HTML、CSS 和 JS 文件。

  6. 最后,浏览器处理一切。 它解析 HTML 文档并创建 DOM 和 CSSOM 树。

  7. 浏览器执行 JavaScript 并通过各种步骤渲染页面(分词器、解析器、渲染树、布局和绘制)。

  8. 最后,网页出现在你的屏幕上。

基础设施即代码景观

可扩展的基础设施配置提供几个与可用性、可扩展性、可重复性和成本效益相关的好处。

但你如何实现这个?

使用代码配置基础设施是 scalable infra 管理的关键。

有多个策略可以帮助:

1. 容器化(Containerization)

这是使基于代码的应用部署的第一个策略之一。Docker 是容器化应用最流行的方式之一。

2. 容器编排(Container Orchestration)

接下来,当处理应用中的多个容器时,容器编排变得必要。这就是像 Kubernetes 这样的容器编排工具变得重要的地方。

3. 基础设施即代码(IaC)

IaC 将基础设施配置和配置视为代码,允许开发者在可以版本化、测试和重用的文件中定义应用基础设施。流行工具如 Terraform、AWS CloudFormation 和 Ansible 可以使用。Ansible 更多是配置工具。

4. GitOps

GitOps 利用 Git 工作流结合 CI/CD 自动化基础设施和配置更新。

为什么 Kafka 快?

有许多设计决策促成了 Kafka 的性能。在这篇文章中,我们将专注于两个。我们认为这两个最重要。

1. Kafka 依赖顺序 I/O

第一个是 Kafka 依赖顺序 I/O。

2. 零拷贝原则

给予 Kafka 性能优势的第二个设计选择是它专注于效率:零拷贝原则。

下图说明了数据如何在生产者和消费者之间传输,以及零拷贝意味着什么。

步骤 1.1-1.3:生产者将数据写入磁盘

步骤 2:消费者读取数据,无零拷贝

  • 2.1:数据从磁盘加载到 OS 缓存
  • 2.2:数据从 OS 缓存复制到 Kafka 应用
  • 2.3:Kafka 应用将数据复制到套接字缓冲区
  • 2.4:数据从套接字缓冲区复制到网卡
  • 2.5:网卡发送数据出去给消费者

步骤 3:消费者读取数据,使用零拷贝

  • 3.1:数据从磁盘加载到 OS 缓存
  • 3.2:OS 缓存通过 sendfile() 命令直接将数据复制到网卡
  • 3.3:网卡发送数据出去给消费者

零拷贝是节省应用上下文和内核上下文之间多次数据复制的捷径。

架构可扩展性

可扩展性是系统处理增加的工作负载而不失去性能的能力。

然而,我们也可以从扩展策略的角度看可扩展性。

可扩展性是系统通过重复应用成本效益策略处理增加工作负载的能力。这意味着如果扩展策略在财务上不可行,可能很难超过某一点扩展系统。

可扩展性的三个主要瓶颈

  1. 集中式组件:这可能成为单点故障
  2. 高延迟组件:这些是执行耗时操作的组件
  3. 紧密耦合:使组件难以扩展

因此,要构建可扩展系统,我们应该遵循无状态、松散耦合和异步处理的原则。

一些提高可扩展性的常用技术如下:

  1. 负载均衡:在多个服务器之间分散请求,防止单个服务器成为瓶颈。
  2. 缓存:将最常请求的信息存储在内存中。
  3. 事件驱动处理:使用异步处理方法处理长时间运行的任务。
  4. 分片:将大数据集分成称为分片的更小子集以实现水平可扩展性。

本文为学习目的的个人翻译,译文仅供参考。

原文链接:EP145: Infrastructure as Code Landscape

版权归原作者或原刊登方所有。本文为非官方译本;如有不妥,请联系删除。