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 服务不可用。