Logo
新用户订阅 RPC,首月享 6.5 折优惠查看优惠
OnFinality Learn
基础设施与运维阅读约 10 分钟

Alchemy 节点:架构、运维与节点访问评估方法

一份技术指南,介绍 Alchemy 节点层的工作原理、如何连接与验证,以及如何衡量托管节点访问是否适合你的工作负载。

TL;DR

Alchemy 节点是通过 HTTP 和 WebSocket RPC 端点暴露的托管区块链节点,外层包裹着 Alchemy 以 Supernode 为名推广的路由和缓存层。你不需要运维节点进程;你需要运维的是客户端、API 密钥以及发往端点的请求模式。本文解释了心智模型,展示了可运行的连接与验证代码,并提供了一种可复现的方法来测量延迟、错误率和一致性,以便你判断托管节点访问是否适合你的工作负载。具体提供商的选择留给 RPC Assistant;本文的重点是如何理解和测试你使用的节点层。

Alchemy 节点究竟是什么

当开发者说“Alchemy 节点”时,他们通常指的是 Alchemy 为某条链暴露的 RPC 端点,而不是一台可以 SSH 登录的虚拟机。Alchemy 运行底层节点软件,保持其同步,并在前端部署一个路由层来处理负载均衡、缓存和故障转移。你的应用向包含 API 密钥的 HTTPS 或 WSS URL 发送 JSON-RPC 请求,Alchemy 返回响应。

这是一种托管节点模式,而非自托管模式。你控制客户端、密钥、请求量和方法组合。你不控制节点二进制文件、同步状态、对等节点集合或升级计划。这种取舍是决策的核心:你用运维控制权换取运维负担的降低。

Alchemy 还在原始节点访问之上叠加了更高级的产品,例如增强数据 API、webhooks 和账户抽象工具。这些与节点层是分开的。本文聚焦于节点/RPC 层,因为大多数“alchemy nodes”搜索真正关心的就是这个层面。

  • 托管节点:Alchemy 运行并同步节点软件。
  • RPC 接口:HTTP POST 用于请求/响应,WebSocket 用于订阅。
  • 密钥作用域端点:URL 中嵌入的 API 密钥标识你的项目。
  • 路由层:请求可能由不同的后端节点处理,这对一致性测试很重要。

假设与前提条件

本指南假设你拥有 Alchemy 账户、为特定链创建的项目以及 API 密钥。它还假设你可以在本地运行 curl 以及 Node.js 或 Python。你应该了解打算调用的 JSON-RPC 方法,因为 Alchemy 的端点接受标准方法以及一些增强方法。

如果你尚未选择提供商,或者正在跨链比较托管节点选项,请先阅读 RPC Assistant 关于为 Web3 项目选择 RPC 提供商的指南以及更广泛的 RPC 端点指南。那些页面处理端点选择问题;本页处理运维和测量问题。

  • 一个限定于单条链的 Alchemy 项目(例如以太坊主网)。
  • 一个对你计划调用的方法有权限的 API 密钥。
  • curl 以及 Node.js 18+ 或 Python 3.10+ 用于验证脚本。
  • 一个在源代码管理之外存储密钥的地方,例如环境变量。

心智模型:请求经过托管节点的路径

发往 Alchemy 节点的请求会经过多个层。你的客户端构建 JSON-RPC 负载并发送到 HTTPS 端点。Alchemy 的边缘节点终止 TLS、验证密钥,并将请求路由到已同步到所请求区块标签的后端节点。响应沿相同路径返回。

由此产生两个后果。第一,由于请求可能由不同的后端节点处理,在 latest 处的读取可能落到比另一个节点落后一两个区块的节点上。第二,由于缓存可能服务重复读取,缓存命中可能比缓存未命中更快,并且可能返回稍旧的结果。两者都不是缺陷;它们都是分布式托管层的特性,你应该测量而非假设。

对于写入,情况不同。交易提交会广播到网络,你收到的响应是确认收到,而非最终确认。确认需要轮询收据或订阅日志。将节点层视为交易的传输通道,而非最终性的来源。

  • 读取:经过路由,可能被缓存,可能由稍有滞后的后端处理。
  • 写入:广播并确认收到,稍后通过收据或订阅确认。
  • 订阅:WebSocket 连接可能被重新平衡;处理重连。
  • 区块标签:latest 变化最大;固定区块号更具可复现性。

使用 curl 连接与验证

确认 Alchemy 节点端点可用的最快方式是进行一次 JSON-RPC 调用。将 RPC_URL 替换为你完整的 Alchemy HTTPS URL,包括 API 密钥路径段。不要将真实 URL 提交到代码仓库。

成功的响应会返回一个包含 jsonrpc、id 和 result 的 JSON 对象。如果你看到的是错误对象,问题通常是密钥、链或方法,而不是网络。

  • 预期结果:一个十六进制区块号,例如 "0x..."。
  • 如果收到 401 或认证错误,说明密钥错误或缺少权限。
  • 如果收到 -32601,说明该链或套餐不支持该方法。
export RPC_URL="https://<your-chain>.g.alchemy.com/v2/<your-api-key>"

curl -sS -X POST "$RPC_URL" \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'

Node.js 中的可运行验证脚本

单次调用证明连通性。一个小脚本证明一致性。下面的脚本多次采样 eth_blockNumber 和 eth_getBlockByNumber,记录观察到的区块高度和首字节时间,并打印摘要。它不假设任何特定延迟;它报告所见内容。

针对你的端点运行它并保留输出。该输出是你日后比较的基线,也是与评估的任何替代节点提供商比较的基线。

  • 预期结果:一个样本表格以及最小和最大高度之间的小幅差异。
  • 样本间差异较大,表明请求被路由到处于不同同步点的后端。
  • ms 列数值高且波动大,表明网络或边缘延迟值得调查。
