Skip to content

可扩展性与弹性

LangGraph 平台旨在根据您的工作负载进行水平扩展。服务的每个实例都是无状态的,并且不会在内存中保留任何资源。该服务设计为能够优雅地处理新增或移除实例的情况,包括硬性关闭的情形。

服务器可扩展性

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

队列可扩展性

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

弹性

当一个运行任务由队列实例处理时,该队列工作器会在 Redis 中定期记录一个心跳时间戳。

当接收到优雅关闭请求(SIGINT)时,实例将进入关闭模式,此时:

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

如果由于服务器崩溃或基础设施故障导致硬关闭,任何正在进行的运行任务将被内部的清理任务拾取。该清理任务会查找那些超出心跳窗口的进行中的运行任务。清理任务每 2 分钟运行一次,并将这些运行任务重新放入队列,供其他实例拾取。

Postgres 韧性

在我们管理 Postgres 数据库的部署模式中,我们有定期备份和持续复制的备用副本以实现自动故障转移。这种 Postgres 配置仅适用于 Cloud SaaS 部署选项 中的 Production 部署类型

与 Postgres 的所有通信都实现了对可重试错误的重试机制。如果 Postgres 暂时不可用,例如在数据库重启期间,大部分或全部流量应该仍能成功。Postgres 的长时间故障将导致 LangGraph Server 不可用。

Redis 韧性

所有需要持久化存储的数据都存储在 Postgres 中,而不是 Redis。Redis 仅用于临时元数据和实例之间的通信。因此,我们对 Redis 不做持久性要求。

与 Redis 的所有通信都实现了可重试错误的重试机制。如果 Redis 临时不可用,例如在数据库重启期间,大部分/所有流量应该仍然能够成功。如果 Redis 出现长时间故障,将导致 LangGraph Server 不可用。