本周系统设计复习:

  • Kafka vs. RabbitMQ vs. Messaging Middleware vs. Pulsar
  • HTTP2 为什么比 HTTP1 快?
  • 应用幂等性的 6 大场景
  • Netflix 使用缓存留住用户注意力的 4 种方式
  • 日志解析速查表

HTTP2 的关键特性

HTTP2 的关键特性在其中发挥了重要作用。让我们看看它们:

1. 二进制分帧层(Binary Framing Layer)

HTTP2 将消息编码为二进制格式。这允许消息分成称为帧的更小单元,然后通过 TCP 连接发送,从而实现更高效的处理。

2. 多路复用(Multiplexing)

二进制分帧允许完整的请求和响应多路复用。客户端和服务器可以在传输过程中交错帧,并在另一端重新组装它们。

3. 流优先级(Stream Prioritization)

使用流优先级,开发者可以自定义请求或流的相对权重,使服务器为更高优先级的请求发送更多帧。

4. 服务器推送(Server Push)

由于 HTTP2 允许对客户端的请求进行多个并发响应,服务器可以 Along with 请求的页面一起发送额外资源给客户端。

5. HPACK 头部压缩(HPACK Header Compression)

HTTP2 使用称为 HPACK 的特殊压缩算法使多个请求的头部更小,从而节省带宽。

当然,尽管有这些特性,HTTP2 也可能根据确切技术场景而变慢。因此,开发者需要测试和优化事物以最大化 HTTP2 的好处。

幂等性的 6 大应用场景

幂等性在各种场景中至关重要,特别是在操作可能重试或执行多次的情况下。以下是幂等性至关重要的前 6 个用例:

1. RESTful API 请求

我们需要确保重试 API 请求不会导致同一操作的多次执行。实现幂等方法(如 PUT 和 DELETE)以维护一致的资源状态。

2. 支付处理

我们需要确保客户不会因重试或网络问题被多次收费。支付网关通常需要重试交易;幂等性确保只进行一次收费。

3. 订单管理系统

我们需要确保多次提交订单只下一个订单。我们设计安全机制以防止重复库存扣除或更新。

4. 数据库操作

我们需要确保重新应用事务不会改变数据库状态超出初始应用。

5. 用户账户管理

我们需要确保重试注册请求不会创建多个用户账户。此外,我们需要确保多次密码重置请求导致单个重置操作。

6. 分布式系统和消息

我们需要确保从队列重新处理消息不会导致重复处理。我们实现可以多次处理同一消息而无副作用的处理程序。

Netflix 使用缓存的 4 种方式

Netflix 的目标是让你尽可能长时间流媒体播放。但用户的典型注意力持续时间只有 90 秒。

他们使用 EVCache(分布式键值存储)减少延迟,这样用户不会失去兴趣。

然而,EVCache 在 Netflix 有多种用例。

1. 旁路缓存(Lookaside Cache)

当应用需要一些数据时,它首先尝试 EVCache 客户端,如果数据不在缓存中,它去后端服务和 Cassandra 数据库获取数据。服务还保持缓存更新以供未来请求。

2. 瞬态数据存储(Transient Data Store)

Netflix 使用 EVCache 跟踪瞬态数据,如播放会话信息。一个应用服务可能开始会话,而另一个可能更新会话,最后会话关闭。

3. 主存储(Primary Store)

Netflix 每晚运行大规模预计算系统,为每个用户的每个资料计算全新的主页,基于观看历史和推荐。所有这些数据写入 EVCache 集群,在线服务从那里读取数据并构建主页。

4. 高容量数据(High Volume Data)

Netflix 有高访问量的数据,也需要高可用。例如,Netflix 主页上显示的 UI 字符串和翻译。单独的进程异步计算并发布 UI 字符串到 EVCache,应用可以从那里低延迟和高可用地读取它。

日志解析速查表

下图列出了前 6 个日志解析命令。

  1. GREP:GREP 搜索任何给定输入文件,选择一个或多个模式匹配的行。
  2. CUT:CUT 从每个文件的每行中切出选定部分,并将它们写入标准输出。
  3. SED:SED 读取指定文件,修改由命令列表指定的输入。
  4. AWK:AWK 扫描每个输入文件以匹配任何模式集的行。
  5. SORT:SORT 按行排序文本和二进制文件。
  6. UNIQ:UNIQ 读取指定输入文件,比较相邻行,并将每个唯一输入行的副本写入输出文件。

这些命令通常组合使用以快速从日志文件中找到有用信息。例如,以下命令列出 xxService 发生异常时的时间戳(第 2 列)。

Terminal window
grep "xxService" service.log | grep "Exception" | cut -d" " -f 2

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

原文链接:EP117: What makes HTTP2 faster than HTTP1?

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