---
title: "我们如何微调 RPC 以提升速度和可靠性"
description: "我们将大体积 RPC 响应的压缩迁移到服务链路中更合适的层级，降低了高负载调用的 P95 延迟，并减少了连接抖动。"
---

# 我们如何微调 RPC 以提升速度和可靠性

<ImageBlock
  src="https://media.alchemy.com/blog/how-we-fine-tune-our-rpc-for-speed-and-reliability.png"
  alt="为提升速度微调 RPC"
  width={1024}
  height={480}
  priority
/>

我们非常重视[性能](https://www.alchemy.com/benchmarks)，并持续进行微调以进一步优化我们的平台。我们最近改变了平台压缩大型 RPC 响应的方式，其中一部分改动对 Worldchain 产生了超出预期的影响。大型调用的压缩响应现在返回速度提升了约 33%，这意味着更快的全区块读取和其他重负载调用、更稳定的性能，以及更充裕的空间来应对流量增长。

## 什么是 GOAWAY 帧？

如果你在 HTTP/2 上运行高吞吐量的工作负载，即使从未查过资料，你也一定见过 GOAWAY 帧。GOAWAY 是服务器发给客户端、告知其停止在某个连接上打开新流的信号，通常是因为服务器正在卸载负载。对客户端来说，一波 GOAWAY 表现为连接抖动：流被中断，请求在新连接上重试，尾部延迟随之上升。

更少的 GOAWAY 意味着[更稳定的连接](https://www.alchemy.com/blog/how-alchemys-node-infrastructure-keeps-defi-fast-at-scale)、更少的重试和更快的服务。所以当某个客户的 GOAWAY 数量骤降时，说明上游某处的空间突然变得充裕了。在这个案例中，那个"某处"就是 CPU。

## 压缩原来在哪里进行

我们返回的每个 RPC 响应在离开我们的网络之前都可以被压缩。大多数 HTTP 客户端通过发送 `Accept-Encoding: gzip` 头来请求压缩，而大多数 Web 服务器，包括我们自己的 [node-gateway](https://www.alchemy.com/blog/migrate-self-hosted-nodes-dedicated-infrastructure)，都会自动遵循这个头。这不是我们专门构建的特殊功能，而是标准行为。对于大型负载，比如全区块读取或大型 [`eth_getLogs`](https://www.alchemy.com/overviews/rpc-node) 结果集，压缩能显著减少通过网络发送的字节数，这一点很重要，因为互联网带宽是有限的。

长期以来，在 node-gateway 中进行压缩是合理的。Node-gateway 是一个 IO 密集型服务：它的大部分时间都花在等待网络调用上，无论是来自客户还是我们自己的节点，因此它历来都有富余的 CPU。压缩是[CPU 密集型工作](https://www.alchemy.com/overviews/how-dedicated-blockchain-infrastructure-works)，其开销随响应体积增长。在规模化之后，它成了网关中最繁忙、对延迟最敏感的任务之一，与网关路由和处理每个请求所需的 CPU 争抢资源。

当网关负载过高时，它所做的一切都会同时变慢。而负载下网关的 CPU 压力，正是触发连接卸载和 GOAWAY 帧的条件。

## 我们改动了什么？

我们把数据压缩的执行位置从 node-gateway 迁移到了服务网格中的 Istio 代理上。node-gateway 不再压缩响应。这项工作现在发生在另一个步骤中，由更适合它的基础设施——Istio 代理来完成。这样 Alchemy 的 node-gateway 可以专注优化速度和可靠性，而压缩步骤则由 Istio 来处理。

最终结果是：客户得到的仍是相同的压缩响应，只是在能更高效完成这项工作的地方生成，不再与决定性能的那一跳争抢资源。技术栈不变，输出不变，只是执行位置更合理了。

## 这对你意味着什么？

大型调用的压缩响应现在返回速度提升了约 33%（P95 延迟改善了约 35%）。具体可以拆解为三点。

**更稳定的连接。** 当处理你请求的那一跳不再为 CPU 而争抢时，它就不会再卸载负载，因此你会看到更少的 GOAWAY、更少的流中断、更少的被迫重试。这正是 Worldchain 观察到的情况：连接错误从每小时约 1,500 次降到约 100 次。

**重负载调用响应更快。** 在 Istio 代理上处理压缩，让大型响应的首字节能更早发出。对于全区块读取或大型 `eth_getLogs` 结果集这类大负载，这意味着响应首个数据块到达前的等待时间更短。

**底层空间更充裕。** 我们在决定你性能的那一跳上释放出了可观的 CPU 容量。这项改进是按请求生效的，因此会随着你流量的增长持续保持效果。你不需要做任何改动就能受益——它已经在你发送的每个请求下运行了。

## 为什么这很重要

一个 RPC 提供商的快速与可靠，大部分体现在你看不见的地方，就像这一跳。一项服务减少了错误的工作、放在了正确的位置，一夜之间就带来了更稳定的连接和更快的响应，而客户那端完全不需要做任何改动。

这只是我们持续改进服务路径工作中的一项改动。[开始在 Alchemy 上构建](https://www.alchemy.com/contact-sales)。
