跳到内容

LangGraph 平台:可扩展性与弹性

LangGraph 平台旨在随着您的工作负载进行水平扩展。服务的每个实例都是无状态的,并且不将资源保存在内存中。该服务旨在优雅地处理新实例的添加或移除,包括硬关机情况。

服务器可扩展性

当您向服务添加更多实例时,只要在它们前面放置适当的负载均衡机制,它们就会分担 HTTP 负载。在大多数部署模式中,我们会为服务自动配置负载均衡器。在“不带控制平面的自托管”模式中,您有责任添加负载均衡器。由于实例是无状态的,因此任何负载均衡策略都有效,不需要或不建议使用会话粘性。任何服务器实例都可以(通过 Redis PubSub)与任何队列实例通信,这意味着取消或流式传输正在进行的运行的请求可以由任何任意实例处理。

队列可扩展性

当您向服务添加更多实例时,它们将线性地提高运行吞吐量,因为每个实例都配置为处理一定数量的并发运行(默认情况下为 10 个)。每个运行的每次尝试都将由单个实例处理,并通过 Postgres 的 MVCC 模型强制执行恰好一次的语义(有关崩溃弹性详情,请参阅以下部分)。由于瞬态数据库错误而失败的尝试最多会重试 3 次。我们不使用长事务或锁,这使我们能够更有效地利用 Postgres 资源。

弹性

当运行正在由队列实例处理时,该队列工作进程将在 Redis 中记录周期性的心跳时间戳。

当收到优雅关机请求 (SIGINT) 时,实例进入关机模式,这会

  • 停止接受新的 HTTP 请求
  • 给予任何正在进行的运行有限的秒数来完成(如果未完成,它将被放回队列中)
  • 阻止实例从队列中获取更多运行

如果发生硬关机,例如由于服务器崩溃或基础设施故障,任何正在进行的运行都将被定期扫描任务拾取,该任务会查找已超出其心跳窗口的正在进行的运行,并将其放回队列中,以便另一个实例拾取它们。

Postgres 弹性

对于我们管理 Postgres 数据库的部署模式,我们有定期备份、持续复制的备用副本用于自动故障转移。可选地,根据请求,我们还可以设置只读副本以及其他高级故障转移功能。

与 Postgres 的所有通信都为可重试错误实施了重试。如果 Postgres 暂时不可用,例如在数据库重启期间,大多数/所有流量应继续成功。Postgres 实例的长时间故障会将流量切换到故障转移副本。如果故障转移副本在主副本恢复在线之前也发生故障,则服务将变得不可用。

Redis 弹性

所有需要持久存储的数据都存储在 Postgres 中,而不是 Redis 中。Redis 仅用于临时元数据和实例之间的通信。有关我们如何使用 Redis 的更多详细信息,请参阅架构页面。因此,我们对 Redis 没有持久性要求。

与 Redis 的所有通信都为可重试错误实施了重试。如果 Redis 暂时不可用,例如在数据库重启期间,大多数/所有流量应继续成功。Redis 的长时间故障将导致 LGP 服务不可用。

评论