const RPC_URL = process.env.RPC_URL;
const SAMPLES = 10;

async function call(method, params) {
  const start = performance.now();
  const res = await fetch(RPC_URL, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params })
  });
  const ms = performance.now() - start;
  const body = await res.json();
  return { ms, status: res.status, body };
}

(async () => {
  const rows = [];
  for (let i = 0; i < SAMPLES; i++) {
    const r = await call('eth_blockNumber', []);
    rows.push({ i, ms: Math.round(r.ms), status: r.status, block: r.body.result });
  }
  console.table(rows);
  const heights = rows.map(r => parseInt(r.block, 16));
  console.log('min height', Math.min(...heights), 'max height', Math.max(...heights));
})();

测量延迟、错误和一致性

托管节点质量有三个可测量的维度:延迟、错误率和一致性。延迟是一次调用耗时。错误率是调用因传输或 JSON-RPC 错误而失败的频率。一致性是在同一区块标签下重复读取结果的一致程度。你应该测量所有三个维度,因为提供商可能很快,但仍返回不一致的读取结果。

使用以下流程并将结果记录在表格中。不要填写你未测量的数字。表格是模板;数值来自你自己的运行结果。

  • 至少运行 100 次连续的 eth_blockNumber 调用,记录 p50 和 p95 延迟。
  • 运行 100 次固定到某个区块的 eth_getBlockByNumber 调用,确认结果完全相同。
  • 在 latest 处运行 50 次 eth_getBalance 调用,记录出现多少个不同的值。
  • 注入一个格式错误的请求,确认端点返回 JSON-RPC 错误,而不是挂起。
  • 在一天中的不同时间重复整个运行,观察昼夜变化。

排查常见的 Alchemy 节点故障

大多数故障可归为几类。认证失败意味着密钥错误、被撤销或作用域为不同的链。方法未找到错误意味着该链或套餐不暴露该方法。速率限制响应意味着你超出了套餐的请求预算。超时通常意味着请求从未到达健康的后端,或者客户端过早放弃。

对于 WebSocket 订阅,最常见的故障是客户端未重连的断开连接。始终实现带退避的重连,并在重连后重新订阅。对于交易提交,最常见的故障是将提交确认收到当作最终确认;应改为轮询收据。

  • 401/403:轮换密钥,确认项目的链,确认方法权限。
  • -32601:对照该链支持的方法集检查该方法。
  • 429:退避,尽可能批量处理,或升级套餐。
  • 超时:设置明确的客户端超时并记录请求 ID。
  • WebSocket 断开:使用指数退避重连并重新订阅。

托管节点访问的局限与取舍

托管节点消除了运维工作,但增加了依赖。你依赖提供商的正常运行时间、同步健康度、方法覆盖范围和定价模式。你还依赖其路由行为,这可能使 latest 处的读取比你控制的单个自托管节点更不确定。

自托管让你控制节点二进制文件、对等节点集合和数据目录,但需要投入工程时间进行同步、升级、监控和事件响应。对许多团队来说,托管模式在总成本上胜出;对于有严格确定性或数据驻留要求的团队,自托管或专用单租户节点可能胜出。OnFinality 的专用节点服务是需要单租户基础设施的团队的一个选择,而区块链节点托管指南更深入地介绍了运维取舍。

定价是另一个取舍。托管节点套餐通常按请求或计算单位计费,因此大量小调用的工作负载可能比少量大调用的工作负载成本更高。在承诺高流量设计之前,请查看 RPC 定价模型。

  • 托管:运维负担较低,对提供商行为的依赖较高。
  • 自托管:控制力较高,运维成本较高。
  • 专用:单租户隔离,通常定价高于共享托管节点。
  • 计量定价:设计请求模式时考虑成本。

在 Alchemy 节点与替代方案之间选择

如果你的工作负载是在受支持的链上进行标准 JSON-RPC 读写,Alchemy 节点是合理的默认选择,上述验证流程会告诉你它们是否满足你的延迟和一致性需求。如果你的工作负载依赖于 Alchemy 不支持的链,或它不暴露的方法,你需要替代方案。

对于具体的端点和提供商建议,请使用 RPC Assistant 而非本文。相关的起点包括多链 RPC 端点指南、以太坊 RPC API 概览和 Solana RPC 提供商指南。对于网络特定细节,支持的网络目录列出了各链及其特性。

  • 标准 EVM 读写:用上述脚本验证,然后决定。
  • 不支持的链或方法:评估替代提供商。
  • 严格确定性:考虑固定区块标签或专用节点。
  • 高流量:根据请求组合建模成本。

后续步骤:从验证到生产

一旦验证运行通过,就转向生产加固。将 API 密钥放入密钥管理器,而不是客户端代码。为瞬时错误添加带退避的重试,但不要盲目重试非幂等写入。记录请求 ID,以便将故障与提供商支持关联。对错误率和 p95 延迟设置告警,以便在用户之前发现性能下降。

最后,定期重新运行测量流程。托管节点行为会随提供商升级基础设施而变化,六个月前的基线可能无法描述今天的端点。保留表格,更新它,让数据驱动你的提供商决策。

  • 将密钥存储在密钥管理器中并定期轮换。
  • 对幂等读取使用退避重试;通过轮询收据处理写入。
  • 对错误率和 p95 延迟设置告警。
  • 每季度或在提供商变更后重新运行测量表格。

永远不用担心基础设施

OnFinality 消除了 DevOps 的繁重工作,让您能够更聪明、更快地构建。

开始